From df270ca6cdefde229ea32f1e9668710b03457a57 Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Thu, 24 Oct 2024 18:12:51 -0400 Subject: [PATCH 001/135] [Response Ops][Alerting] Do not copy latest rule configuration into recovered alerts. (#195946) --- .../alerts_client/alerts_client.test.ts | 15 ++---- .../lib/build_recovered_alert.test.ts | 47 +++++++++++++++---- .../lib/build_recovered_alert.ts | 4 +- .../lib/build_updated_recovered_alert.test.ts | 18 ++++++- .../lib/build_updated_recovered_alert.ts | 3 -- 5 files changed, 61 insertions(+), 26 deletions(-) diff --git a/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts b/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts index 17de8063884fa..36bf830e47f74 100644 --- a/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/alerts_client.test.ts @@ -60,7 +60,7 @@ import { LogAlertsOpts, } from './types'; import { legacyAlertsClientMock } from './legacy_alerts_client.mock'; -import { keys, range } from 'lodash'; +import { keys, omit, range } from 'lodash'; import { alertingEventLoggerMock } from '../lib/alerting_event_logger/alerting_event_logger.mock'; import { ruleRunMetricsStoreMock } from '../lib/rule_run_metrics_store.mock'; import { expandFlattenedAlert } from './lib'; @@ -79,6 +79,7 @@ import { MaintenanceWindow } from '../application/maintenance_window/types'; import { maintenanceWindowsServiceMock } from '../task_runner/maintenance_windows/maintenance_windows_service.mock'; import { getMockMaintenanceWindow } from '../data/maintenance_window/test_helpers'; import { KibanaRequest } from '@kbn/core/server'; +import { rule } from './lib/test_fixtures'; const date = '2023-03-28T22:27:28.159Z'; const startedAtDate = '2023-03-28T13:00:00.000Z'; @@ -1107,11 +1108,13 @@ describe('Alerts Client', () => { kibana: { alert: { instance: { id: '1' }, + rule: omit(rule, 'execution'), uuid: 'abc', }, }, [TIMESTAMP]: date, [ALERT_RULE_EXECUTION_TIMESTAMP]: date, + [ALERT_RULE_EXECUTION_UUID]: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', [EVENT_ACTION]: 'close', [ALERT_ACTION_GROUP]: 'recovered', [ALERT_CONSECUTIVE_MATCHES]: 0, @@ -1120,16 +1123,6 @@ describe('Alerts Client', () => { [ALERT_FLAPPING_HISTORY]: [true, true], [ALERT_MAINTENANCE_WINDOW_IDS]: [], [ALERT_PREVIOUS_ACTION_GROUP]: 'default', - [ALERT_RULE_CATEGORY]: 'My test rule', - [ALERT_RULE_CONSUMER]: 'bar', - [ALERT_RULE_EXECUTION_UUID]: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', - [ALERT_RULE_NAME]: 'rule-name', - [ALERT_RULE_PARAMETERS]: { bar: true }, - [ALERT_RULE_PRODUCER]: 'alerts', - [ALERT_RULE_REVISION]: 0, - [ALERT_RULE_TYPE_ID]: 'test.rule-type', - [ALERT_RULE_TAGS]: ['rule-', '-tags'], - [ALERT_RULE_UUID]: '1', [ALERT_SEVERITY_IMPROVING]: true, [ALERT_START]: '2023-03-28T12:27:28.159Z', [ALERT_END]: date, diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.test.ts b/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.test.ts index c63543b99232d..d380b74660faa 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.test.ts @@ -31,12 +31,15 @@ import { ALERT_RULE_EXECUTION_TIMESTAMP, ALERT_PREVIOUS_ACTION_GROUP, ALERT_SEVERITY_IMPROVING, + ALERT_RULE_EXECUTION_UUID, } from '@kbn/rule-data-utils'; import { alertRule, existingFlattenedActiveAlert, existingExpandedActiveAlert, + rule, } from './test_fixtures'; +import { omit } from 'lodash'; for (const flattened of [true, false]) { const existingAlert = flattened ? existingFlattenedActiveAlert : existingExpandedActiveAlert; @@ -63,9 +66,10 @@ for (const flattened of [true, false]) { kibanaVersion: '8.9.0', }) ).toEqual({ - ...alertRule, [TIMESTAMP]: '2023-03-29T12:27:28.159Z', [ALERT_RULE_EXECUTION_TIMESTAMP]: '2023-03-29T12:27:28.159Z', + // @ts-ignore + [ALERT_RULE_EXECUTION_UUID]: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', [EVENT_ACTION]: 'close', [ALERT_ACTION_GROUP]: 'recovered', [ALERT_CONSECUTIVE_MATCHES]: 0, @@ -80,11 +84,13 @@ for (const flattened of [true, false]) { [ALERT_START]: '2023-03-28T12:27:28.159Z', [ALERT_END]: '2023-03-30T12:27:28.159Z', [ALERT_TIME_RANGE]: { gte: '2023-03-28T12:27:28.159Z', lte: '2023-03-30T12:27:28.159Z' }, + // @ts-ignore [SPACE_IDS]: ['default'], [VERSION]: '8.9.0', [TAGS]: ['rule-', '-tags'], ...(flattened ? { + ...alertRule, [EVENT_KIND]: 'signal', [ALERT_INSTANCE_ID]: 'alert-A', [ALERT_UUID]: 'abcdefg', @@ -96,6 +102,7 @@ for (const flattened of [true, false]) { kibana: { alert: { instance: { id: 'alert-A' }, + rule: omit(rule, 'execution'), uuid: 'abcdefg', }, }, @@ -103,7 +110,7 @@ for (const flattened of [true, false]) { }); }); - test('should return alert document with recovery status and updated rule data if rule definition has changed', () => { + test('should return alert document with recovery status and but not update rule data if rule definition has changed', () => { const legacyAlert = new LegacyAlert<{}, {}, 'default'>('alert-A', { meta: { uuid: 'abcdefg' }, }); @@ -131,9 +138,10 @@ for (const flattened of [true, false]) { kibanaVersion: '8.9.0', }) ).toEqual({ - ...updatedRule, [TIMESTAMP]: '2023-03-29T12:27:28.159Z', [ALERT_RULE_EXECUTION_TIMESTAMP]: '2023-03-29T12:27:28.159Z', + // @ts-ignore + [ALERT_RULE_EXECUTION_UUID]: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', [EVENT_ACTION]: 'close', [ALERT_ACTION_GROUP]: 'NoLongerActive', [ALERT_CONSECUTIVE_MATCHES]: 0, @@ -148,11 +156,13 @@ for (const flattened of [true, false]) { [ALERT_START]: '2023-03-28T12:27:28.159Z', [ALERT_END]: '2023-03-30T12:27:28.159Z', [ALERT_TIME_RANGE]: { gte: '2023-03-28T12:27:28.159Z', lte: '2023-03-30T12:27:28.159Z' }, + // @ts-ignore [SPACE_IDS]: ['default'], [VERSION]: '8.9.0', [TAGS]: ['rule-', '-tags'], ...(flattened ? { + ...alertRule, [EVENT_KIND]: 'signal', [ALERT_INSTANCE_ID]: 'alert-A', [ALERT_UUID]: 'abcdefg', @@ -164,6 +174,7 @@ for (const flattened of [true, false]) { kibana: { alert: { instance: { id: 'alert-A' }, + rule: omit(rule, 'execution'), uuid: 'abcdefg', }, }, @@ -226,12 +237,13 @@ for (const flattened of [true, false]) { kibanaVersion: '8.9.0', }) ).toEqual({ - ...alertRule, count: 2, url: `https://url2`, 'kibana.alert.nested_field': 2, [TIMESTAMP]: '2023-03-29T12:27:28.159Z', [ALERT_RULE_EXECUTION_TIMESTAMP]: '2023-03-29T12:27:28.159Z', + // @ts-ignore + [ALERT_RULE_EXECUTION_UUID]: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', [EVENT_ACTION]: 'close', [ALERT_ACTION_GROUP]: 'NoLongerActive', [ALERT_CONSECUTIVE_MATCHES]: 0, @@ -246,11 +258,13 @@ for (const flattened of [true, false]) { [ALERT_START]: '2023-03-28T12:27:28.159Z', [ALERT_END]: '2023-03-30T12:27:28.159Z', [ALERT_TIME_RANGE]: { gte: '2023-03-28T12:27:28.159Z', lte: '2023-03-30T12:27:28.159Z' }, + // @ts-ignore [SPACE_IDS]: ['default'], [VERSION]: '8.9.0', [TAGS]: ['rule-', '-tags'], ...(flattened ? { + ...alertRule, [EVENT_KIND]: 'signal', [ALERT_INSTANCE_ID]: 'alert-A', [ALERT_UUID]: 'abcdefg', @@ -262,6 +276,7 @@ for (const flattened of [true, false]) { kibana: { alert: { instance: { id: 'alert-A' }, + rule: omit(rule, 'execution'), uuid: 'abcdefg', }, }, @@ -291,9 +306,10 @@ for (const flattened of [true, false]) { kibanaVersion: '8.9.0', }) ).toEqual({ - ...alertRule, [TIMESTAMP]: '2023-03-29T12:27:28.159Z', [ALERT_RULE_EXECUTION_TIMESTAMP]: '2030-12-15T02:44:13.124Z', + // @ts-ignore + [ALERT_RULE_EXECUTION_UUID]: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', [EVENT_ACTION]: 'close', [ALERT_ACTION_GROUP]: 'recovered', [ALERT_CONSECUTIVE_MATCHES]: 0, @@ -308,11 +324,13 @@ for (const flattened of [true, false]) { [ALERT_START]: '2023-03-28T12:27:28.159Z', [ALERT_END]: '2023-03-30T12:27:28.159Z', [ALERT_TIME_RANGE]: { gte: '2023-03-28T12:27:28.159Z', lte: '2023-03-30T12:27:28.159Z' }, + // @ts-ignore [SPACE_IDS]: ['default'], [VERSION]: '8.9.0', [TAGS]: ['rule-', '-tags'], ...(flattened ? { + ...alertRule, [EVENT_KIND]: 'signal', [ALERT_INSTANCE_ID]: 'alert-A', [ALERT_UUID]: 'abcdefg', @@ -324,6 +342,7 @@ for (const flattened of [true, false]) { kibana: { alert: { instance: { id: 'alert-A' }, + rule: omit(rule, 'execution'), uuid: 'abcdefg', }, }, @@ -394,12 +413,13 @@ for (const flattened of [true, false]) { kibanaVersion: '8.9.0', }) ).toEqual({ - ...alertRule, count: 2, url: `https://url2`, 'kibana.alert.nested_field': 2, [TIMESTAMP]: '2023-03-29T12:27:28.159Z', [ALERT_RULE_EXECUTION_TIMESTAMP]: '2023-03-29T12:27:28.159Z', + // @ts-ignore + [ALERT_RULE_EXECUTION_UUID]: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', [EVENT_ACTION]: 'close', [ALERT_ACTION_GROUP]: 'NoLongerActive', [ALERT_CONSECUTIVE_MATCHES]: 0, @@ -414,11 +434,13 @@ for (const flattened of [true, false]) { [ALERT_START]: '2023-03-28T12:27:28.159Z', [ALERT_END]: '2023-03-30T12:27:28.159Z', [ALERT_TIME_RANGE]: { gte: '2023-03-28T12:27:28.159Z', lte: '2023-03-30T12:27:28.159Z' }, + // @ts-ignore [SPACE_IDS]: ['default'], [VERSION]: '8.9.0', [TAGS]: ['-tags', 'reported-recovery-tag', 'active-alert-tag', 'rule-'], ...(flattened ? { + ...alertRule, [EVENT_KIND]: 'signal', [ALERT_INSTANCE_ID]: 'alert-A', [ALERT_UUID]: 'abcdefg', @@ -430,6 +452,7 @@ for (const flattened of [true, false]) { kibana: { alert: { instance: { id: 'alert-A' }, + rule: omit(rule, 'execution'), uuid: 'abcdefg', }, }, @@ -498,12 +521,13 @@ for (const flattened of [true, false]) { kibanaVersion: '8.9.0', }) ).toEqual({ - ...alertRule, count: 2, url: `https://url2`, 'kibana.alert.nested_field': 2, [TIMESTAMP]: '2023-03-29T12:27:28.159Z', [ALERT_RULE_EXECUTION_TIMESTAMP]: '2023-03-29T12:27:28.159Z', + // @ts-ignore + [ALERT_RULE_EXECUTION_UUID]: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', [EVENT_ACTION]: 'close', [ALERT_ACTION_GROUP]: 'NoLongerActive', [ALERT_CONSECUTIVE_MATCHES]: 0, @@ -518,11 +542,13 @@ for (const flattened of [true, false]) { [ALERT_START]: '2023-03-28T12:27:28.159Z', [ALERT_END]: '2023-03-30T12:27:28.159Z', [ALERT_TIME_RANGE]: { gte: '2023-03-28T12:27:28.159Z', lte: '2023-03-30T12:27:28.159Z' }, + // @ts-ignore [SPACE_IDS]: ['default'], [VERSION]: '8.9.0', [TAGS]: ['rule-', '-tags'], ...(flattened ? { + ...alertRule, [EVENT_KIND]: 'signal', [ALERT_INSTANCE_ID]: 'alert-A', [ALERT_UUID]: 'abcdefg', @@ -534,6 +560,7 @@ for (const flattened of [true, false]) { kibana: { alert: { instance: { id: 'alert-A' }, + rule: omit(rule, 'execution'), uuid: 'abcdefg', }, }, @@ -601,12 +628,13 @@ for (const flattened of [true, false]) { }, }) ).toEqual({ - ...alertRule, count: 2, url: `https://url2`, 'kibana.alert.deeply.nested_field': 2, [TIMESTAMP]: '2023-03-29T12:27:28.159Z', [ALERT_RULE_EXECUTION_TIMESTAMP]: '2023-03-29T12:27:28.159Z', + // @ts-ignore + [ALERT_RULE_EXECUTION_UUID]: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', [EVENT_ACTION]: 'close', [ALERT_ACTION_GROUP]: 'NoLongerActive', [ALERT_CONSECUTIVE_MATCHES]: 0, @@ -621,11 +649,13 @@ for (const flattened of [true, false]) { [ALERT_START]: '2023-03-28T12:27:28.159Z', [ALERT_END]: '2023-03-30T12:27:28.159Z', [ALERT_TIME_RANGE]: { gte: '2023-03-28T12:27:28.159Z', lte: '2023-03-30T12:27:28.159Z' }, + // @ts-ignore [SPACE_IDS]: ['default'], [VERSION]: '8.9.0', [TAGS]: ['rule-', '-tags'], ...(flattened ? { + ...alertRule, [EVENT_KIND]: 'signal', [ALERT_INSTANCE_ID]: 'alert-A', [ALERT_UUID]: 'abcdefg', @@ -637,6 +667,7 @@ for (const flattened of [true, false]) { kibana: { alert: { instance: { id: 'alert-A' }, + rule: omit(rule, 'execution'), uuid: 'abcdefg', }, }, diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.ts b/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.ts index bfcea9e29edf6..92328f7fb94f5 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/build_recovered_alert.ts @@ -26,6 +26,7 @@ import { ALERT_RULE_EXECUTION_TIMESTAMP, ALERT_PREVIOUS_ACTION_GROUP, ALERT_SEVERITY_IMPROVING, + ALERT_RULE_EXECUTION_UUID, } from '@kbn/rule-data-utils'; import { DeepPartial } from '@kbn/utility-types'; import { get } from 'lodash'; @@ -86,12 +87,11 @@ export const buildRecoveredAlert = < const refreshableAlertFields = replaceRefreshableAlertFields(alert); const alertUpdates = { - // Set latest rule configuration - ...rule, // Update the timestamp to reflect latest update time [TIMESTAMP]: timestamp, [EVENT_ACTION]: 'close', [ALERT_RULE_EXECUTION_TIMESTAMP]: runTimestamp ?? timestamp, + [ALERT_RULE_EXECUTION_UUID]: rule[ALERT_RULE_EXECUTION_UUID], // Set the recovery action group [ALERT_ACTION_GROUP]: recoveryActionGroup, // Set latest flapping state diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.test.ts b/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.test.ts index eda0b2c4a97e6..3a4151268c8d3 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.test.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.test.ts @@ -28,6 +28,7 @@ import { ALERT_RULE_EXECUTION_TIMESTAMP, ALERT_CONSECUTIVE_MATCHES, ALERT_PREVIOUS_ACTION_GROUP, + ALERT_RULE_EXECUTION_UUID, } from '@kbn/rule-data-utils'; import { alertRule, @@ -161,7 +162,6 @@ describe('buildUpdatedRecoveredAlert', () => { timestamp: '2023-03-29T12:27:28.159Z', }) ).toEqual({ - ...alertRule, event: { action: 'close', kind: 'signal', @@ -177,6 +177,19 @@ describe('buildUpdatedRecoveredAlert', () => { id: 'alert-A', }, maintenance_window_ids: ['maint-x'], + rule: { + category: 'My test rule', + consumer: 'bar', + name: 'rule-name', + parameters: { + bar: true, + }, + producer: 'alerts', + revision: 0, + rule_type_id: 'test.rule-type', + tags: ['rule-', '-tags'], + uuid: '1', + }, start: '2023-03-28T12:27:28.159Z', time_range: { gte: '2023-03-27T12:27:28.159Z', @@ -185,16 +198,17 @@ describe('buildUpdatedRecoveredAlert', () => { uuid: 'abcdefg', consecutive_matches: 0, }, + space_ids: ['default'], version: '8.8.1', }, [TIMESTAMP]: '2023-03-29T12:27:28.159Z', [ALERT_RULE_EXECUTION_TIMESTAMP]: '2023-03-29T12:27:28.159Z', + [ALERT_RULE_EXECUTION_UUID]: '5f6aa57d-3e22-484e-bae8-cbed868f4d28', [ALERT_FLAPPING]: true, [ALERT_FLAPPING_HISTORY]: [false, false, true, true], [ALERT_PREVIOUS_ACTION_GROUP]: 'recovered', [ALERT_STATUS]: 'recovered', [ALERT_WORKFLOW_STATUS]: 'open', - [SPACE_IDS]: ['default'], [TAGS]: ['rule-', '-tags'], }); }); diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.ts b/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.ts index 06972c81e496d..ba1e0c4b5f56a 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/build_updated_recovered_alert.ts @@ -39,7 +39,6 @@ interface BuildUpdatedRecoveredAlertOpts { export const buildUpdatedRecoveredAlert = ({ alert, legacyRawAlert, - rule, runTimestamp, timestamp, }: BuildUpdatedRecoveredAlertOpts): Alert & AlertData => { @@ -50,8 +49,6 @@ export const buildUpdatedRecoveredAlert = ({ const cleanedAlert = omit(alert, ALERT_SEVERITY_IMPROVING); const alertUpdates = { - // Set latest rule configuration - ...rule, // Update the timestamp to reflect latest update time [TIMESTAMP]: timestamp, [ALERT_RULE_EXECUTION_TIMESTAMP]: runTimestamp ?? timestamp, From 54f282288b17a2046fd3740490f92087c057c82d Mon Sep 17 00:00:00 2001 From: "elastic-renovate-prod[bot]" <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Thu, 24 Oct 2024 17:13:03 -0500 Subject: [PATCH 002/135] Update docker.elastic.co/wolfi/chainguard-base:latest Docker digest to 9734313 (main) (#197712) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Update | Change | |---|---|---| | docker.elastic.co/wolfi/chainguard-base | digest | `277ebb4` -> `9734313` | --- ### 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 [Renovate Bot](https://togithub.com/renovatebot/renovate). Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> --- src/dev/build/tasks/os_packages/docker_generator/run.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dev/build/tasks/os_packages/docker_generator/run.ts b/src/dev/build/tasks/os_packages/docker_generator/run.ts index b212d187a2a16..fcc9535d6bbb7 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/run.ts +++ b/src/dev/build/tasks/os_packages/docker_generator/run.ts @@ -51,7 +51,7 @@ export async function runDockerGenerator( */ if (flags.baseImage === 'wolfi') baseImageName = - 'docker.elastic.co/wolfi/chainguard-base:latest@sha256:277ebb42c458ef39cb4028f9204f0b3d51d8cd628ea737a65696a1143c3e42fe'; + 'docker.elastic.co/wolfi/chainguard-base:latest@sha256:973431347ad45f40e01afbbd010bf9de929c088a63382239b90dd84f39618bc8'; let imageFlavor = ''; if (flags.baseImage === 'ubi') imageFlavor += `-ubi`; From d2aa00708309fdf85deb03870f65960ec78161cf Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Thu, 24 Oct 2024 16:44:45 -0600 Subject: [PATCH 003/135] [Security Assistant] Revert open AI Assistant settings in new tab (#197725) --- .../settings_context_menu.tsx | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/settings_context_menu/settings_context_menu.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/settings_context_menu/settings_context_menu.tsx index 62184cb4bbafe..baed2ff4cdb86 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/settings_context_menu/settings_context_menu.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/settings/settings_context_menu/settings_context_menu.tsx @@ -12,7 +12,6 @@ import { EuiContextMenuPanel, EuiContextMenuItem, EuiConfirmModal, - EuiIcon, EuiNotificationBadge, EuiPopover, EuiButtonIcon, @@ -70,7 +69,6 @@ export const SettingsContextMenu: React.FC = React.memo( () => navigateToApp('management', { path: 'kibana/securityAiAssistantManagement', - openInNewTab: true, }), [navigateToApp] ); @@ -84,7 +82,6 @@ export const SettingsContextMenu: React.FC = React.memo( () => navigateToApp('management', { path: `kibana/securityAiAssistantManagement?tab=${KNOWLEDGE_BASE_TAB}`, - openInNewTab: true, }), [navigateToApp] ); @@ -105,13 +102,6 @@ export const SettingsContextMenu: React.FC = React.memo( data-test-subj={'ai-assistant-settings'} > {i18n.AI_ASSISTANT_SETTINGS} - , = React.memo( data-test-subj={'knowledge-base'} > {i18n.KNOWLEDGE_BASE} - , Date: Fri, 25 Oct 2024 00:25:35 +0100 Subject: [PATCH 004/135] skip flaky suite (#192792) --- .../components/steps/step_select_agent_policy.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx index 732dcc36ffd23..8623089e5cb2b 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx @@ -80,7 +80,8 @@ describe('stepStepSelectAgentPolicy', () => { /> )); - describe('with single agent policy', () => { + // FLAKY: https://github.com/elastic/kibana/issues/192792 + describe.skip('with single agent policy', () => { beforeEach(() => { testRenderer = createFleetTestRendererMock(); useMultipleAgentPoliciesMock.mockReturnValue({ canUseMultipleAgentPolicies: false }); From da402ef66d9cbb6727b4d9e4c0c9679e74c36efd Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Fri, 25 Oct 2024 00:25:59 +0100 Subject: [PATCH 005/135] skip flaky suite (#192793) --- .../components/steps/step_select_agent_policy.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx index 8623089e5cb2b..109e9c73bd778 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx @@ -81,6 +81,7 @@ describe('stepStepSelectAgentPolicy', () => { )); // FLAKY: https://github.com/elastic/kibana/issues/192792 + // FLAKY: https://github.com/elastic/kibana/issues/192793 describe.skip('with single agent policy', () => { beforeEach(() => { testRenderer = createFleetTestRendererMock(); From 663a339b3a4937682346d5e762da212c4d4e109a Mon Sep 17 00:00:00 2001 From: Jatin Kathuria Date: Fri, 25 Oct 2024 06:41:35 +0200 Subject: [PATCH 006/135] [Security Solution] Removes obselete Timeline Tour - New Features (#197385) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Handles https://github.com/elastic/kibana/issues/197295 This PR removes the obselete timeline tour which was introduced in `8.12` and may not be relevant now in `8.16`. From the perspective of users directly to `8.16` from `8.11`. I guess it might be okay for users to expect considerable changes that may have happened between `8.11` and `8.16` and a tour might not be necessary 🤷 --- x-pack/plugins/fleet/cypress/tasks/common.ts | 1 - .../security_solution/common/constants.ts | 1 - .../add_to_favorites/index.test.tsx | 17 +-- .../components/add_to_favorites/index.tsx | 58 +++---- .../modal/actions/save_timeline_button.tsx | 2 - .../components/modal/header/index.tsx | 4 +- .../timelines/components/timeline/index.tsx | 32 +--- .../search_or_filter/search_or_filter.tsx | 4 +- .../components/timeline/tour/index.test.tsx | 129 ---------------- .../components/timeline/tour/index.tsx | 142 ------------------ .../components/timeline/tour/step_config.tsx | 98 ------------ .../components/timeline/tour/translations.ts | 92 ------------ .../translations/translations/fr-FR.json | 17 --- .../translations/translations/ja-JP.json | 19 --- .../translations/translations/zh-CN.json | 19 --- 15 files changed, 30 insertions(+), 605 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/tour/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/tour/index.tsx delete mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/tour/step_config.tsx delete mode 100644 x-pack/plugins/security_solution/public/timelines/components/timeline/tour/translations.ts diff --git a/x-pack/plugins/fleet/cypress/tasks/common.ts b/x-pack/plugins/fleet/cypress/tasks/common.ts index de6e117bac4cc..cf161640bf03f 100644 --- a/x-pack/plugins/fleet/cypress/tasks/common.ts +++ b/x-pack/plugins/fleet/cypress/tasks/common.ts @@ -67,7 +67,6 @@ export const internalRequest = ({ const NEW_FEATURES_TOUR_STORAGE_KEYS = { RULE_MANAGEMENT_PAGE: 'securitySolution.rulesManagementPage.newFeaturesTour.v8.9', TIMELINES: 'securitySolution.security.timelineFlyoutHeader.saveTimelineTour', - TIMELINE: 'securitySolution.timeline.newFeaturesTour.v8.12', FLYOUT: 'securitySolution.documentDetails.newFeaturesTour.v8.14', }; diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index d0fb117eafc50..584b992a0f61d 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -422,7 +422,6 @@ export const RULES_TABLE_MAX_PAGE_SIZE = 100; export const NEW_FEATURES_TOUR_STORAGE_KEYS = { RULE_MANAGEMENT_PAGE: 'securitySolution.rulesManagementPage.newFeaturesTour.v8.13', TIMELINES: 'securitySolution.security.timelineFlyoutHeader.saveTimelineTour', - TIMELINE: 'securitySolution.timeline.newFeaturesTour.v8.12', FLYOUT: 'securitySolution.documentDetails.newFeaturesTour.v8.14', }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/add_to_favorites/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/add_to_favorites/index.test.tsx index 54427b25e74ed..8aeec715c9941 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/add_to_favorites/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/add_to_favorites/index.test.tsx @@ -30,10 +30,10 @@ jest.mock('react-redux', () => { }; }); -const renderAddFavoritesButton = (isPartOfGuidedTour = false) => +const renderAddFavoritesButton = () => render( - + ); @@ -87,17 +87,4 @@ describe('AddToFavoritesButton', () => { expect(getByTestId('timeline-favorite-filled-star')).toBeInTheDocument(); expect(queryByTestId('timeline-favorite-empty-star')).not.toBeInTheDocument(); }); - - it('should use id for guided tour if prop is true', () => { - mockGetState.mockReturnValue({ - ...mockTimelineModel, - status: TimelineStatusEnum.active, - }); - - const { getByTestId } = renderAddFavoritesButton(true); - - const button = getByTestId('timeline-favorite-empty-star'); - - expect(button).toHaveProperty('id', 'add-to-favorites'); - }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/add_to_favorites/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/add_to_favorites/index.tsx index c0c89f1e08a2d..3acbbce33ee98 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/add_to_favorites/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/add_to_favorites/index.tsx @@ -13,7 +13,6 @@ import type { State } from '../../../common/store'; import { selectTimelineById } from '../../store/selectors'; import { timelineActions } from '../../store'; import { TimelineStatusEnum } from '../../../../common/api/timeline'; -import { TIMELINE_TOUR_CONFIG_ANCHORS } from '../timeline/tour/step_config'; const ADD_TO_FAVORITES = i18n.translate( 'xpack.securitySolution.timeline.addToFavoriteButtonLabel', @@ -34,46 +33,39 @@ interface AddToFavoritesButtonProps { * Id of the timeline to be displayed in the bottom bar and within the modal */ timelineId: string; - /** - * Whether the button is a step in the timeline guided tour - */ - isPartOfGuidedTour?: boolean; } /** * This component renders the add to favorites button for timeline. * It is used in the bottom bar as well as in the timeline modal's header. */ -export const AddToFavoritesButton = React.memo( - ({ timelineId, isPartOfGuidedTour = false }) => { - const dispatch = useDispatch(); - const { isFavorite, status } = useSelector((state: State) => - selectTimelineById(state, timelineId) - ); +export const AddToFavoritesButton = React.memo(({ timelineId }) => { + const dispatch = useDispatch(); + const { isFavorite, status } = useSelector((state: State) => + selectTimelineById(state, timelineId) + ); - const isTimelineDraftOrImmutable = status !== TimelineStatusEnum.active; - const label = isFavorite ? REMOVE_FROM_FAVORITES : ADD_TO_FAVORITES; + const isTimelineDraftOrImmutable = status !== TimelineStatusEnum.active; + const label = isFavorite ? REMOVE_FROM_FAVORITES : ADD_TO_FAVORITES; - const handleClick = useCallback( - () => dispatch(timelineActions.updateIsFavorite({ id: timelineId, isFavorite: !isFavorite })), - [dispatch, timelineId, isFavorite] - ); + const handleClick = useCallback( + () => dispatch(timelineActions.updateIsFavorite({ id: timelineId, isFavorite: !isFavorite })), + [dispatch, timelineId, isFavorite] + ); - return ( - - {label} - - ); - } -); + return ( + + {label} + + ); +}); AddToFavoritesButton.displayName = 'AddToFavoritesButton'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/modal/actions/save_timeline_button.tsx b/x-pack/plugins/security_solution/public/timelines/components/modal/actions/save_timeline_button.tsx index 523c12223b5c6..de9d35b283517 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/modal/actions/save_timeline_button.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/modal/actions/save_timeline_button.tsx @@ -15,7 +15,6 @@ import { SaveTimelineModal } from './save_timeline_modal'; import * as i18n from './translations'; import { selectTimelineById } from '../../../store/selectors'; import type { State } from '../../../../common/store'; -import { TIMELINE_TOUR_CONFIG_ANCHORS } from '../../timeline/tour/step_config'; export interface SaveTimelineButtonProps { /** @@ -75,7 +74,6 @@ export const SaveTimelineButton = React.memo( data-test-subj="timeline-modal-save-timeline-tooltip" > ( - + ( = ({ description, sessionViewConfig, initialized, - show: isOpen, - isLoading, - activeTab, } = useDeepEqualSelector((state) => pick( [ @@ -112,10 +107,6 @@ const StatefulTimelineComponent: React.FC = ({ ) ); - const { - kibanaSecuritySolutionsPrivileges: { crud: canEditTimeline }, - } = useUserPrivileges(); - const { timelineFullScreen } = useTimelineFullScreen(); useEffect(() => { @@ -205,20 +196,6 @@ const StatefulTimelineComponent: React.FC = ({ const timelineContext = useMemo(() => ({ timelineId }), [timelineId]); const resolveConflictComponent = useResolveConflict(); - const showTimelineTour = isOpen && !isLoading && canEditTimeline; - - const handleSwitchToTab = useCallback( - (tab: TimelineTabs) => { - dispatch( - timelineActions.setActiveTabTimeline({ - id: timelineId, - activeTab: tab, - }) - ); - }, - [timelineId, dispatch] - ); - return ( = ({ /> - {showTimelineTour ? ( - - ) : null} ); }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/search_or_filter.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/search_or_filter.tsx index bd5adf6b38cc4..3ec2a965d8021 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/search_or_filter.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/search_or_filter/search_or_filter.tsx @@ -28,7 +28,6 @@ import { DATA_PROVIDER_HIDDEN_POPULATED, DATA_PROVIDER_VISIBLE, } from './translations'; -import { TIMELINE_TOUR_CONFIG_ANCHORS } from '../tour/step_config'; interface Props { dataProviders: DataProvider[]; @@ -112,7 +111,7 @@ export const SearchOrFilter = React.memo( alignItems="flexStart" responsive={false} > - + @@ -143,7 +142,6 @@ export const SearchOrFilter = React.memo( = {}) => { - return ( - - - {Object.values(TIMELINE_TOUR_CONFIG_ANCHORS).map((anchor) => { - return
; - })} - - ); -}; - -describe('Timeline Tour', () => { - beforeAll(() => { - (useIsElementMounted as jest.Mock).mockReturnValue(true); - }); - - beforeEach(() => { - (useKibana as jest.Mock).mockReturnValue({ - ...mockedUseKibana, - services: { - ...mockedUseKibana.services, - storage: storageMock, - }, - }); - - storageMock.clear(); - }); - - it('should not render tour steps when element are not mounted', () => { - (useIsElementMounted as jest.Mock).mockReturnValueOnce(false); - render(); - expect(screen.queryByTestId('timeline-tour-step-1')).toBeNull(); - }); - - it('should render tour steps when element are mounted', async () => { - render(); - - await waitFor(() => { - expect(screen.getByTestId('timeline-tour-step-1')).toBeVisible(); - }); - - fireEvent.click(screen.getByText('Next')); - await waitFor(() => { - expect(screen.getByTestId('timeline-tour-step-2')).toBeVisible(); - }); - - fireEvent.click(screen.getByText('Next')); - - await waitFor(() => { - expect(screen.getByTestId('timeline-tour-step-3')).toBeVisible(); - }); - - fireEvent.click(screen.getByText('Next')); - - await waitFor(() => { - expect(screen.getByTestId('timeline-tour-step-4')).toBeVisible(); - }); - - fireEvent.click(screen.getByText('Next')); - - await waitFor(() => { - expect(screen.queryByText('Finish tour')).toBeVisible(); - }); - }); - - it('should render different tour steps when timeline type is template', async () => { - render(); - - await waitFor(() => { - expect(screen.getByTestId('timeline-tour-step-1')).toBeVisible(); - }); - - fireEvent.click(screen.getByText('Next')); - await waitFor(() => { - expect(screen.getByTestId('timeline-tour-step-2')).toBeVisible(); - }); - - fireEvent.click(screen.getByText('Next')); - - await waitFor(() => { - expect(screen.getByTestId('timeline-tour-step-3')).toBeVisible(); - }); - - fireEvent.click(screen.getByText('Next')); - - await waitFor(() => { - expect(screen.queryByText('Finish tour')).toBeVisible(); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/index.tsx deleted file mode 100644 index f959e6fe3a47a..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/index.tsx +++ /dev/null @@ -1,142 +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. - */ - -/* - * This timeline tour only valid for 8.12 release is not needed for 8.13 - * - * */ - -import React, { useEffect, useCallback, useState, useMemo } from 'react'; -import { EuiButton, EuiButtonEmpty, EuiTourStep } from '@elastic/eui'; -import type { TimelineType } from '../../../../../common/api/timeline'; -import type { TimelineTabs } from '../../../../../common/types'; -import { useIsElementMounted } from '../../../../detection_engine/rule_management_ui/components/rules_table/rules_table/guided_onboarding/use_is_element_mounted'; -import { NEW_FEATURES_TOUR_STORAGE_KEYS } from '../../../../../common/constants'; -import { useKibana } from '../../../../common/lib/kibana'; -import { timelineTourSteps, tourConfig } from './step_config'; -import * as i18n from './translations'; - -interface TourState { - currentTourStep: number; - isTourActive: boolean; - tourPopoverWidth: number; - tourSubtitle: string; -} - -export interface TimelineTourProps { - activeTab: TimelineTabs; - timelineType: TimelineType; - switchToTab: (tab: TimelineTabs) => void; -} - -const TimelineTourComp = (props: TimelineTourProps) => { - const { activeTab, switchToTab, timelineType } = props; - const { - services: { storage }, - } = useKibana(); - - const updatedTourSteps = useMemo( - () => - timelineTourSteps.filter((step) => !step.timelineType || step.timelineType === timelineType), - [timelineType] - ); - - const [tourState, setTourState] = useState(() => { - const restoredTourState = storage.get(NEW_FEATURES_TOUR_STORAGE_KEYS.TIMELINE); - if (restoredTourState != null) { - return restoredTourState; - } - return tourConfig; - }); - - const finishTour = useCallback(() => { - setTourState((prev) => { - return { - ...prev, - isTourActive: false, - }; - }); - }, []); - - const nextStep = useCallback(() => { - setTourState((prev) => { - return { - ...prev, - currentTourStep: prev.currentTourStep + 1, - }; - }); - }, []); - - useEffect(() => { - storage.set(NEW_FEATURES_TOUR_STORAGE_KEYS.TIMELINE, tourState); - }, [tourState, storage]); - - const getFooterAction = useCallback( - (step: number) => { - // if it's the last step, we don't want to show the next button - return step === updatedTourSteps.length ? ( - - {i18n.TIMELINE_TOUR_FINISH} - - ) : ( - [ - - {i18n.TIMELINE_TOUR_EXIT} - , - - {i18n.TIMELINE_TOUR_NEXT} - , - ] - ); - }, - [finishTour, nextStep, updatedTourSteps.length] - ); - - const nextEl = updatedTourSteps[tourState.currentTourStep - 1]?.anchor; - - const isElementAtCurrentStepMounted = useIsElementMounted(nextEl); - - const currentStepConfig = updatedTourSteps[tourState.currentTourStep - 1]; - - if (currentStepConfig?.timelineTab && currentStepConfig.timelineTab !== activeTab) { - switchToTab(currentStepConfig.timelineTab); - } - - if (!tourState.isTourActive || !isElementAtCurrentStepMounted) { - return null; - } - - return ( - <> - {updatedTourSteps.map((steps, idx) => { - const stepCount = idx + 1; - if (tourState.currentTourStep !== stepCount) return null; - const panelProps = { - 'data-test-subj': `timeline-tour-step-${idx + 1}`, - }; - return ( - - ); - })} - - ); -}; - -export const TimelineTour = React.memo(TimelineTourComp); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/step_config.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/step_config.tsx deleted file mode 100644 index 719a06de6d457..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/step_config.tsx +++ /dev/null @@ -1,98 +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 { EuiText, EuiCode } from '@elastic/eui'; -import React from 'react'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { TimelineTypeEnum } from '../../../../../common/api/timeline'; -import { TimelineTabs } from '../../../../../common/types'; -import * as i18n from './translations'; - -export const TIMELINE_TOUR_CONFIG_ANCHORS = { - ACTION_MENU: 'timeline-action-menu', - DATA_VIEW: 'timeline-data-view', - DATA_PROVIDER: 'toggle-data-provider', - SAVE_TIMELINE: 'save-timeline-action', - ADD_TO_FAVORITES: 'add-to-favorites', -}; - -export const timelineTourSteps = [ - { - title: i18n.TIMELINE_TOUR_TIMELINE_ACTIONS_STEP_TITLE, - content: ( - - {i18n.TIMELINE_TOUR_NEW}, - openButton: {i18n.TIMELINE_TOUR_OPEN}, - }} - /> - - ), - anchor: TIMELINE_TOUR_CONFIG_ANCHORS.ACTION_MENU, - }, - { - title: i18n.TIMELINE_TOUR_ADD_TO_FAVORITES_STEP_TITLE, - content: ( - - - - ), - anchor: TIMELINE_TOUR_CONFIG_ANCHORS.ADD_TO_FAVORITES, - }, - { - timelineTab: TimelineTabs.query, - title: i18n.TIMELINE_TOUR_CHANGE_DATA_VIEW_TITLE, - content: ( - - {i18n.TIMELINE_TOUR_DATA_VIEW}, - }} - /> - - ), - anchor: TIMELINE_TOUR_CONFIG_ANCHORS.DATA_VIEW, - }, - { - timelineType: TimelineTypeEnum.default, - timelineTab: TimelineTabs.query, - title: i18n.TIMELINE_TOUR_DATA_PROVIDER_VISIBILITY_TITLE, - content: {i18n.TIMELINE_TOUR_DATA_PROVIDER_VISIBILITY_DESCRIPTION}, - anchor: TIMELINE_TOUR_CONFIG_ANCHORS.DATA_PROVIDER, - }, - { - title: i18n.TIMELINE_TOUR_SAVE_TIMELINE_STEP_TITLE, - content: ( - - {i18n.TIMELINE_TOUR_SAVE}, - editButton: {i18n.TIMELINE_TOUR_EDIT}, - }} - /> - - ), - anchor: TIMELINE_TOUR_CONFIG_ANCHORS.SAVE_TIMELINE, - }, -]; - -export const tourConfig = { - currentTourStep: 1, - isTourActive: true, - tourPopoverWidth: 300, - tourSubtitle: i18n.TIMELINE_TOUR_SUBTITLE, -}; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/translations.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/translations.ts deleted file mode 100644 index 3bb3b0e7eac00..0000000000000 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tour/translations.ts +++ /dev/null @@ -1,92 +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 { i18n } from '@kbn/i18n'; - -export const TIMELINE_TOUR_SUBTITLE = i18n.translate( - 'xpack.securitySolution.timeline.tour.subTitle', - { - defaultMessage: 'Recent Timeline improvements', - } -); - -export const TIMELINE_TOUR_TIMELINE_ACTIONS_STEP_TITLE = i18n.translate( - 'xpack.securitySolution.timeline.tour.newTimeline.title', - { - defaultMessage: 'Actions are now easier to find', - } -); - -export const TIMELINE_TOUR_DATA_PROVIDER_VISIBILITY_TITLE = i18n.translate( - 'xpack.securitySolution.timeline.tour.dataProviderToggle.title', - { - defaultMessage: 'The query builder is collapsed by default', - } -); - -export const TIMELINE_TOUR_DATA_PROVIDER_VISIBILITY_DESCRIPTION = i18n.translate( - 'xpack.securitySolution.timeline.tour.dataProviderToggle.description', - { - defaultMessage: 'Click to expand or collapse the query builder.', - } -); - -export const TIMELINE_TOUR_SAVE_TIMELINE_STEP_TITLE = i18n.translate( - 'xpack.securitySolution.timeline.tour.saveTimeline.title', - { - defaultMessage: 'An easier way to save new changes', - } -); - -export const TIMELINE_TOUR_CHANGE_DATA_VIEW_TITLE = i18n.translate( - 'xpack.securitySolution.timeline.tour.changeDataView.title', - { - defaultMessage: 'The Data view menu has moved', - } -); - -export const TIMELINE_TOUR_ADD_TO_FAVORITES_STEP_TITLE = i18n.translate( - 'xpack.securitySolution.timeline.tour.addToFavorites.title', - { - defaultMessage: 'A new and intuitive way to favorite your Timeline', - } -); - -export const TIMELINE_TOUR_NEXT = i18n.translate('xpack.securitySolution.timeline.tour.next', { - defaultMessage: 'Next', -}); - -export const TIMELINE_TOUR_FINISH = i18n.translate('xpack.securitySolution.timeline.tour.finish', { - defaultMessage: 'Finish tour', -}); - -export const TIMELINE_TOUR_EXIT = i18n.translate('xpack.securitySolution.timeline.tour.exit', { - defaultMessage: 'Exit tour', -}); - -export const TIMELINE_TOUR_SAVE = i18n.translate('xpack.securitySolution.timeline.tour.save', { - defaultMessage: 'Save', -}); - -export const TIMELINE_TOUR_NEW = i18n.translate('xpack.securitySolution.timeline.tour.new', { - defaultMessage: 'New', -}); - -export const TIMELINE_TOUR_OPEN = i18n.translate('xpack.securitySolution.timeline.tour.open', { - defaultMessage: 'Open', -}); - -export const TIMELINE_TOUR_EDIT = i18n.translate('xpack.securitySolution.timeline.tour.edit', { - defaultMessage: 'Edit', -}); - -export const TIMELINE_TOUR_DATA_VIEW = i18n.translate( - 'xpack.securitySolution.timeline.tour.dataView', - { - defaultMessage: 'Data view', - } -); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 2c76d6c957319..e5fe67cbdf02f 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -40369,23 +40369,6 @@ "xpack.securitySolution.timeline.tabs.sessionTabTimelineTitle": "Vue de session", "xpack.securitySolution.timeline.tcp": "TCP", "xpack.securitySolution.timeline.toggleEventDetailsTitle": "Développer les détails de l'événement", - "xpack.securitySolution.timeline.tour.addToFavorites.description": "Cliquez pour ajouter votre chronologie à vos favoris afin de la retrouver plus rapidement par la suite.", - "xpack.securitySolution.timeline.tour.addToFavorites.title": "Une nouvelle façon intuitive d'ajouter votre chronologie à vos favoris", - "xpack.securitySolution.timeline.tour.changeDataView.description": "Cliquez sur le menu {dataViewButton} pour choisir les données d'événement ou d'alerte à afficher.", - "xpack.securitySolution.timeline.tour.changeDataView.title": "Le menu d'affichage des données s'est déplacé", - "xpack.securitySolution.timeline.tour.dataProviderToggle.description": "Cliquez pour développer ou réduire le générateur de requêtes.", - "xpack.securitySolution.timeline.tour.dataProviderToggle.title": "Le constructeur de requêtes est réduit par défaut", - "xpack.securitySolution.timeline.tour.dataView": "Vue de données", - "xpack.securitySolution.timeline.tour.edit": "Modifier", - "xpack.securitySolution.timeline.tour.exit": "Sortir du tour", - "xpack.securitySolution.timeline.tour.finish": "Finir le tour", - "xpack.securitySolution.timeline.tour.new": "Nouveauté", - "xpack.securitySolution.timeline.tour.newTimeline.title": "Les actions sont désormais plus faciles à trouver", - "xpack.securitySolution.timeline.tour.next": "Suivant", - "xpack.securitySolution.timeline.tour.open": "Ouvrir", - "xpack.securitySolution.timeline.tour.save": "Enregistrer", - "xpack.securitySolution.timeline.tour.saveTimeline.title": "Une façon plus simple d'enregistrer les nouveaux changements", - "xpack.securitySolution.timeline.tour.subTitle": "Améliorations de la chronologie récente", "xpack.securitySolution.timeline.typeTooltip": "Type", "xpack.securitySolution.timeline.unsavedWorkMessage": "Quitter Timeline avec un travail non enregistré ?", "xpack.securitySolution.timeline.unsavedWorkTitle": "Modifications non enregistrées", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index b7b13e022bb15..0bd410f31c0b3 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -40113,25 +40113,6 @@ "xpack.securitySolution.timeline.tabs.sessionTabTimelineTitle": "セッションビュー", "xpack.securitySolution.timeline.tcp": "TCP", "xpack.securitySolution.timeline.toggleEventDetailsTitle": "イベントの詳細を展開", - "xpack.securitySolution.timeline.tour.addToFavorites.description": "クリックすると、タイムラインがお気に入りに追加され、後ですばやく見つけられるようになります。", - "xpack.securitySolution.timeline.tour.addToFavorites.title": "タイムラインをお気に入りに追加するための新しい直感的な方法", - "xpack.securitySolution.timeline.tour.changeDataView.description": "{dataViewButton}メニューをクリックして、表示するイベントまたはアラートデータを選択します。", - "xpack.securitySolution.timeline.tour.changeDataView.title": "データビューメニューが移動しました", - "xpack.securitySolution.timeline.tour.dataProviderToggle.description": "クリックすると、クエリビルダーが展開されたり、折りたたまれたりします。", - "xpack.securitySolution.timeline.tour.dataProviderToggle.title": "クエリビルダーはデフォルトで折りたたまれています", - "xpack.securitySolution.timeline.tour.dataView": "データビュー", - "xpack.securitySolution.timeline.tour.edit": "編集", - "xpack.securitySolution.timeline.tour.exit": "ガイドを終了", - "xpack.securitySolution.timeline.tour.finish": "ガイドを完了", - "xpack.securitySolution.timeline.tour.new": "新規", - "xpack.securitySolution.timeline.tour.newTimeline.description": "{newButton}をクリックして、新しいタイムラインを作成します。{openButton}をクリックして、既存の項目を開きます。", - "xpack.securitySolution.timeline.tour.newTimeline.title": "アクションが見つけやすくなりました", - "xpack.securitySolution.timeline.tour.next": "次へ", - "xpack.securitySolution.timeline.tour.open": "開く", - "xpack.securitySolution.timeline.tour.save": "保存", - "xpack.securitySolution.timeline.tour.saveTimeline.description": "{saveButton}をクリックして、新しい変更を手動で保存します。タイムラインを保存するときには、名前と説明を{editButton}するか、新しいタイムラインとして保存することができます。", - "xpack.securitySolution.timeline.tour.saveTimeline.title": "新しい変更を保存する方法が簡単になりました", - "xpack.securitySolution.timeline.tour.subTitle": "最近のタイムラインの改良", "xpack.securitySolution.timeline.typeTooltip": "型", "xpack.securitySolution.timeline.unsavedWorkMessage": "作業を保存せずにタイムラインから移動しますか?", "xpack.securitySolution.timeline.unsavedWorkTitle": "保存されていない変更", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 47bbff06074b2..80e113dd341de 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -40158,25 +40158,6 @@ "xpack.securitySolution.timeline.tabs.sessionTabTimelineTitle": "会话视图", "xpack.securitySolution.timeline.tcp": "TCP", "xpack.securitySolution.timeline.toggleEventDetailsTitle": "展开事件详情", - "xpack.securitySolution.timeline.tour.addToFavorites.description": "单击以收藏您的时间线,以便稍后快速找到它。", - "xpack.securitySolution.timeline.tour.addToFavorites.title": "收藏时间线的全新直观方式", - "xpack.securitySolution.timeline.tour.changeDataView.description": "单击 {dataViewButton} 菜单以选择要显示的事件或告警数据。", - "xpack.securitySolution.timeline.tour.changeDataView.title": "已移动数据视图菜单", - "xpack.securitySolution.timeline.tour.dataProviderToggle.description": "单击以展开或折叠查询构建器。", - "xpack.securitySolution.timeline.tour.dataProviderToggle.title": "查询构建器默认处于折叠状态", - "xpack.securitySolution.timeline.tour.dataView": "数据视图", - "xpack.securitySolution.timeline.tour.edit": "编辑", - "xpack.securitySolution.timeline.tour.exit": "退出教程", - "xpack.securitySolution.timeline.tour.finish": "完成教程", - "xpack.securitySolution.timeline.tour.new": "新建", - "xpack.securitySolution.timeline.tour.newTimeline.description": "单击 {newButton} 以创建新时间线。单击 {openButton} 以打开现有项。", - "xpack.securitySolution.timeline.tour.newTimeline.title": "现在可以更轻松地查找操作", - "xpack.securitySolution.timeline.tour.next": "下一步", - "xpack.securitySolution.timeline.tour.open": "打开", - "xpack.securitySolution.timeline.tour.save": "保存", - "xpack.securitySolution.timeline.tour.saveTimeline.description": "单击 {saveButton} 以手动保存新更改。在保存时间线时,您可以{editButton}其名称和描述,或将其另存为新时间线。", - "xpack.securitySolution.timeline.tour.saveTimeline.title": "保存新更改的更简便方法", - "xpack.securitySolution.timeline.tour.subTitle": "最近的时间线改进", "xpack.securitySolution.timeline.typeTooltip": "类型", "xpack.securitySolution.timeline.unsavedWorkMessage": "离开有未保存工作的时间线?", "xpack.securitySolution.timeline.unsavedWorkTitle": "未保存的更改", From 59ef6d4c291bd9e9fd86bfabaa7e7b6cc5583c27 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Fri, 25 Oct 2024 17:18:00 +1100 Subject: [PATCH 007/135] [api-docs] 2024-10-25 Daily api_docs build (#197753) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/871 --- 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/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_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 | 14 + api_docs/dashboard.mdx | 4 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.devdocs.json | 8 +- api_docs/data.mdx | 2 +- api_docs/data_quality.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_usage.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 | 4 +- 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/discover_shared.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/entities_data_access.mdx | 2 +- api_docs/entity_manager.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/esql.mdx | 2 +- api_docs/esql_data_grid.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.devdocs.json | 8 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.devdocs.json | 8 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- .../expression_legacy_metric_vis.devdocs.json | 8 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.devdocs.json | 8 +- api_docs/expression_metric_vis.mdx | 2 +- .../expression_partition_vis.devdocs.json | 32 +- 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.devdocs.json | 8 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.devdocs.json | 86 +- api_docs/expressions.mdx | 4 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/fields_metadata.mdx | 2 +- api_docs/file_upload.devdocs.json | 18 +- api_docs/file_upload.mdx | 7 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.devdocs.json | 22 +- 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/inference.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/integration_assistant.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/inventory.devdocs.json | 4 +- api_docs/inventory.mdx | 2 +- api_docs/investigate.mdx | 2 +- api_docs/investigate_app.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_ai_assistant.devdocs.json | 13 +- api_docs/kbn_ai_assistant.mdx | 2 +- api_docs/kbn_ai_assistant_common.devdocs.json | 10 +- api_docs/kbn_ai_assistant_common.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_comparators.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_grouping.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_collection_utils.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_types.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_avc_banner.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_cbor.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_cloud_security_posture.mdx | 2 +- ...cloud_security_posture_common.devdocs.json | 4 +- .../kbn_cloud_security_posture_common.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 +- ...ent_management_content_insights_public.mdx | 2 +- ...ent_management_content_insights_server.mdx | 2 +- ...bn_content_management_favorites_public.mdx | 2 +- ...bn_content_management_favorites_server.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 +- .../kbn_content_management_user_profiles.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_feature_flags_browser.mdx | 2 +- ...bn_core_feature_flags_browser_internal.mdx | 2 +- .../kbn_core_feature_flags_browser_mocks.mdx | 2 +- api_docs/kbn_core_feature_flags_server.mdx | 2 +- ...kbn_core_feature_flags_server_internal.mdx | 2 +- .../kbn_core_feature_flags_server_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 | 4 + 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_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.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.devdocs.json | 106 +- 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 +- ...iscover_contextual_components.devdocs.json | 853 ++++++++++++++++ .../kbn_discover_contextual_components.mdx | 36 + api_docs/kbn_discover_utils.devdocs.json | 912 ++++++++++++++++-- api_docs/kbn_discover_utils.mdx | 7 +- 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_entities_schema.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_editor.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_grid_layout.mdx | 2 +- api_docs/kbn_grouping.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 +- ...index_management_shared_types.devdocs.json | 34 +- .../kbn_index_management_shared_types.mdx | 4 +- api_docs/kbn_inference_integration_flyout.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_investigation_shared.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_ipynb.mdx | 2 +- api_docs/kbn_item_buffer.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_json_schemas.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- api_docs/kbn_language_documentation.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_manifest.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_field_stats_flyout.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_parse_interval.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_ml_validators.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_object_versioning_utils.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_rule_utils.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- ...n_observability_logs_overview.devdocs.json | 28 +- api_docs/kbn_observability_logs_overview.mdx | 4 +- ...kbn_observability_synthetics_test_data.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_product_doc_artifact_builder.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_hooks.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_recently_accessed.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 +- .../kbn_response_ops_feature_flag_service.mdx | 2 +- api_docs/kbn_response_ops_rule_params.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rollup.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 +- .../kbn_screenshotting_server.devdocs.json | 16 +- api_docs/kbn_screenshotting_server.mdx | 2 +- api_docs/kbn_search_api_keys_components.mdx | 2 +- api_docs/kbn_search_api_keys_server.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_search_shared_ui.mdx | 2 +- api_docs/kbn_search_types.mdx | 2 +- api_docs/kbn_security_api_key_management.mdx | 2 +- api_docs/kbn_security_authorization_core.mdx | 2 +- ...kbn_security_authorization_core_common.mdx | 2 +- api_docs/kbn_security_form_components.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 +- .../kbn_security_role_management_model.mdx | 2 +- api_docs/kbn_security_solution_common.mdx | 2 +- ...kbn_security_solution_distribution_bar.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 +- api_docs/kbn_security_ui_components.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_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 +- .../kbn_server_route_repository_client.mdx | 2 +- .../kbn_server_route_repository_utils.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_table_persist.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_predicates.mdx | 2 +- api_docs/kbn_sse_utils.mdx | 2 +- api_docs/kbn_sse_utils_client.mdx | 2 +- api_docs/kbn_sse_utils_server.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_synthetics_e2e.mdx | 2 +- api_docs/kbn_synthetics_private_location.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_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_transpose_utils.devdocs.json | 177 ++++ api_docs/kbn_transpose_utils.mdx | 33 + api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_try_in_console.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_unsaved_changes_prompt.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.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.devdocs.json | 38 +- api_docs/lens.mdx | 4 +- 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_data_access.mdx | 2 +- api_docs/logs_explorer.mdx | 2 +- api_docs/logs_shared.devdocs.json | 30 + api_docs/logs_shared.mdx | 4 +- 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.devdocs.json | 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 | 382 +++++--- 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 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.devdocs.json | 8 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 28 +- 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_assistant.mdx | 2 +- api_docs/search_connectors.mdx | 2 +- api_docs/search_homepage.mdx | 2 +- api_docs/search_indices.mdx | 2 +- api_docs/search_inference_endpoints.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 | 31 +- 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/threat_intelligence.mdx | 2 +- api_docs/timelines.devdocs.json | 8 - 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 +- 787 files changed, 3359 insertions(+), 1154 deletions(-) create mode 100644 api_docs/kbn_discover_contextual_components.devdocs.json create mode 100644 api_docs/kbn_discover_contextual_components.mdx create mode 100644 api_docs/kbn_transpose_utils.devdocs.json create mode 100644 api_docs/kbn_transpose_utils.mdx diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index a49c423172348..0e8f3acdf40b0 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-10-24 +date: 2024-10-25 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 ff62d1b2a4bbd..502eaa848e05f 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-10-24 +date: 2024-10-25 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 756105b5a1908..97bb4414983cf 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-10-24 +date: 2024-10-25 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 48c1e2b19f79b..2c71a66c0921b 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-10-24 +date: 2024-10-25 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 47142887fa805..29ec99ec3dc76 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-10-24 +date: 2024-10-25 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 e75feac606bd1..6d05f5f6c6b43 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-10-24 +date: 2024-10-25 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 07df3f6fa8c5b..f2b509a8adb9f 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 302118326c78a..e8a6e40a67d61 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-10-24 +date: 2024-10-25 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 09ce66160bfd5..4482e8b00a06b 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-10-24 +date: 2024-10-25 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 36b47bb7f8bcf..8de6048ddbe5c 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-10-24 +date: 2024-10-25 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 fa3cac359fc2c..ef50f06a0721b 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-10-24 +date: 2024-10-25 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 180097fe56d30..a6e11745aa9a0 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-10-24 +date: 2024-10-25 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 b7558e9167aa9..a5f6401ba0a5d 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-10-24 +date: 2024-10-25 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 64aee2e82c03d..3a111a23fb7c0 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-10-24 +date: 2024-10-25 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 bc087e97f247c..d0cf6a71eb6b2 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index cfb0dde9e416d..f799cad3d0f95 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-10-24 +date: 2024-10-25 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 caff30aa86d4e..b94b5c9da2338 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-10-24 +date: 2024-10-25 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 40017b429d4d3..e6245443103a4 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-10-24 +date: 2024-10-25 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 0f9868a9036b1..790dbe005ee65 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-10-24 +date: 2024-10-25 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 a9bf6349b0641..d19329fe3ea6b 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-10-24 +date: 2024-10-25 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 178492403ae47..9d2107a8768c6 100644 --- a/api_docs/dashboard.devdocs.json +++ b/api_docs/dashboard.devdocs.json @@ -564,6 +564,20 @@ ], "returnComment": [] }, + { + "parentPluginId": "dashboard", + "id": "def-public.DashboardCreationOptions.fullScreenMode", + "type": "CompoundType", + "tags": [], + "label": "fullScreenMode", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/dashboard/public/dashboard_api/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "dashboard", "id": "def-public.DashboardCreationOptions.isEmbeddedExternally", diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index b2bd33c80faad..b954f6a417dc7 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.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 | |-------------------|-----------|------------------------|-----------------| -| 129 | 0 | 124 | 14 | +| 130 | 0 | 125 | 14 | ## Client diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index a65c8143c45b2..7be289077d18a 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-10-24 +date: 2024-10-25 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 3effda755639b..66e7a984e27ff 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -10195,7 +10195,7 @@ "section": "def-common.Datatable", "text": "Datatable" }, - ", { csvSeparator, quoteValues, formatFactory, raw, escapeFormulaValues, columnsSorting }: CSVOptions) => string" + ", { csvSeparator, quoteValues, formatFactory, raw, escapeFormulaValues }: CSVOptions) => string" ], "path": "src/plugins/data/public/index.ts", "deprecated": false, @@ -17526,7 +17526,7 @@ "section": "def-common.Datatable", "text": "Datatable" }, - ", { csvSeparator, quoteValues, formatFactory, raw, escapeFormulaValues, columnsSorting }: CSVOptions) => string" + ", { csvSeparator, quoteValues, formatFactory, raw, escapeFormulaValues }: CSVOptions) => string" ], "path": "src/plugins/data/server/index.ts", "deprecated": false, @@ -22972,7 +22972,7 @@ "section": "def-common.Datatable", "text": "Datatable" }, - ", { csvSeparator, quoteValues, formatFactory, raw, escapeFormulaValues, columnsSorting }: CSVOptions) => string" + ", { csvSeparator, quoteValues, formatFactory, raw, escapeFormulaValues }: CSVOptions) => string" ], "path": "src/plugins/data/common/exports/export_csv.tsx", "deprecated": false, @@ -23004,7 +23004,7 @@ "id": "def-common.datatableToCSV.$2", "type": "Object", "tags": [], - "label": "{ csvSeparator, quoteValues, formatFactory, raw, escapeFormulaValues, columnsSorting }", + "label": "{ csvSeparator, quoteValues, formatFactory, raw, escapeFormulaValues }", "description": [], "signature": [ "CSVOptions" diff --git a/api_docs/data.mdx b/api_docs/data.mdx index d873cc7f4efb7..3ee94254c413f 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index 0065e2a6f6d5e..1fbb28b6097e0 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index ca44d49059d16..439fed69df251 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-10-24 +date: 2024-10-25 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 7e99d3af89836..66a4195bfda18 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_usage.mdx b/api_docs/data_usage.mdx index 237ae559cf4d1..7fd671e4fc336 100644 --- a/api_docs/data_usage.mdx +++ b/api_docs/data_usage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataUsage title: "dataUsage" image: https://source.unsplash.com/400x175/?github description: API docs for the dataUsage plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataUsage'] --- import dataUsageObj from './data_usage.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index e2453bc3d86da..33a037e036db4 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-10-24 +date: 2024-10-25 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 8c0a8ed40c542..d9c40b66b8ef7 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-10-24 +date: 2024-10-25 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 284c2e8ee4a18..cf4845bfe9615 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-10-24 +date: 2024-10-25 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 0864197e33ed0..9e9d5a4d41216 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-10-24 +date: 2024-10-25 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 c556ba10fb53d..2059562d37d7d 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-10-24 +date: 2024-10-25 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 7a045e1655b15..6db559a156159 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-10-24 +date: 2024-10-25 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 f40dfe4df4086..7c89950343798 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index fed25b9f32c17..6cd00c7d52e93 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -1375,7 +1375,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedCellValueElementProps), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedCellValueElementProps) | - | | | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedRowRenderer), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedRowRenderer) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=BeatFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=BeatFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=BeatFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=BeatFields) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/cells/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/cells/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/header_actions/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/header_actions/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields)+ 74 more | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/cells/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/cells/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/header_actions/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/header_actions/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields)+ 72 more | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=IndexFieldsStrategyRequest), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyRequest), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyRequest), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyRequest), [middleware.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=IndexFieldsStrategyRequest), [middleware.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=IndexFieldsStrategyRequest) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=IndexFieldsStrategyResponse), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyResponse), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyResponse), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyResponse), [middleware.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=IndexFieldsStrategyResponse), [middleware.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=IndexFieldsStrategyResponse) | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/hooks/types.ts#:~:text=SimpleSavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/hooks/types.ts#:~:text=SimpleSavedObject) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index ac584066eadcc..6b62d0edd3a04 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 85dd600914163..aeb50204b8302 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-10-24 +date: 2024-10-25 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 62abae585dbd1..e25fe1fca4c00 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-10-24 +date: 2024-10-25 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 833bdf4819004..a19a9d1d910cb 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index 813a3771168b8..8cf6d5811c890 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 2fe07075f57bd..22fc7f08a3c74 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-10-24 +date: 2024-10-25 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 53aa63bb34677..509f4864481db 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-10-24 +date: 2024-10-25 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 ebb7bf2aea1fd..91996d48362d7 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-10-24 +date: 2024-10-25 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 dacf9c33bd9d4..efccd7663a031 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-10-24 +date: 2024-10-25 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 ef6ee7db8bd30..9aed88578c119 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-10-24 +date: 2024-10-25 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 a76e8f8e4c008..bf3f296cc486d 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entities_data_access.mdx b/api_docs/entities_data_access.mdx index a5d3c06a5d3bb..b02c7a918d491 100644 --- a/api_docs/entities_data_access.mdx +++ b/api_docs/entities_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entitiesDataAccess title: "entitiesDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the entitiesDataAccess plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entitiesDataAccess'] --- import entitiesDataAccessObj from './entities_data_access.devdocs.json'; diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index c36740b357133..39af0d3afddde 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 4e1de1a29784c..c3b53d34b2a8e 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx index afceea1f7de7c..836841fabf53e 100644 --- a/api_docs/esql.mdx +++ b/api_docs/esql.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esql title: "esql" image: https://source.unsplash.com/400x175/?github description: API docs for the esql plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] --- import esqlObj from './esql.devdocs.json'; diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index b3087a962c271..2b2a7808e9152 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 54123f4610ba9..bc3bb187fd016 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-10-24 +date: 2024-10-25 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 c485b23676e7f..8f6294f23a1c7 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-10-24 +date: 2024-10-25 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 e2b397d3bb984..e2ec68ef82e07 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-10-24 +date: 2024-10-25 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 068195e9d3ea6..1a3d2a96b6669 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-10-24 +date: 2024-10-25 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 875a1ddc34349..af9e6ebeddb45 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.devdocs.json b/api_docs/expression_gauge.devdocs.json index b4b993a649dec..6ba87ba4bcf94 100644 --- a/api_docs/expression_gauge.devdocs.json +++ b/api_docs/expression_gauge.devdocs.json @@ -1122,11 +1122,11 @@ }, "<", { - "pluginId": "inspector", + "pluginId": "expressions", "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" + "docId": "kibExpressionsPluginApi", + "section": "def-common.DefaultInspectorAdapters", + "text": "DefaultInspectorAdapters" }, ">>" ], diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 5bc088e9bd810..ae49b77013d00 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.devdocs.json b/api_docs/expression_heatmap.devdocs.json index ef02459af8314..6cd3e0667c9a3 100644 --- a/api_docs/expression_heatmap.devdocs.json +++ b/api_docs/expression_heatmap.devdocs.json @@ -685,11 +685,11 @@ }, "<", { - "pluginId": "inspector", + "pluginId": "expressions", "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" + "docId": "kibExpressionsPluginApi", + "section": "def-common.DefaultInspectorAdapters", + "text": "DefaultInspectorAdapters" }, ">>" ], diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 54d32d9c90919..8e32a8a630c47 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-10-24 +date: 2024-10-25 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 00b63f0a85d73..ef905b8669834 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.devdocs.json b/api_docs/expression_legacy_metric_vis.devdocs.json index 59c68ce444a54..90dbb3a4873f5 100644 --- a/api_docs/expression_legacy_metric_vis.devdocs.json +++ b/api_docs/expression_legacy_metric_vis.devdocs.json @@ -866,11 +866,11 @@ }, "<", { - "pluginId": "inspector", + "pluginId": "expressions", "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" + "docId": "kibExpressionsPluginApi", + "section": "def-common.DefaultInspectorAdapters", + "text": "DefaultInspectorAdapters" }, ">>" ], diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index f7ffe93ecd00c..80f8f1d5b18a9 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-10-24 +date: 2024-10-25 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 77e0d44399c95..ac4d8b408de5d 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.devdocs.json b/api_docs/expression_metric_vis.devdocs.json index 38dc323764f98..8383126e6833c 100644 --- a/api_docs/expression_metric_vis.devdocs.json +++ b/api_docs/expression_metric_vis.devdocs.json @@ -1245,11 +1245,11 @@ }, "<", { - "pluginId": "inspector", + "pluginId": "expressions", "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" + "docId": "kibExpressionsPluginApi", + "section": "def-common.DefaultInspectorAdapters", + "text": "DefaultInspectorAdapters" }, ">>" ], diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index df5075a758f47..eee54e1648ee7 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.devdocs.json b/api_docs/expression_partition_vis.devdocs.json index a1360f5293f54..1d41a14eb90a2 100644 --- a/api_docs/expression_partition_vis.devdocs.json +++ b/api_docs/expression_partition_vis.devdocs.json @@ -1199,11 +1199,11 @@ }, "<", { - "pluginId": "inspector", + "pluginId": "expressions", "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" + "docId": "kibExpressionsPluginApi", + "section": "def-common.DefaultInspectorAdapters", + "text": "DefaultInspectorAdapters" }, ">>" ], @@ -1364,11 +1364,11 @@ }, "<", { - "pluginId": "inspector", + "pluginId": "expressions", "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" + "docId": "kibExpressionsPluginApi", + "section": "def-common.DefaultInspectorAdapters", + "text": "DefaultInspectorAdapters" }, ">>" ], @@ -1473,11 +1473,11 @@ }, "<", { - "pluginId": "inspector", + "pluginId": "expressions", "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" + "docId": "kibExpressionsPluginApi", + "section": "def-common.DefaultInspectorAdapters", + "text": "DefaultInspectorAdapters" }, ">>" ], @@ -1552,11 +1552,11 @@ }, "<", { - "pluginId": "inspector", + "pluginId": "expressions", "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" + "docId": "kibExpressionsPluginApi", + "section": "def-common.DefaultInspectorAdapters", + "text": "DefaultInspectorAdapters" }, ">>" ], diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index eedf21e3d5a2c..bbfe62e67bb37 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-10-24 +date: 2024-10-25 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 5a748cb636b26..012a05f5085da 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-10-24 +date: 2024-10-25 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 4edb5f79f1dba..aae29be9303ab 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-10-24 +date: 2024-10-25 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 969b4cf2a3529..5a7ac495b4a3f 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-10-24 +date: 2024-10-25 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 2a1257749a765..038f9bf9dac65 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.devdocs.json b/api_docs/expression_x_y.devdocs.json index 38e1d5af388f5..5e2c8408e14de 100644 --- a/api_docs/expression_x_y.devdocs.json +++ b/api_docs/expression_x_y.devdocs.json @@ -3011,11 +3011,11 @@ }, "<", { - "pluginId": "inspector", + "pluginId": "expressions", "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" + "docId": "kibExpressionsPluginApi", + "section": "def-common.DefaultInspectorAdapters", + "text": "DefaultInspectorAdapters" }, ">>" ], diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index f1ba395a431d0..f32b1411e2272 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.devdocs.json b/api_docs/expressions.devdocs.json index 64637d9f422d2..08f101eb3abe5 100644 --- a/api_docs/expressions.devdocs.json +++ b/api_docs/expressions.devdocs.json @@ -6133,6 +6133,45 @@ "deprecated": false, "trackAdoption": false, "children": [ + { + "parentPluginId": "expressions", + "id": "def-public.TablesAdapter.tables", + "type": "Object", + "tags": [], + "label": "#tables", + "description": [], + "path": "src/plugins/expressions/common/util/tables_adapter.ts", + "deprecated": false, + "trackAdoption": false, + "children": [] + }, + { + "parentPluginId": "expressions", + "id": "def-public.TablesAdapter.allowCsvExport", + "type": "boolean", + "tags": [], + "label": "allowCsvExport", + "description": [], + "path": "src/plugins/expressions/common/util/tables_adapter.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "expressions", + "id": "def-public.TablesAdapter.initialSelectedTable", + "type": "string", + "tags": [], + "label": "initialSelectedTable", + "description": [ + "Key of table to set as initial selection" + ], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/expressions/common/util/tables_adapter.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "expressions", "id": "def-public.TablesAdapter.logDatatable", @@ -6141,7 +6180,7 @@ "label": "logDatatable", "description": [], "signature": [ - "(name: string, datatable: ", + "(key: string, datatable: ", { "pluginId": "expressions", "scope": "common", @@ -6160,7 +6199,7 @@ "id": "def-public.TablesAdapter.logDatatable.$1", "type": "string", "tags": [], - "label": "name", + "label": "key", "description": [], "signature": [ "string" @@ -28259,6 +28298,45 @@ "deprecated": false, "trackAdoption": false, "children": [ + { + "parentPluginId": "expressions", + "id": "def-common.TablesAdapter.tables", + "type": "Object", + "tags": [], + "label": "#tables", + "description": [], + "path": "src/plugins/expressions/common/util/tables_adapter.ts", + "deprecated": false, + "trackAdoption": false, + "children": [] + }, + { + "parentPluginId": "expressions", + "id": "def-common.TablesAdapter.allowCsvExport", + "type": "boolean", + "tags": [], + "label": "allowCsvExport", + "description": [], + "path": "src/plugins/expressions/common/util/tables_adapter.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "expressions", + "id": "def-common.TablesAdapter.initialSelectedTable", + "type": "string", + "tags": [], + "label": "initialSelectedTable", + "description": [ + "Key of table to set as initial selection" + ], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/expressions/common/util/tables_adapter.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "expressions", "id": "def-common.TablesAdapter.logDatatable", @@ -28267,7 +28345,7 @@ "label": "logDatatable", "description": [], "signature": [ - "(name: string, datatable: ", + "(key: string, datatable: ", { "pluginId": "expressions", "scope": "common", @@ -28286,7 +28364,7 @@ "id": "def-common.TablesAdapter.logDatatable.$1", "type": "string", "tags": [], - "label": "name", + "label": "key", "description": [], "signature": [ "string" diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index bdfc24d1bbe40..c1446d09c2d48 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.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 | |-------------------|-----------|------------------------|-----------------| -| 2235 | 17 | 1765 | 6 | +| 2241 | 17 | 1769 | 6 | ## Client diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 882d8f233a855..f13916cc4a223 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-10-24 +date: 2024-10-25 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 bbcdc5585132e..a469fcd55f650 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index 51bfa557f1a06..a78dac4200a5f 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] --- import fieldsMetadataObj from './fields_metadata.devdocs.json'; diff --git a/api_docs/file_upload.devdocs.json b/api_docs/file_upload.devdocs.json index ee7c66730bb54..10bc57a634795 100644 --- a/api_docs/file_upload.devdocs.json +++ b/api_docs/file_upload.devdocs.json @@ -1614,7 +1614,23 @@ } ], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "fileUpload", + "id": "def-common.TIKA_PREVIEW_CHARS", + "type": "number", + "tags": [], + "label": "TIKA_PREVIEW_CHARS", + "description": [], + "signature": [ + "100000" + ], + "path": "x-pack/plugins/file_upload/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [] } } \ No newline at end of file diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index c4b1e5458ccfe..2c37d2e76dbec 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.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 | |-------------------|-----------|------------------------|-----------------| -| 88 | 0 | 88 | 8 | +| 89 | 0 | 89 | 8 | ## Client @@ -39,3 +39,6 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib ### Interfaces +### Consts, variables and types + + diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 2e12a3f096900..ad4882b5bbc90 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-10-24 +date: 2024-10-25 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 fe460af770aeb..df2e6d24ea945 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 3ac36ec52b20b..a0ccb47e00b5e 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -9283,21 +9283,13 @@ }, { "parentPluginId": "fleet", - "id": "def-server.PackageClient.getAgentPolicyInputs", + "id": "def-server.PackageClient.getAgentPolicyConfigYAML", "type": "Function", "tags": [], - "label": "getAgentPolicyInputs", + "label": "getAgentPolicyConfigYAML", "description": [], "signature": [ - "(pkgName: string, pkgVersion?: string | undefined, prerelease?: false | undefined, ignoreUnverified?: boolean | undefined) => Promise<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.TemplateAgentPolicyInput", - "text": "TemplateAgentPolicyInput" - }, - "[]>" + "(pkgName: string, pkgVersion?: string | undefined, prerelease?: false | undefined, ignoreUnverified?: boolean | undefined) => Promise" ], "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", "deprecated": false, @@ -9305,7 +9297,7 @@ "children": [ { "parentPluginId": "fleet", - "id": "def-server.PackageClient.getAgentPolicyInputs.$1", + "id": "def-server.PackageClient.getAgentPolicyConfigYAML.$1", "type": "string", "tags": [], "label": "pkgName", @@ -9320,7 +9312,7 @@ }, { "parentPluginId": "fleet", - "id": "def-server.PackageClient.getAgentPolicyInputs.$2", + "id": "def-server.PackageClient.getAgentPolicyConfigYAML.$2", "type": "string", "tags": [], "label": "pkgVersion", @@ -9335,7 +9327,7 @@ }, { "parentPluginId": "fleet", - "id": "def-server.PackageClient.getAgentPolicyInputs.$3", + "id": "def-server.PackageClient.getAgentPolicyConfigYAML.$3", "type": "boolean", "tags": [], "label": "prerelease", @@ -9350,7 +9342,7 @@ }, { "parentPluginId": "fleet", - "id": "def-server.PackageClient.getAgentPolicyInputs.$4", + "id": "def-server.PackageClient.getAgentPolicyConfigYAML.$4", "type": "CompoundType", "tags": [], "label": "ignoreUnverified", diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 5b4fbf3f6469c..1b9bed79143eb 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-10-24 +date: 2024-10-25 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 ecad7e72cd6de..1b946c28aa6c1 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-10-24 +date: 2024-10-25 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 7981a41fc3b09..f0cce41a5cf8a 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-10-24 +date: 2024-10-25 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 f482fd5259c78..65cc10185309d 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-10-24 +date: 2024-10-25 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 d29d42d805854..2024262876c0a 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-10-24 +date: 2024-10-25 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 30d83edddc056..b6b938d38fee8 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-10-24 +date: 2024-10-25 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 63f6b10770795..365c1d0d4c5b9 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/inference.mdx b/api_docs/inference.mdx index 754a321572210..dc6b9385358be 100644 --- a/api_docs/inference.mdx +++ b/api_docs/inference.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inference title: "inference" image: https://source.unsplash.com/400x175/?github description: API docs for the inference plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inference'] --- import inferenceObj from './inference.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 9e24a7145e853..92065c50ce107 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-10-24 +date: 2024-10-25 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 699585411c1d8..3cb617fe3d3f9 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-10-24 +date: 2024-10-25 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 8befe46833068..0b9e3bc75240b 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index 9109da444cff3..2ed577c134c0a 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index a31939d7a88b0..1585a7ece5051 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/inventory.devdocs.json b/api_docs/inventory.devdocs.json index 8d08d920f33d4..061ad0b1ed5a3 100644 --- a/api_docs/inventory.devdocs.json +++ b/api_docs/inventory.devdocs.json @@ -72,7 +72,7 @@ }, "<\"GET /internal/inventory/entities/types\", undefined, ", "InventoryRouteHandlerResources", - ", { entityTypes: (\"service\" | \"host\" | \"container\")[]; }, ", + ", { entityTypes: string[]; }, ", "InventoryRouteCreateOptions", ">; \"GET /internal/inventory/entities\": ", { @@ -108,7 +108,7 @@ "PartialC", "<{ entityTypes: ", "Type", - "<(\"service\" | \"host\" | \"container\")[], string, unknown>; kuery: ", + "; kuery: ", "StringC", "; }>]>; }>, ", "InventoryRouteHandlerResources", diff --git a/api_docs/inventory.mdx b/api_docs/inventory.mdx index fd9dbc55ad549..877c4fa6083ca 100644 --- a/api_docs/inventory.mdx +++ b/api_docs/inventory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inventory title: "inventory" image: https://source.unsplash.com/400x175/?github description: API docs for the inventory plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inventory'] --- import inventoryObj from './inventory.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index 013401f0b4763..aa0696f8de6dd 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index b5b76b18211f1..23f61a87f42a2 100644 --- a/api_docs/investigate_app.mdx +++ b/api_docs/investigate_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigateApp title: "investigateApp" image: https://source.unsplash.com/400x175/?github description: API docs for the investigateApp plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 3d2bcc39c84a3..f97fd9a1c7040 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant.devdocs.json b/api_docs/kbn_ai_assistant.devdocs.json index 21b1e9a290668..5940c3c6fe125 100644 --- a/api_docs/kbn_ai_assistant.devdocs.json +++ b/api_docs/kbn_ai_assistant.devdocs.json @@ -803,7 +803,7 @@ "label": "ConversationView", "description": [], "signature": [ - "({ conversationId, navigateToConversation, getConversationHref, newConversationHref, scope, }: ConversationViewProps) => React.JSX.Element" + "({ conversationId, navigateToConversation, getConversationHref, newConversationHref, scopes, }: ConversationViewProps) => React.JSX.Element" ], "path": "x-pack/packages/kbn-ai-assistant/src/conversation/conversation_view.tsx", "deprecated": false, @@ -814,7 +814,7 @@ "id": "def-public.ConversationView.$1", "type": "Object", "tags": [], - "label": "{\n conversationId,\n navigateToConversation,\n getConversationHref,\n newConversationHref,\n scope,\n}", + "label": "{\n conversationId,\n navigateToConversation,\n getConversationHref,\n newConversationHref,\n scopes,\n}", "description": [], "signature": [ "ConversationViewProps" @@ -1041,10 +1041,10 @@ }, { "parentPluginId": "@kbn/ai-assistant", - "id": "def-public.useScope", + "id": "def-public.useScopes", "type": "Function", "tags": [], - "label": "useScope", + "label": "useScopes", "description": [], "signature": [ "() => ", @@ -1054,9 +1054,10 @@ "docId": "kibKbnAiAssistantCommonPluginApi", "section": "def-common.AssistantScope", "text": "AssistantScope" - } + }, + "[]" ], - "path": "x-pack/packages/kbn-ai-assistant/src/hooks/use_scope.ts", + "path": "x-pack/packages/kbn-ai-assistant/src/hooks/use_scopes.ts", "deprecated": false, "trackAdoption": false, "children": [], diff --git a/api_docs/kbn_ai_assistant.mdx b/api_docs/kbn_ai_assistant.mdx index a450e39335fb9..990d8bbd2d734 100644 --- a/api_docs/kbn_ai_assistant.mdx +++ b/api_docs/kbn_ai_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant title: "@kbn/ai-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant'] --- import kbnAiAssistantObj from './kbn_ai_assistant.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant_common.devdocs.json b/api_docs/kbn_ai_assistant_common.devdocs.json index d6a03fb2b004f..f0e6b1400242e 100644 --- a/api_docs/kbn_ai_assistant_common.devdocs.json +++ b/api_docs/kbn_ai_assistant_common.devdocs.json @@ -27,7 +27,7 @@ "label": "filterScopes", "description": [], "signature": [ - "(scope: ", + "(scopeFilters: ", { "pluginId": "@kbn/ai-assistant-common", "scope": "common", @@ -35,7 +35,7 @@ "section": "def-common.AssistantScope", "text": "AssistantScope" }, - " | undefined) => (value: T) => boolean" + "[] | undefined) => (value: T) => boolean" ], "path": "x-pack/packages/kbn-ai-assistant-common/src/utils/filter_scopes.ts", "deprecated": false, @@ -44,9 +44,9 @@ { "parentPluginId": "@kbn/ai-assistant-common", "id": "def-common.filterScopes.$1", - "type": "CompoundType", + "type": "Array", "tags": [], - "label": "scope", + "label": "scopeFilters", "description": [], "signature": [ { @@ -56,7 +56,7 @@ "section": "def-common.AssistantScope", "text": "AssistantScope" }, - " | undefined" + "[] | undefined" ], "path": "x-pack/packages/kbn-ai-assistant-common/src/utils/filter_scopes.ts", "deprecated": false, diff --git a/api_docs/kbn_ai_assistant_common.mdx b/api_docs/kbn_ai_assistant_common.mdx index 673b83d0a67ff..d197535e4585d 100644 --- a/api_docs/kbn_ai_assistant_common.mdx +++ b/api_docs/kbn_ai_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant-common title: "@kbn/ai-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant-common plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant-common'] --- import kbnAiAssistantCommonObj from './kbn_ai_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index cec917cab02b6..14aa0e0c6122d 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-10-24 +date: 2024-10-25 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 3743b44cf7148..b5da2892b2201 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-10-24 +date: 2024-10-25 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 63649411a0bad..db58d88a6f245 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-10-24 +date: 2024-10-25 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 5c97c0c607621..34a948b5c2770 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-10-24 +date: 2024-10-25 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_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index ff8a51d5c41e5..683fee9922359 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 68b9f3041a68b..e01e82dca0d9b 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-10-24 +date: 2024-10-25 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 d632d8a2d663f..912223f2c1421 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-10-24 +date: 2024-10-25 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 a0dee4e6be794..1276310af8c88 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-10-24 +date: 2024-10-25 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_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index 3c88b31d6a85c..7359a86a5d93d 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 2775cc02a50be..441ababd03849 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-10-24 +date: 2024-10-25 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 9316ef73f9125..f2c3c9661fdbf 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 9aaee7c0402b0..df74108e64bd5 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 2545e50638c11..3be4e76bb84a4 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-10-24 +date: 2024-10-25 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 723fa74f6b80a..86b3747e7ed11 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-10-24 +date: 2024-10-25 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 bbedf41a7a26b..939ebeba7f63c 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-10-24 +date: 2024-10-25 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 d4fce62a15c9a..c3bf780aa4650 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-10-24 +date: 2024-10-25 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_types.mdx b/api_docs/kbn_apm_types.mdx index 3c511e689436c..a0718445b4fbc 100644 --- a/api_docs/kbn_apm_types.mdx +++ b/api_docs/kbn_apm_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-types title: "@kbn/apm-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-types plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-types'] --- import kbnApmTypesObj from './kbn_apm_types.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index f1aacb031552c..8abba56d800d2 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_avc_banner.mdx b/api_docs/kbn_avc_banner.mdx index 7ee64e3c9e590..d34df87175eb0 100644 --- a/api_docs/kbn_avc_banner.mdx +++ b/api_docs/kbn_avc_banner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-avc-banner title: "@kbn/avc-banner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/avc-banner plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/avc-banner'] --- import kbnAvcBannerObj from './kbn_avc_banner.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 41a64101e5255..d52483de527a8 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-10-24 +date: 2024-10-25 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 1fa1373a2b52f..0f1ef20d91ed0 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-10-24 +date: 2024-10-25 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 ff1a537302c52..df6624d352ca6 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-10-24 +date: 2024-10-25 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 1ace049810763..ad5895edfb160 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-10-24 +date: 2024-10-25 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 3c387f7f52177..e1eefe8437602 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cbor.mdx b/api_docs/kbn_cbor.mdx index 2bc6de833621d..ff0bcc82a7787 100644 --- a/api_docs/kbn_cbor.mdx +++ b/api_docs/kbn_cbor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cbor title: "@kbn/cbor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cbor plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cbor'] --- import kbnCborObj from './kbn_cbor.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 3dcd48bf18d22..4276312b74be8 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-10-24 +date: 2024-10-25 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 845d0ececb4e3..b5c8e7e6a4755 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-10-24 +date: 2024-10-25 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 25408fc82999f..3da1f513352bf 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-10-24 +date: 2024-10-25 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 d547adb69416c..760cdc0103b9f 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-10-24 +date: 2024-10-25 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 108edaf484328..599f9afd8b4e5 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-10-24 +date: 2024-10-25 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 e43f05d8f6c87..1f386dd2fff21 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-10-24 +date: 2024-10-25 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 341f328350bc8..72ec880449783 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture.mdx b/api_docs/kbn_cloud_security_posture.mdx index 634cb3aa9c724..5c48a6e0999b9 100644 --- a/api_docs/kbn_cloud_security_posture.mdx +++ b/api_docs/kbn_cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture title: "@kbn/cloud-security-posture" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture'] --- import kbnCloudSecurityPostureObj from './kbn_cloud_security_posture.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_common.devdocs.json b/api_docs/kbn_cloud_security_posture_common.devdocs.json index 44e1530125240..7a23e5f8cfbd0 100644 --- a/api_docs/kbn_cloud_security_posture_common.devdocs.json +++ b/api_docs/kbn_cloud_security_posture_common.devdocs.json @@ -183,7 +183,7 @@ "label": "buildMutedRulesFilter", "description": [], "signature": [ - "(rulesStates: Record>) => ", + "(rulesStates: Record>) => ", "QueryDslQueryContainer", "[]" ], @@ -199,7 +199,7 @@ "label": "rulesStates", "description": [], "signature": [ - "Record>" + "Record>" ], "path": "x-pack/packages/kbn-cloud-security-posture/common/utils/helpers.ts", "deprecated": false, diff --git a/api_docs/kbn_cloud_security_posture_common.mdx b/api_docs/kbn_cloud_security_posture_common.mdx index 3e7b82ca25a82..d2b770b7d4529 100644 --- a/api_docs/kbn_cloud_security_posture_common.mdx +++ b/api_docs/kbn_cloud_security_posture_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-common title: "@kbn/cloud-security-posture-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-common plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-common'] --- import kbnCloudSecurityPostureCommonObj from './kbn_cloud_security_posture_common.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index b0daddf5bde17..908eb9080cd60 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-10-24 +date: 2024-10-25 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 61e3ac208819f..09595244de2cb 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-10-24 +date: 2024-10-25 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 53f01acd73ded..2e80806fadf0e 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-10-24 +date: 2024-10-25 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 abd1d9af2b18a..b70f71c8e4694 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-10-24 +date: 2024-10-25 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 2a859953d0dde..280ddbb9d3d77 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-10-24 +date: 2024-10-25 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 1695839cf2685..b4d34ee9d0884 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-10-24 +date: 2024-10-25 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 44f4fe29c44d1..53924f175150e 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-10-24 +date: 2024-10-25 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 4a29fd9d72923..e8bc80179f1a2 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-10-24 +date: 2024-10-25 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_content_insights_public.mdx b/api_docs/kbn_content_management_content_insights_public.mdx index fb065a8a95ce2..16ba14cf1421c 100644 --- a/api_docs/kbn_content_management_content_insights_public.mdx +++ b/api_docs/kbn_content_management_content_insights_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-public title: "@kbn/content-management-content-insights-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-public plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-public'] --- import kbnContentManagementContentInsightsPublicObj from './kbn_content_management_content_insights_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_server.mdx b/api_docs/kbn_content_management_content_insights_server.mdx index eae5ad41d802b..c22e848ce98c9 100644 --- a/api_docs/kbn_content_management_content_insights_server.mdx +++ b/api_docs/kbn_content_management_content_insights_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-server title: "@kbn/content-management-content-insights-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-server plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-server'] --- import kbnContentManagementContentInsightsServerObj from './kbn_content_management_content_insights_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_public.mdx b/api_docs/kbn_content_management_favorites_public.mdx index c39fea67e5a98..df010f9cf1c66 100644 --- a/api_docs/kbn_content_management_favorites_public.mdx +++ b/api_docs/kbn_content_management_favorites_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-public title: "@kbn/content-management-favorites-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-public plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-public'] --- import kbnContentManagementFavoritesPublicObj from './kbn_content_management_favorites_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_server.mdx b/api_docs/kbn_content_management_favorites_server.mdx index fb419456c17e4..7437543f2f848 100644 --- a/api_docs/kbn_content_management_favorites_server.mdx +++ b/api_docs/kbn_content_management_favorites_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-server title: "@kbn/content-management-favorites-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-server plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-server'] --- import kbnContentManagementFavoritesServerObj from './kbn_content_management_favorites_server.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 2944b75bebd21..4b1db955ffae0 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-10-24 +date: 2024-10-25 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 944f097f2e114..d5305bd8deb84 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-10-24 +date: 2024-10-25 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 3e4d41c6c0503..488e98e1a0788 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-10-24 +date: 2024-10-25 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 e9d7ec36a3b00..ba09425a77101 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-10-24 +date: 2024-10-25 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_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index 8de72090dd923..3f05cd4a2410c 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-user-profiles'] --- import kbnContentManagementUserProfilesObj from './kbn_content_management_user_profiles.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 0bc3640a3f068..c3951f0b13008 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-10-24 +date: 2024-10-25 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 60fc6205729d7..38ff55655ec8e 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-10-24 +date: 2024-10-25 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 44bc53d78e7a0..d847b170231e7 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-10-24 +date: 2024-10-25 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 969e3b2f6b817..a36c41c26390d 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-10-24 +date: 2024-10-25 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 89cf5da825983..552b3c889df2e 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-10-24 +date: 2024-10-25 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 459b65e42575d..57f1ebeee476f 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-10-24 +date: 2024-10-25 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 6d22516fcfa43..2be7ad246d6d2 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-10-24 +date: 2024-10-25 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 5a92eda078d82..27e5355f0d380 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-10-24 +date: 2024-10-25 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 ae985fa246a7a..59a7c14a1183f 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-10-24 +date: 2024-10-25 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 6423c693cc2d1..2aa4aeaeb0b6a 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-10-24 +date: 2024-10-25 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 a68fdf616f5e8..651d0d1cf1be9 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-10-24 +date: 2024-10-25 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 15e129897a557..6fa3be391616f 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-10-24 +date: 2024-10-25 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 4bfc845d0c8f4..3af58c89ed8ac 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-10-24 +date: 2024-10-25 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 6577e12f6ed83..5e7d22b0cda8e 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-10-24 +date: 2024-10-25 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 d1841bd16f6ad..de028b6a0a5cf 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-10-24 +date: 2024-10-25 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 d7883e58893d6..5e865fd249196 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-10-24 +date: 2024-10-25 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 68d4aa6af3c24..99dbc9056aaf6 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-10-24 +date: 2024-10-25 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 3a68fc2cd9742..5f6190b4bad24 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-10-24 +date: 2024-10-25 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 37274f728f59f..7115d3bb7d62c 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-10-24 +date: 2024-10-25 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 fcd629b96c41b..a4cb7c5d24f54 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-10-24 +date: 2024-10-25 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 73efcbc61698c..d3472845a8b14 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-10-24 +date: 2024-10-25 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 cc238b0642ba3..7b62e26f37d4c 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-10-24 +date: 2024-10-25 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 40d7be5ddafa1..748ba5e37febe 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-10-24 +date: 2024-10-25 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 555fdefd23742..dc0178f1ca9c3 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-10-24 +date: 2024-10-25 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 e546363b5dfd3..36582efd7b78f 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-10-24 +date: 2024-10-25 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 22c30c6b5d5ac..a918d027cb3d1 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-10-24 +date: 2024-10-25 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 06c26e2d56648..0b57551e3fb79 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-10-24 +date: 2024-10-25 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 c9d4f33d9e665..85ff8336bbbeb 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-10-24 +date: 2024-10-25 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 1fd39040f9402..dc80d6c66be28 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-10-24 +date: 2024-10-25 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 483a213bd66ed..b11db6dc44dfc 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-10-24 +date: 2024-10-25 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 3dd65b11914f4..2b6381208cc18 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-10-24 +date: 2024-10-25 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 ab72e7bbb1759..41ba06074bfcc 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-10-24 +date: 2024-10-25 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 200cb548c5683..a7c6e52fad558 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-10-24 +date: 2024-10-25 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 6825081b2c001..f855a29466080 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-10-24 +date: 2024-10-25 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 adf31650c7381..2f0b975bbcbf6 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-10-24 +date: 2024-10-25 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 0ba68c06ac7c1..be72e4f6760ad 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-10-24 +date: 2024-10-25 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 8c901046471c5..392e440a5da95 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-10-24 +date: 2024-10-25 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 630d882e07d31..9c2e69b287516 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-10-24 +date: 2024-10-25 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 c9da0e57500b0..509956cfecce6 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-10-24 +date: 2024-10-25 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 a30458eca1758..c4081a26f43b1 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-10-24 +date: 2024-10-25 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 01ab9040f903d..1c29760a75995 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-10-24 +date: 2024-10-25 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 47ffdc15299f4..9f4b64a4b5e41 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-10-24 +date: 2024-10-25 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 849fcb6ed3eb0..4544289280c30 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-10-24 +date: 2024-10-25 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 9646db7695429..ce0a6c58bcee3 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-10-24 +date: 2024-10-25 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 fa403612d28f1..385a3409631f9 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-10-24 +date: 2024-10-25 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 aa55e46d80b99..0fb8dda03687d 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-10-24 +date: 2024-10-25 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 154e7c60ede82..89a052cab3b34 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-10-24 +date: 2024-10-25 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 801356bc14ab9..4bc81fc43a17c 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-10-24 +date: 2024-10-25 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 e65f657d8ef38..59bee3352b8b2 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-10-24 +date: 2024-10-25 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 119f16506cfbf..7d0352b91db05 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-10-24 +date: 2024-10-25 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 f391be847a3ca..2566cbfdabccc 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-10-24 +date: 2024-10-25 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 6b012c62c9f9c..502276b9844e5 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-10-24 +date: 2024-10-25 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 86b4ea029bff8..82a11dcb24e59 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-10-24 +date: 2024-10-25 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 4974838eff6af..3b6407e6bfcec 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-10-24 +date: 2024-10-25 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 6a5c2fe7f2a6a..33eed5a35b2d8 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-10-24 +date: 2024-10-25 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 4243a5cc3e666..98f1e4cf49391 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-10-24 +date: 2024-10-25 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 98c7534a86b58..13a1a80f5d362 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-10-24 +date: 2024-10-25 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 aefdb76ab7449..37c5284973860 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-10-24 +date: 2024-10-25 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 40b93d1ed29ff..707bbde3cbcc4 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-10-24 +date: 2024-10-25 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_feature_flags_browser.mdx b/api_docs/kbn_core_feature_flags_browser.mdx index 3486ea431fd50..4867bd71d5011 100644 --- a/api_docs/kbn_core_feature_flags_browser.mdx +++ b/api_docs/kbn_core_feature_flags_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser title: "@kbn/core-feature-flags-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser'] --- import kbnCoreFeatureFlagsBrowserObj from './kbn_core_feature_flags_browser.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_internal.mdx b/api_docs/kbn_core_feature_flags_browser_internal.mdx index c030b3f5a4bb1..1d66bf24d83e8 100644 --- a/api_docs/kbn_core_feature_flags_browser_internal.mdx +++ b/api_docs/kbn_core_feature_flags_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-internal title: "@kbn/core-feature-flags-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-internal plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-internal'] --- import kbnCoreFeatureFlagsBrowserInternalObj from './kbn_core_feature_flags_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_mocks.mdx b/api_docs/kbn_core_feature_flags_browser_mocks.mdx index bc8b90ce02d5f..26c57eab529ef 100644 --- a/api_docs/kbn_core_feature_flags_browser_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-mocks title: "@kbn/core-feature-flags-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-mocks plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-mocks'] --- import kbnCoreFeatureFlagsBrowserMocksObj from './kbn_core_feature_flags_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server.mdx b/api_docs/kbn_core_feature_flags_server.mdx index 095103578bfc9..c945e0897bd65 100644 --- a/api_docs/kbn_core_feature_flags_server.mdx +++ b/api_docs/kbn_core_feature_flags_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server title: "@kbn/core-feature-flags-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server'] --- import kbnCoreFeatureFlagsServerObj from './kbn_core_feature_flags_server.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_internal.mdx b/api_docs/kbn_core_feature_flags_server_internal.mdx index ba6a13e591617..4bd0e16beb684 100644 --- a/api_docs/kbn_core_feature_flags_server_internal.mdx +++ b/api_docs/kbn_core_feature_flags_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-internal title: "@kbn/core-feature-flags-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-internal plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-internal'] --- import kbnCoreFeatureFlagsServerInternalObj from './kbn_core_feature_flags_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_mocks.mdx b/api_docs/kbn_core_feature_flags_server_mocks.mdx index 6bac003686542..76ef53a8d04eb 100644 --- a/api_docs/kbn_core_feature_flags_server_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-mocks title: "@kbn/core-feature-flags-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-mocks plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-mocks'] --- import kbnCoreFeatureFlagsServerMocksObj from './kbn_core_feature_flags_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index e8eac76af7da7..da77d27edace6 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-10-24 +date: 2024-10-25 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 24e0d23cddbe4..4ff37c536625f 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-10-24 +date: 2024-10-25 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 c9604803cd983..e819399a30d90 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-10-24 +date: 2024-10-25 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 e358bbf7fd0ef..b312d444c22d7 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-10-24 +date: 2024-10-25 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 492ba821c1e11..a5afe9bc0f1de 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-10-24 +date: 2024-10-25 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 425e29618cd39..82c3dacf2b394 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-10-24 +date: 2024-10-25 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 7019732370a9b..45c900eb34e0a 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-10-24 +date: 2024-10-25 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 3942b0def84ad..d0f55f2cc9fe9 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-10-24 +date: 2024-10-25 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 d8ce60fe8ac11..befb4ad6b3360 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-10-24 +date: 2024-10-25 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 838e4ec08e224..6afe3f87c6622 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-10-24 +date: 2024-10-25 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 2c8d3974b5190..cf4fe8373a025 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-10-24 +date: 2024-10-25 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 795482e76ab5f..35bd18cec9bde 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -17333,6 +17333,10 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/routes/stop.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/siem_migrations/rules/api/create.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 55e0b5382534e..0f129f549cabc 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-10-24 +date: 2024-10-25 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 a9a23fcb8366a..2c9cda9b414f2 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-10-24 +date: 2024-10-25 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 fb026e74d0d3e..9becf34cf3e54 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-10-24 +date: 2024-10-25 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 0f7fdfd7ea29a..91278abc3e334 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-10-24 +date: 2024-10-25 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 e5af6caedfbea..4261103113312 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-10-24 +date: 2024-10-25 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 37a34c5564efd..9dda3a9665424 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-10-24 +date: 2024-10-25 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 9721e13103b70..7b7a83177657c 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-10-24 +date: 2024-10-25 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 92e7f560d5443..26208edaffe76 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-10-24 +date: 2024-10-25 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 a8d035339153e..5481756a5ffbe 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-10-24 +date: 2024-10-25 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 6f6b41cb03786..e89d0730578a4 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-10-24 +date: 2024-10-25 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 0f88ff1d52e84..3a858d43adee3 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-10-24 +date: 2024-10-25 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 c263792cbd657..157680a23afea 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-10-24 +date: 2024-10-25 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 7eead333c4d2d..7b4d793557a5f 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-10-24 +date: 2024-10-25 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 3ae7d66545862..0a2fef2f2628f 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-10-24 +date: 2024-10-25 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 8c1fd5cf052e8..b0f5a9b868d3a 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-10-24 +date: 2024-10-25 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 2828e25cf32a7..3958b5fb088f0 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-10-24 +date: 2024-10-25 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 a0ee9f139d712..40b54fb602ff3 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-10-24 +date: 2024-10-25 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 e19de2bf95adc..39b07dcdb118f 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-10-24 +date: 2024-10-25 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 c3f9b21788c7b..6a92a0d76e98f 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-10-24 +date: 2024-10-25 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 9248c7fc323c8..7c880dcfefb89 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-10-24 +date: 2024-10-25 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 ead2e31a51825..5328ee4e81fcf 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-10-24 +date: 2024-10-25 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 c138435ddd75b..034f9c42a4dcf 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-10-24 +date: 2024-10-25 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 2bb9ae69a0d6a..5e2430d3fc3d3 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-10-24 +date: 2024-10-25 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 7b46205814f6f..8084230e0aa7e 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-10-24 +date: 2024-10-25 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 20f39e98370ad..e1d68dcacbc91 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-10-24 +date: 2024-10-25 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 097e0dd7ac518..15e1b9336ac68 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-10-24 +date: 2024-10-25 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 786d843d5c8c4..733fba5e1c7d9 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-10-24 +date: 2024-10-25 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 f035169f6d44f..27ac76878b35e 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-10-24 +date: 2024-10-25 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 9fa9730ad3c39..e6866432f43de 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-10-24 +date: 2024-10-25 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 fadc3fc416662..1d31ebf2ee934 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-10-24 +date: 2024-10-25 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 19d8caed8dda5..884d8a6f5ec44 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-10-24 +date: 2024-10-25 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 310e7482a5567..dcf26199c458a 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-10-24 +date: 2024-10-25 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 18eb61f683594..974aa27ed52b2 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-10-24 +date: 2024-10-25 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 43a5d16fc08a3..ce1c87b69ff8d 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-10-24 +date: 2024-10-25 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 e1492c5b7152b..520c29279e897 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-10-24 +date: 2024-10-25 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 5e7e32028defb..7440908693fac 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-10-24 +date: 2024-10-25 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 788dd3ce2f74f..b9e327d31514d 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-10-24 +date: 2024-10-25 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 4f2e40e87a59e..09f6e57fa9405 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-10-24 +date: 2024-10-25 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 f5582cb7c8119..2ed82c4f2d80a 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-10-24 +date: 2024-10-25 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 dfa981163d1ea..ee98e78a69db8 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-10-24 +date: 2024-10-25 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 4a7c8d31f9442..506da2bee329e 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-10-24 +date: 2024-10-25 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 f4be4b4440b11..5b664c9fea407 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-10-24 +date: 2024-10-25 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 c90586c0aace3..c024bfbeddc7c 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-10-24 +date: 2024-10-25 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 2f16d5691d804..72b72f350f144 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-10-24 +date: 2024-10-25 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 2c08ccab6c06d..224b3a0ec37c0 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-10-24 +date: 2024-10-25 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 28261d1446804..80d0828edc829 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-10-24 +date: 2024-10-25 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 907b0f55c71db..47b59bc27bcc7 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-10-24 +date: 2024-10-25 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 155576f242819..053bc36ab2e89 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-10-24 +date: 2024-10-25 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 bd4eb80dcc82a..a7e9ace76cfc8 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-10-24 +date: 2024-10-25 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 1d6b91c6e46d8..74c8e94e01033 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-10-24 +date: 2024-10-25 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 edfeb7ca879f2..cefd397c25f79 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-10-24 +date: 2024-10-25 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 500bf5766f632..d51a61c24e73d 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-10-24 +date: 2024-10-25 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 a42608134723e..ccbf92cec3456 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-10-24 +date: 2024-10-25 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 d3d13cc2c63bf..beb66154c76e1 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-10-24 +date: 2024-10-25 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 88014da43a931..bd11402aecbee 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-10-24 +date: 2024-10-25 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 438ece77834ac..412f66f224c67 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-10-24 +date: 2024-10-25 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 597789bb85c4b..631b31671f57a 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-10-24 +date: 2024-10-25 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 a30d7a9fa7c3c..b5db588cea70c 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-10-24 +date: 2024-10-25 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 d102e41200eab..1d81a105baaea 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-10-24 +date: 2024-10-25 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 9d882d20dcf2b..06c42c5eef4b6 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-10-24 +date: 2024-10-25 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 d2c7e37db72c5..690299c9f6169 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-10-24 +date: 2024-10-25 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 8154d4b5d19d9..b53dcf86beecb 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-10-24 +date: 2024-10-25 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 0be66d1628cf4..342e63a245624 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-10-24 +date: 2024-10-25 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 4063c9ec89286..118101f884759 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-10-24 +date: 2024-10-25 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 30e225b1fd731..34a1beebd0f8b 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-10-24 +date: 2024-10-25 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 6afc5092a5495..4f2a74ca003e0 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-10-24 +date: 2024-10-25 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 b1f5390fcd94f..eb1e69eec1c5f 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-10-24 +date: 2024-10-25 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 6c107efac8997..2d76be55d62ca 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-10-24 +date: 2024-10-25 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 8aba7297daaa7..0e592f11a44b7 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-10-24 +date: 2024-10-25 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 84b3b3380b0b7..167fc0d4768a0 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-10-24 +date: 2024-10-25 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 162a9ac7c17e2..64cf0f346da8c 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-10-24 +date: 2024-10-25 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 33e3087f6b729..293bad7ac9b40 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-10-24 +date: 2024-10-25 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 db2382e7f8141..9043954847c3d 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-10-24 +date: 2024-10-25 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 eeae84924e314..86bd69b7bd616 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-10-24 +date: 2024-10-25 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 f20a5d5e8c924..3ed61484f2f7e 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-10-24 +date: 2024-10-25 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 7201d3162e3cb..31973ea45aa86 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-10-24 +date: 2024-10-25 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 d9aa86a7840c8..a6c1da6e38a94 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-10-24 +date: 2024-10-25 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 decd9a9277100..1ab880f8f6a35 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-10-24 +date: 2024-10-25 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 eb60062653d32..9820ab3cb3165 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-10-24 +date: 2024-10-25 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 deea48a635866..af15198a4e010 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-10-24 +date: 2024-10-25 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 c8ba7fd730c55..61c3fb6ad11cb 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-10-24 +date: 2024-10-25 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 3d33363e81e9d..808c35883891e 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-10-24 +date: 2024-10-25 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 8fb2998372996..16d999498587d 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-10-24 +date: 2024-10-25 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 ced3e5c8f5d78..5c81b517dd4bc 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-10-24 +date: 2024-10-25 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 12a9c7bc65168..117707111955e 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-10-24 +date: 2024-10-25 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 8e54c9684a2ad..71522e93920ab 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-10-24 +date: 2024-10-25 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 cd61f99b4b2bd..e47c382c2eded 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-10-24 +date: 2024-10-25 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 cb80cbedb788f..2e1c8f89f8bcd 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-10-24 +date: 2024-10-25 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 17b1af6710700..ad53f3bc01ce9 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-10-24 +date: 2024-10-25 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 789a46d1c5a73..78a75d3e84cf1 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-10-24 +date: 2024-10-25 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 4348a829a7d6a..eadd313d92375 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-10-24 +date: 2024-10-25 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 0eecc445ff9f8..f4ac5dc3e9bf8 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-10-24 +date: 2024-10-25 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 61e6ab58e2e9f..c52e538d5fdb9 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-10-24 +date: 2024-10-25 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 ba644258dfd72..42bd15e5a53cd 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-10-24 +date: 2024-10-25 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_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index 567b46bd16309..20a020e788b7e 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index 6d8d2844fc05f..e1b87c3eb8e7f 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index a2ffdb5bf9bfd..eee10551db541 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index f52ab178cfb34..bc9a34486f712 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index 71bcc53fcf1cc..37676f3e30a09 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index 8f02889d3a193..fd33971ae59e7 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index 4d9861f072e6c..d02d813e6b893 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_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 d3ef3836f28da..cbbd484348bf3 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-10-24 +date: 2024-10-25 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_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 58efb1632cc15..3d9f24b401d27 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-10-24 +date: 2024-10-25 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 7c1742b2dce33..e08941938cfff 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-10-24 +date: 2024-10-25 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 fb41fd4d2f069..7821769fc9433 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-10-24 +date: 2024-10-25 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 033be37e25e5a..b7559cadccfed 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-10-24 +date: 2024-10-25 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 66d977adeab1d..566186b6a0add 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-10-24 +date: 2024-10-25 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 be7daaebfa2bf..5f7ccbb6cedb8 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-10-24 +date: 2024-10-25 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 a7d4f3f3b4867..e55be5f3ce3e4 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-10-24 +date: 2024-10-25 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 b6de0fdb6d3e0..61477da487d59 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-10-24 +date: 2024-10-25 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.devdocs.json b/api_docs/kbn_data_stream_adapter.devdocs.json index a0a17ac923c1c..0cd9d1c79b2f8 100644 --- a/api_docs/kbn_data_stream_adapter.devdocs.json +++ b/api_docs/kbn_data_stream_adapter.devdocs.json @@ -932,42 +932,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/data-stream-adapter", - "id": "def-common.FieldMap", - "type": "Interface", - "tags": [], - "label": "FieldMap", - "description": [], - "path": "packages/kbn-data-stream-adapter/src/field_maps/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/data-stream-adapter", - "id": "def-common.FieldMap.Unnamed", - "type": "IndexSignature", - "tags": [], - "label": "[key: string]: { type: string; required: boolean; array?: boolean | undefined; doc_values?: boolean | undefined; enabled?: boolean | undefined; format?: string | undefined; ignore_above?: number | undefined; ... 5 more ...; properties?: Record<...> | undefined; }", - "description": [], - "signature": [ - "[key: string]: { type: string; required: boolean; array?: boolean | undefined; doc_values?: boolean | undefined; enabled?: boolean | undefined; format?: string | undefined; ignore_above?: number | undefined; multi_fields?: ", - { - "pluginId": "@kbn/data-stream-adapter", - "scope": "common", - "docId": "kibKbnDataStreamAdapterPluginApi", - "section": "def-common.MultiField", - "text": "MultiField" - }, - "[] | undefined; index?: boolean | undefined; path?: string | undefined; scaling_factor?: number | undefined; dynamic?: boolean | \"strict\" | undefined; properties?: Record | undefined; }" - ], - "path": "packages/kbn-data-stream-adapter/src/field_maps/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/data-stream-adapter", "id": "def-common.InstallParams", @@ -1137,13 +1101,15 @@ "label": "fieldMap", "description": [], "signature": [ + "{ [x: string]: { type: string; required: boolean; array?: boolean | undefined; doc_values?: boolean | undefined; enabled?: boolean | undefined; format?: string | undefined; ignore_above?: number | undefined; multi_fields?: ", { "pluginId": "@kbn/data-stream-adapter", "scope": "common", "docId": "kibKbnDataStreamAdapterPluginApi", - "section": "def-common.FieldMap", - "text": "FieldMap" - } + "section": "def-common.MultiField", + "text": "MultiField" + }, + "[] | undefined; index?: boolean | undefined; path?: string | undefined; scaling_factor?: number | undefined; dynamic?: boolean | \"strict\" | undefined; properties?: Record | undefined; }; }" ], "path": "packages/kbn-data-stream-adapter/src/data_stream_adapter.ts", "deprecated": false, @@ -1274,18 +1240,66 @@ "label": "EcsFieldMap", "description": [], "signature": [ + "{ [x: string]: { type: string; required: boolean; array?: boolean | undefined; doc_values?: boolean | undefined; enabled?: boolean | undefined; format?: string | undefined; ignore_above?: number | undefined; multi_fields?: ", { "pluginId": "@kbn/data-stream-adapter", "scope": "common", "docId": "kibKbnDataStreamAdapterPluginApi", - "section": "def-common.FieldMap", - "text": "FieldMap" - } + "section": "def-common.MultiField", + "text": "MultiField" + }, + "[] | undefined; index?: boolean | undefined; path?: string | undefined; scaling_factor?: number | undefined; dynamic?: boolean | \"strict\" | undefined; properties?: Record | undefined; }; }" ], "path": "packages/kbn-data-stream-adapter/src/field_maps/ecs_field_map.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/data-stream-adapter", + "id": "def-common.FieldMap", + "type": "Type", + "tags": [], + "label": "FieldMap", + "description": [], + "signature": [ + "{ [P in T]: { type: string; required: boolean; array?: boolean | undefined; doc_values?: boolean | undefined; enabled?: boolean | undefined; format?: string | undefined; ignore_above?: number | undefined; multi_fields?: ", + { + "pluginId": "@kbn/data-stream-adapter", + "scope": "common", + "docId": "kibKbnDataStreamAdapterPluginApi", + "section": "def-common.MultiField", + "text": "MultiField" + }, + "[] | undefined; index?: boolean | undefined; path?: string | undefined; scaling_factor?: number | undefined; dynamic?: boolean | \"strict\" | undefined; properties?: Record | undefined; }; }" + ], + "path": "packages/kbn-data-stream-adapter/src/field_maps/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/data-stream-adapter", + "id": "def-common.SchemaFieldMapKeys", + "type": "Type", + "tags": [], + "label": "SchemaFieldMapKeys", + "description": [], + "signature": [ + "Key extends string ? NonNullable extends Record ? `${Key}` | `${Key}.${", + { + "pluginId": "@kbn/data-stream-adapter", + "scope": "common", + "docId": "kibKbnDataStreamAdapterPluginApi", + "section": "def-common.SchemaFieldMapKeys", + "text": "SchemaFieldMapKeys" + }, + ", keyof NonNullable>}` : `${Key}` : never" + ], + "path": "packages/kbn-data-stream-adapter/src/field_maps/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "objects": [ @@ -1297,13 +1311,15 @@ "label": "ecsFieldMap", "description": [], "signature": [ + "{ [x: string]: { type: string; required: boolean; array?: boolean | undefined; doc_values?: boolean | undefined; enabled?: boolean | undefined; format?: string | undefined; ignore_above?: number | undefined; multi_fields?: ", { "pluginId": "@kbn/data-stream-adapter", "scope": "common", "docId": "kibKbnDataStreamAdapterPluginApi", - "section": "def-common.FieldMap", - "text": "FieldMap" - } + "section": "def-common.MultiField", + "text": "MultiField" + }, + "[] | undefined; index?: boolean | undefined; path?: string | undefined; scaling_factor?: number | undefined; dynamic?: boolean | \"strict\" | undefined; properties?: Record | undefined; }; }" ], "path": "packages/kbn-data-stream-adapter/src/field_maps/ecs_field_map.ts", "deprecated": false, diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index c794a952c8ad3..83ad4f7a30151 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-10-24 +date: 2024-10-25 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 5f302da76b92d..d5c26b7229efc 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-10-24 +date: 2024-10-25 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 e0b70c8a773f4..53a8c087280b1 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-10-24 +date: 2024-10-25 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 62628740d8d40..2eb233e083455 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-10-24 +date: 2024-10-25 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 9342bca97c4ee..58ec9fc9db98b 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-10-24 +date: 2024-10-25 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 160bd4fd7b8d7..d4e26ed2b3fd8 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-10-24 +date: 2024-10-25 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 34b66034ecac4..d7bbe21013ebf 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-10-24 +date: 2024-10-25 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 5b49dd92db65b..a6378a819d7c7 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-10-24 +date: 2024-10-25 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 af2b920ef8061..c5dfeb09e5b39 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-10-24 +date: 2024-10-25 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 ec37b96d5be61..d72d29877b369 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-10-24 +date: 2024-10-25 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 72aa70b3e4c98..f5c99a50635bb 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-10-24 +date: 2024-10-25 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 1a78647e21066..d84485e163776 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-10-24 +date: 2024-10-25 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 380bf52a08b99..3beda1c97aaba 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-10-24 +date: 2024-10-25 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 f7e7adc2901cf..833402a621001 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-10-24 +date: 2024-10-25 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 92325fe70e6d2..f7ffc888e932a 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-10-24 +date: 2024-10-25 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 0ce81dd9df569..8192bb865a9ed 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-10-24 +date: 2024-10-25 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 87c8575f56a20..0be01879092b3 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-10-24 +date: 2024-10-25 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 35bc5c25adc33..87cdfb552eaa6 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-10-24 +date: 2024-10-25 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 5525ece5bf416..57fc632d581e2 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-10-24 +date: 2024-10-25 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 f5b40e64cee7e..42783b7c5e50b 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_contextual_components.devdocs.json b/api_docs/kbn_discover_contextual_components.devdocs.json new file mode 100644 index 0000000000000..b987fc4267420 --- /dev/null +++ b/api_docs/kbn_discover_contextual_components.devdocs.json @@ -0,0 +1,853 @@ +{ + "id": "@kbn/discover-contextual-components", + "client": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.Content", + "type": "Function", + "tags": [], + "label": "Content", + "description": [], + "signature": [ + "({ columnId, dataView, fieldFormats, isCompressed, isSingleLine, row, shouldShowFieldHandler, }: ContentProps) => React.JSX.Element" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/content.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.Content.$1", + "type": "Object", + "tags": [], + "label": "{\n columnId,\n dataView,\n fieldFormats,\n isCompressed,\n isSingleLine = false,\n row,\n shouldShowFieldHandler,\n}", + "description": [], + "signature": [ + "ContentProps" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/content.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.createResourceFields", + "type": "Function", + "tags": [], + "label": "createResourceFields", + "description": [], + "signature": [ + "(row: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableRecord", + "text": "DataTableRecord" + }, + ", core: ", + { + "pluginId": "@kbn/core-lifecycle-browser", + "scope": "public", + "docId": "kibKbnCoreLifecycleBrowserPluginApi", + "section": "def-public.CoreStart", + "text": "CoreStart" + }, + ", share?: ", + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.SharePublicStart", + "text": "SharePublicStart" + }, + " | undefined) => ", + { + "pluginId": "@kbn/discover-contextual-components", + "scope": "public", + "docId": "kibKbnDiscoverContextualComponentsPluginApi", + "section": "def-public.ResourceFieldDescriptor", + "text": "ResourceFieldDescriptor" + }, + "[]" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/utils.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.createResourceFields.$1", + "type": "Object", + "tags": [], + "label": "row", + "description": [], + "signature": [ + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableRecord", + "text": "DataTableRecord" + } + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/utils.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.createResourceFields.$2", + "type": "Object", + "tags": [], + "label": "core", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-lifecycle-browser", + "scope": "public", + "docId": "kibKbnCoreLifecycleBrowserPluginApi", + "section": "def-public.CoreStart", + "text": "CoreStart" + } + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/utils.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.createResourceFields.$3", + "type": "CompoundType", + "tags": [], + "label": "share", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.SharePublicStart", + "text": "SharePublicStart" + }, + " | undefined" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/utils.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.formatJsonDocumentForContent", + "type": "Function", + "tags": [], + "label": "formatJsonDocumentForContent", + "description": [ + "\nformatJsonDocumentForContent definitions" + ], + "signature": [ + "(row: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableRecord", + "text": "DataTableRecord" + }, + ") => { flattened: Record; raw: { fields: Record; _index?: string | undefined; _id?: string | undefined; _source?: Record | undefined; sort?: ", + "SortResults", + " | undefined; _score?: number | null | undefined; _explanation?: ", + "ExplainExplanation", + " | undefined; highlight?: Record | undefined; inner_hits?: Record | undefined; matched_queries?: string[] | undefined; _nested?: ", + "SearchNestedIdentity", + " | undefined; _ignored?: string[] | undefined; ignored_field_values?: Record | undefined; _shard?: string | undefined; _node?: string | undefined; _routing?: string | undefined; _rank?: number | undefined; _seq_no?: number | undefined; _primary_term?: number | undefined; _version?: number | undefined; }; id: string; isAnchor?: boolean | undefined; }" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/utils.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.formatJsonDocumentForContent.$1", + "type": "Object", + "tags": [], + "label": "row", + "description": [], + "signature": [ + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableRecord", + "text": "DataTableRecord" + } + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/utils.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.getLogLevelBadgeCell", + "type": "Function", + "tags": [], + "label": "getLogLevelBadgeCell", + "description": [], + "signature": [ + "(logLevelField: string) => (props: ", + { + "pluginId": "@kbn/unified-data-table", + "scope": "public", + "docId": "kibKbnUnifiedDataTablePluginApi", + "section": "def-public.DataGridCellValueElementProps", + "text": "DataGridCellValueElementProps" + }, + ") => React.JSX.Element" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/log_level_badge_cell/log_level_badge_cell.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.getLogLevelBadgeCell.$1", + "type": "string", + "tags": [], + "label": "logLevelField", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/log_level_badge_cell/log_level_badge_cell.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.getUnformattedResourceFields", + "type": "Function", + "tags": [], + "label": "getUnformattedResourceFields", + "description": [ + "\ngetUnformattedResourceFields definitions" + ], + "signature": [ + "(doc: ", + "LogDocument", + ") => ", + "ResourceFields" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/utils.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.getUnformattedResourceFields.$1", + "type": "Object", + "tags": [], + "label": "doc", + "description": [], + "signature": [ + "LogDocument" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/utils.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.LazySummaryColumn", + "type": "Function", + "tags": [], + "label": "LazySummaryColumn", + "description": [], + "signature": [ + "React.ForwardRefExoticComponent<", + "EuiDataGridCellValueElementProps", + " & { row: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableRecord", + "text": "DataTableRecord" + }, + "; dataView: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + }, + "; fieldFormats: ", + { + "pluginId": "fieldFormats", + "scope": "public", + "docId": "kibFieldFormatsPluginApi", + "section": "def-public.FieldFormatsStart", + "text": "FieldFormatsStart" + }, + "; closePopover: () => void; isCompressed?: boolean | undefined; } & ", + { + "pluginId": "@kbn/discover-contextual-components", + "scope": "public", + "docId": "kibKbnDiscoverContextualComponentsPluginApi", + "section": "def-public.SummaryColumnFactoryDeps", + "text": "SummaryColumnFactoryDeps" + }, + " & React.RefAttributes<{}>>" + ], + "path": "packages/kbn-discover-contextual-components/src/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.LazySummaryColumn.$1", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "path": "node_modules/@types/react/ts5.0/index.d.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.Resource", + "type": "Function", + "tags": [], + "label": "Resource", + "description": [], + "signature": [ + "({ fields, limited, onFilter, ...props }: ResourceProps) => React.JSX.Element" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/resource.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.Resource.$1", + "type": "Object", + "tags": [], + "label": "{ fields, limited = false, onFilter, ...props }", + "description": [], + "signature": [ + "ResourceProps" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/resource.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.ServiceNameBadgeWithActions", + "type": "Function", + "tags": [], + "label": "ServiceNameBadgeWithActions", + "description": [], + "signature": [ + "(props: ", + "FieldBadgeWithActionsPropsAndDependencies", + ") => React.JSX.Element" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/service_name_badge_with_actions.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.ServiceNameBadgeWithActions.$1", + "type": "CompoundType", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "FieldBadgeWithActionsPropsAndDependencies" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/service_name_badge_with_actions.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.SummaryColumn", + "type": "Function", + "tags": [], + "label": "SummaryColumn", + "description": [], + "signature": [ + "(props: ", + { + "pluginId": "@kbn/discover-contextual-components", + "scope": "public", + "docId": "kibKbnDiscoverContextualComponentsPluginApi", + "section": "def-public.AllSummaryColumnProps", + "text": "AllSummaryColumnProps" + }, + ") => React.JSX.Element" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/summary_column.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.SummaryColumn.$1", + "type": "CompoundType", + "tags": [], + "label": "props", + "description": [], + "signature": [ + { + "pluginId": "@kbn/discover-contextual-components", + "scope": "public", + "docId": "kibKbnDiscoverContextualComponentsPluginApi", + "section": "def-public.AllSummaryColumnProps", + "text": "AllSummaryColumnProps" + } + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/summary_column.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.ResourceFieldDescriptor", + "type": "Interface", + "tags": [], + "label": "ResourceFieldDescriptor", + "description": [], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/utils.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.ResourceFieldDescriptor.ResourceBadge", + "type": "CompoundType", + "tags": [], + "label": "ResourceBadge", + "description": [], + "signature": [ + "React.ComponentClass<", + "FieldBadgeWithActionsProps", + ", any> | React.FunctionComponent<", + "FieldBadgeWithActionsProps", + ">" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/utils.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.ResourceFieldDescriptor.Icon", + "type": "Function", + "tags": [], + "label": "Icon", + "description": [], + "signature": [ + "(() => JSX.Element) | undefined" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/utils.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.ResourceFieldDescriptor.name", + "type": "CompoundType", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "keyof ", + "ResourceFields" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/utils.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.ResourceFieldDescriptor.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/utils.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.SummaryColumnFactoryDeps", + "type": "Interface", + "tags": [], + "label": "SummaryColumnFactoryDeps", + "description": [], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/summary_column.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.SummaryColumnFactoryDeps.density", + "type": "CompoundType", + "tags": [], + "label": "density", + "description": [], + "signature": [ + { + "pluginId": "@kbn/unified-data-table", + "scope": "public", + "docId": "kibKbnUnifiedDataTablePluginApi", + "section": "def-public.DataGridDensity", + "text": "DataGridDensity" + }, + " | undefined" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/summary_column.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.SummaryColumnFactoryDeps.rowHeight", + "type": "number", + "tags": [], + "label": "rowHeight", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/summary_column.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.SummaryColumnFactoryDeps.shouldShowFieldHandler", + "type": "Function", + "tags": [], + "label": "shouldShowFieldHandler", + "description": [], + "signature": [ + "(fieldName: string) => boolean" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/summary_column.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.SummaryColumnFactoryDeps.shouldShowFieldHandler.$1", + "type": "string", + "tags": [], + "label": "fieldName", + "description": [], + "path": "packages/kbn-discover-utils/src/utils/get_should_show_field_handler.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.SummaryColumnFactoryDeps.onFilter", + "type": "Function", + "tags": [], + "label": "onFilter", + "description": [], + "signature": [ + "DocViewFilterFn", + " | undefined" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/summary_column.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.SummaryColumnFactoryDeps.core", + "type": "Object", + "tags": [], + "label": "core", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-lifecycle-browser", + "scope": "public", + "docId": "kibKbnCoreLifecycleBrowserPluginApi", + "section": "def-public.CoreStart", + "text": "CoreStart" + } + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/summary_column.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.SummaryColumnFactoryDeps.share", + "type": "CompoundType", + "tags": [], + "label": "share", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "public", + "docId": "kibSharePluginApi", + "section": "def-public.SharePublicStart", + "text": "SharePublicStart" + }, + " | undefined" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/summary_column.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.AllSummaryColumnProps", + "type": "Type", + "tags": [], + "label": "AllSummaryColumnProps", + "description": [], + "signature": [ + "EuiDataGridCellValueElementProps", + " & { row: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableRecord", + "text": "DataTableRecord" + }, + "; dataView: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + }, + "; fieldFormats: ", + { + "pluginId": "fieldFormats", + "scope": "public", + "docId": "kibFieldFormatsPluginApi", + "section": "def-public.FieldFormatsStart", + "text": "FieldFormatsStart" + }, + "; closePopover: () => void; isCompressed?: boolean | undefined; } & ", + { + "pluginId": "@kbn/discover-contextual-components", + "scope": "public", + "docId": "kibKbnDiscoverContextualComponentsPluginApi", + "section": "def-public.SummaryColumnFactoryDeps", + "text": "SummaryColumnFactoryDeps" + } + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/summary_column.tsx", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.LogLevelBadgeCell", + "type": "Type", + "tags": [], + "label": "LogLevelBadgeCell", + "description": [], + "signature": [ + "(props: ", + { + "pluginId": "@kbn/unified-data-table", + "scope": "public", + "docId": "kibKbnUnifiedDataTablePluginApi", + "section": "def-public.DataGridCellValueElementProps", + "text": "DataGridCellValueElementProps" + }, + ") => React.JSX.Element" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/log_level_badge_cell/log_level_badge_cell.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.LogLevelBadgeCell.$1", + "type": "CompoundType", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "EuiDataGridCellValueElementProps", + " & { row: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableRecord", + "text": "DataTableRecord" + }, + "; dataView: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + }, + "; fieldFormats: ", + { + "pluginId": "fieldFormats", + "scope": "public", + "docId": "kibFieldFormatsPluginApi", + "section": "def-public.FieldFormatsStart", + "text": "FieldFormatsStart" + }, + "; closePopover: () => void; isCompressed?: boolean | undefined; }" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/log_level_badge_cell/log_level_badge_cell.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-contextual-components", + "id": "def-public.SummaryColumnProps", + "type": "Type", + "tags": [], + "label": "SummaryColumnProps", + "description": [], + "signature": [ + "EuiDataGridCellValueElementProps", + " & { row: ", + { + "pluginId": "@kbn/discover-utils", + "scope": "common", + "docId": "kibKbnDiscoverUtilsPluginApi", + "section": "def-common.DataTableRecord", + "text": "DataTableRecord" + }, + "; dataView: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + }, + "; fieldFormats: ", + { + "pluginId": "fieldFormats", + "scope": "public", + "docId": "kibFieldFormatsPluginApi", + "section": "def-public.FieldFormatsStart", + "text": "FieldFormatsStart" + }, + "; closePopover: () => void; isCompressed?: boolean | undefined; }" + ], + "path": "packages/kbn-discover-contextual-components/src/data_types/logs/components/summary_column/summary_column.tsx", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_discover_contextual_components.mdx b/api_docs/kbn_discover_contextual_components.mdx new file mode 100644 index 0000000000000..f871112fe2bb2 --- /dev/null +++ b/api_docs/kbn_discover_contextual_components.mdx @@ -0,0 +1,36 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnDiscoverContextualComponentsPluginApi +slug: /kibana-dev-docs/api/kbn-discover-contextual-components +title: "@kbn/discover-contextual-components" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/discover-contextual-components plugin +date: 2024-10-25 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-contextual-components'] +--- +import kbnDiscoverContextualComponentsObj from './kbn_discover_contextual_components.devdocs.json'; + + + +Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 37 | 0 | 34 | 2 | + +## Client + +### Functions + + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_discover_utils.devdocs.json b/api_docs/kbn_discover_utils.devdocs.json index 01901ffe8e469..25a8aaaf454cb 100644 --- a/api_docs/kbn_discover_utils.devdocs.json +++ b/api_docs/kbn_discover_utils.devdocs.json @@ -3025,115 +3025,658 @@ } ], "misc": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.ACTIONS_COLUMN_WIDTH", + "type": "number", + "tags": [], + "label": "ACTIONS_COLUMN_WIDTH", + "description": [], + "signature": [ + "80" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.AGENT_NAME_FIELD", + "type": "string", + "tags": [], + "label": "AGENT_NAME_FIELD", + "description": [], + "signature": [ + "\"agent.name\"" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CLOUD_AVAILABILITY_ZONE_FIELD", + "type": "string", + "tags": [], + "label": "CLOUD_AVAILABILITY_ZONE_FIELD", + "description": [], + "signature": [ + "\"cloud.availability_zone\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CLOUD_INSTANCE_ID_FIELD", + "type": "string", + "tags": [], + "label": "CLOUD_INSTANCE_ID_FIELD", + "description": [], + "signature": [ + "\"cloud.instance.id\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CLOUD_PROJECT_ID_FIELD", + "type": "string", + "tags": [], + "label": "CLOUD_PROJECT_ID_FIELD", + "description": [], + "signature": [ + "\"cloud.project.id\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CLOUD_PROVIDER_FIELD", + "type": "string", + "tags": [], + "label": "CLOUD_PROVIDER_FIELD", + "description": [], + "signature": [ + "\"cloud.provider\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CLOUD_REGION_FIELD", + "type": "string", + "tags": [], + "label": "CLOUD_REGION_FIELD", + "description": [], + "signature": [ + "\"cloud.region\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CONTAINER_ID_FIELD", + "type": "string", + "tags": [], + "label": "CONTAINER_ID_FIELD", + "description": [], + "signature": [ + "\"container.id\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CONTAINER_NAME_FIELD", + "type": "string", + "tags": [], + "label": "CONTAINER_NAME_FIELD", + "description": [], + "signature": [ + "\"container.name\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CONTENT_FIELD", + "type": "string", + "tags": [], + "label": "CONTENT_FIELD", + "description": [], + "signature": [ + "\"content\"" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/discover-utils", "id": "def-common.CONTEXT_DEFAULT_SIZE_SETTING", "type": "string", "tags": [], - "label": "CONTEXT_DEFAULT_SIZE_SETTING", + "label": "CONTEXT_DEFAULT_SIZE_SETTING", + "description": [], + "signature": [ + "\"context:defaultSize\"" + ], + "path": "packages/kbn-discover-utils/src/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CONTEXT_STEP_SETTING", + "type": "string", + "tags": [], + "label": "CONTEXT_STEP_SETTING", + "description": [], + "signature": [ + "\"context:step\"" + ], + "path": "packages/kbn-discover-utils/src/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CONTEXT_TIE_BREAKER_FIELDS_SETTING", + "type": "string", + "tags": [], + "label": "CONTEXT_TIE_BREAKER_FIELDS_SETTING", + "description": [], + "signature": [ + "\"context:tieBreakerFields\"" + ], + "path": "packages/kbn-discover-utils/src/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DATA_GRID_COLUMN_WIDTH_MEDIUM", + "type": "number", + "tags": [], + "label": "DATA_GRID_COLUMN_WIDTH_MEDIUM", + "description": [], + "signature": [ + "320" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DATA_GRID_COLUMN_WIDTH_SMALL", + "type": "number", + "tags": [], + "label": "DATA_GRID_COLUMN_WIDTH_SMALL", + "description": [], + "signature": [ + "240" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DATASTREAM_DATASET_FIELD", + "type": "string", + "tags": [], + "label": "DATASTREAM_DATASET_FIELD", + "description": [], + "signature": [ + "\"data_stream.dataset\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DATASTREAM_NAMESPACE_FIELD", + "type": "string", + "tags": [], + "label": "DATASTREAM_NAMESPACE_FIELD", + "description": [], + "signature": [ + "\"data_stream.namespace\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DataTableColumnsMeta", + "type": "Type", + "tags": [], + "label": "DataTableColumnsMeta", + "description": [ + "\nCustom column types per column name" + ], + "signature": [ + "{ [x: string]: { type: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumnType", + "text": "DatatableColumnType" + }, + "; esType?: string | undefined; }; }" + ], + "path": "packages/kbn-discover-utils/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DEFAULT_ALLOWED_DATA_VIEWS", + "type": "Array", + "tags": [], + "label": "DEFAULT_ALLOWED_DATA_VIEWS", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DEFAULT_ALLOWED_LOGS_BASE_PATTERNS", + "type": "Array", + "tags": [], + "label": "DEFAULT_ALLOWED_LOGS_BASE_PATTERNS", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/logs_context_service.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DEFAULT_ALLOWED_LOGS_DATA_VIEWS", + "type": "Array", + "tags": [], + "label": "DEFAULT_ALLOWED_LOGS_DATA_VIEWS", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DEFAULT_COLUMNS", + "type": "Array", + "tags": [], + "label": "DEFAULT_COLUMNS", + "description": [], + "signature": [ + "SmartFieldGridColumnOptions", + "[]" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DEFAULT_COLUMNS_SETTING", + "type": "string", + "tags": [], + "label": "DEFAULT_COLUMNS_SETTING", + "description": [], + "signature": [ + "\"defaultColumns\"" + ], + "path": "packages/kbn-discover-utils/src/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DEFAULT_ROWS_PER_PAGE", + "type": "number", + "tags": [], + "label": "DEFAULT_ROWS_PER_PAGE", + "description": [], + "signature": [ + "100" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DOC_HIDE_TIME_COLUMN_SETTING", + "type": "string", + "tags": [], + "label": "DOC_HIDE_TIME_COLUMN_SETTING", + "description": [], + "signature": [ + "\"doc_table:hideTimeColumn\"" + ], + "path": "packages/kbn-discover-utils/src/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DOC_TABLE_LEGACY", + "type": "string", + "tags": [], + "label": "DOC_TABLE_LEGACY", + "description": [], + "signature": [ + "\"doc_table:legacy\"" + ], + "path": "packages/kbn-discover-utils/src/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.ERROR_EXCEPTION_STACKTRACE", + "type": "string", + "tags": [], + "label": "ERROR_EXCEPTION_STACKTRACE", + "description": [], + "signature": [ + "\"error.exception.stacktrace\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.ERROR_LOG_STACKTRACE", + "type": "string", + "tags": [], + "label": "ERROR_LOG_STACKTRACE", + "description": [], + "signature": [ + "\"error.log.stacktrace\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.ERROR_MESSAGE_FIELD", + "type": "string", + "tags": [], + "label": "ERROR_MESSAGE_FIELD", + "description": [], + "signature": [ + "\"error.message\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.ERROR_STACK_TRACE", + "type": "string", + "tags": [], + "label": "ERROR_STACK_TRACE", + "description": [], + "signature": [ + "\"error.stack_trace\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.EVENT_ORIGINAL_FIELD", + "type": "string", + "tags": [], + "label": "EVENT_ORIGINAL_FIELD", + "description": [], + "signature": [ + "\"event.original\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.FIELDS_LIMIT_SETTING", + "type": "string", + "tags": [], + "label": "FIELDS_LIMIT_SETTING", + "description": [], + "signature": [ + "\"fields:popularLimit\"" + ], + "path": "packages/kbn-discover-utils/src/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.FILTER_OUT_FIELDS_PREFIXES_FOR_CONTENT", + "type": "Array", + "tags": [], + "label": "FILTER_OUT_FIELDS_PREFIXES_FOR_CONTENT", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.FormattedHit", + "type": "Type", + "tags": [], + "label": "FormattedHit", + "description": [ + "\nPairs array for each field in the hit" + ], + "signature": [ + "FormattedHitPair[]" + ], + "path": "packages/kbn-discover-utils/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.HIDE_ANNOUNCEMENTS", + "type": "string", + "tags": [], + "label": "HIDE_ANNOUNCEMENTS", + "description": [], + "signature": [ + "\"hideAnnouncements\"" + ], + "path": "packages/kbn-discover-utils/src/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.HOST_NAME_FIELD", + "type": "string", + "tags": [], + "label": "HOST_NAME_FIELD", + "description": [], + "signature": [ + "\"host.name\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.IGNORED_FIELD", + "type": "string", + "tags": [], + "label": "IGNORED_FIELD", "description": [], "signature": [ - "\"context:defaultSize\"" + "\"_ignored\"" ], - "path": "packages/kbn-discover-utils/src/constants.ts", + "path": "packages/kbn-discover-utils/src/field_constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "@kbn/discover-utils", - "id": "def-common.CONTEXT_STEP_SETTING", + "id": "def-common.IGNORED_FIELD_VALUES_FIELD", "type": "string", "tags": [], - "label": "CONTEXT_STEP_SETTING", + "label": "IGNORED_FIELD_VALUES_FIELD", "description": [], "signature": [ - "\"context:step\"" + "\"ignored_field_values\"" ], - "path": "packages/kbn-discover-utils/src/constants.ts", + "path": "packages/kbn-discover-utils/src/field_constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "@kbn/discover-utils", - "id": "def-common.CONTEXT_TIE_BREAKER_FIELDS_SETTING", + "id": "def-common.LOG_FILE_PATH_FIELD", "type": "string", "tags": [], - "label": "CONTEXT_TIE_BREAKER_FIELDS_SETTING", + "label": "LOG_FILE_PATH_FIELD", "description": [], "signature": [ - "\"context:tieBreakerFields\"" + "\"log.file.path\"" ], - "path": "packages/kbn-discover-utils/src/constants.ts", + "path": "packages/kbn-discover-utils/src/field_constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "@kbn/discover-utils", - "id": "def-common.DataTableColumnsMeta", - "type": "Type", + "id": "def-common.LOG_LEVEL_FIELD", + "type": "string", "tags": [], - "label": "DataTableColumnsMeta", - "description": [ - "\nCustom column types per column name" - ], + "label": "LOG_LEVEL_FIELD", + "description": [], "signature": [ - "{ [x: string]: { type: ", - { - "pluginId": "expressions", - "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.DatatableColumnType", - "text": "DatatableColumnType" - }, - "; esType?: string | undefined; }; }" + "\"log.level\"" ], - "path": "packages/kbn-discover-utils/src/types.ts", + "path": "packages/kbn-discover-utils/src/field_constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "@kbn/discover-utils", - "id": "def-common.DEFAULT_ALLOWED_LOGS_BASE_PATTERNS", + "id": "def-common.LOG_LEVEL_FIELDS", "type": "Array", "tags": [], - "label": "DEFAULT_ALLOWED_LOGS_BASE_PATTERNS", + "label": "LOG_LEVEL_FIELDS", "description": [], "signature": [ "string[]" ], - "path": "packages/kbn-discover-utils/src/data_types/logs/logs_context_service.ts", + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "@kbn/discover-utils", - "id": "def-common.DEFAULT_COLUMNS_SETTING", + "id": "def-common.LOGS_EXPLORER_PROFILE_ID", "type": "string", "tags": [], - "label": "DEFAULT_COLUMNS_SETTING", + "label": "LOGS_EXPLORER_PROFILE_ID", "description": [], "signature": [ - "\"defaultColumns\"" + "\"logs-explorer\"" ], - "path": "packages/kbn-discover-utils/src/constants.ts", + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "@kbn/discover-utils", - "id": "def-common.DOC_HIDE_TIME_COLUMN_SETTING", + "id": "def-common.MAX_DOC_FIELDS_DISPLAYED", "type": "string", "tags": [], - "label": "DOC_HIDE_TIME_COLUMN_SETTING", + "label": "MAX_DOC_FIELDS_DISPLAYED", "description": [], "signature": [ - "\"doc_table:hideTimeColumn\"" + "\"discover:maxDocFieldsDisplayed\"" ], "path": "packages/kbn-discover-utils/src/constants.ts", "deprecated": false, @@ -3142,28 +3685,28 @@ }, { "parentPluginId": "@kbn/discover-utils", - "id": "def-common.DOC_TABLE_LEGACY", + "id": "def-common.MESSAGE_FIELD", "type": "string", "tags": [], - "label": "DOC_TABLE_LEGACY", + "label": "MESSAGE_FIELD", "description": [], "signature": [ - "\"doc_table:legacy\"" + "\"message\"" ], - "path": "packages/kbn-discover-utils/src/constants.ts", + "path": "packages/kbn-discover-utils/src/field_constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "@kbn/discover-utils", - "id": "def-common.FIELDS_LIMIT_SETTING", + "id": "def-common.MODIFY_COLUMNS_ON_SWITCH", "type": "string", "tags": [], - "label": "FIELDS_LIMIT_SETTING", + "label": "MODIFY_COLUMNS_ON_SWITCH", "description": [], "signature": [ - "\"fields:popularLimit\"" + "\"discover:modifyColumnsOnSwitch\"" ], "path": "packages/kbn-discover-utils/src/constants.ts", "deprecated": false, @@ -3172,62 +3715,60 @@ }, { "parentPluginId": "@kbn/discover-utils", - "id": "def-common.FormattedHit", - "type": "Type", + "id": "def-common.ORCHESTRATOR_CLUSTER_NAME_FIELD", + "type": "string", "tags": [], - "label": "FormattedHit", - "description": [ - "\nPairs array for each field in the hit" - ], + "label": "ORCHESTRATOR_CLUSTER_NAME_FIELD", + "description": [], "signature": [ - "FormattedHitPair[]" + "\"orchestrator.cluster.name\"" ], - "path": "packages/kbn-discover-utils/src/types.ts", + "path": "packages/kbn-discover-utils/src/field_constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "@kbn/discover-utils", - "id": "def-common.HIDE_ANNOUNCEMENTS", + "id": "def-common.ORCHESTRATOR_NAMESPACE_FIELD", "type": "string", "tags": [], - "label": "HIDE_ANNOUNCEMENTS", + "label": "ORCHESTRATOR_NAMESPACE_FIELD", "description": [], "signature": [ - "\"hideAnnouncements\"" + "\"orchestrator.namespace\"" ], - "path": "packages/kbn-discover-utils/src/constants.ts", + "path": "packages/kbn-discover-utils/src/field_constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "@kbn/discover-utils", - "id": "def-common.MAX_DOC_FIELDS_DISPLAYED", + "id": "def-common.ORCHESTRATOR_RESOURCE_ID_FIELD", "type": "string", "tags": [], - "label": "MAX_DOC_FIELDS_DISPLAYED", + "label": "ORCHESTRATOR_RESOURCE_ID_FIELD", "description": [], "signature": [ - "\"discover:maxDocFieldsDisplayed\"" + "\"orchestrator.resource.id\"" ], - "path": "packages/kbn-discover-utils/src/constants.ts", + "path": "packages/kbn-discover-utils/src/field_constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "@kbn/discover-utils", - "id": "def-common.MODIFY_COLUMNS_ON_SWITCH", + "id": "def-common.RESOURCE_FIELD", "type": "string", "tags": [], - "label": "MODIFY_COLUMNS_ON_SWITCH", + "label": "RESOURCE_FIELD", "description": [], "signature": [ - "\"discover:modifyColumnsOnSwitch\"" + "\"resource\"" ], - "path": "packages/kbn-discover-utils/src/constants.ts", + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -3376,6 +3917,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.SERVICE_NAME_FIELD", + "type": "string", + "tags": [], + "label": "SERVICE_NAME_FIELD", + "description": [], + "signature": [ + "\"service.name\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.SERVICE_NAME_FIELDS", + "type": "Array", + "tags": [], + "label": "SERVICE_NAME_FIELDS", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/discover-utils", "id": "def-common.ShouldShowFieldInTableHandler", @@ -3450,6 +4021,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.TIMESTAMP_FIELD", + "type": "string", + "tags": [], + "label": "TIMESTAMP_FIELD", + "description": [], + "signature": [ + "\"@timestamp\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.TRACE_ID_FIELD", + "type": "string", + "tags": [], + "label": "TRACE_ID_FIELD", + "description": [], + "signature": [ + "\"trace.id\"" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/discover-utils", "id": "def-common.TRUNCATE_MAX_HEIGHT", @@ -3481,6 +4082,187 @@ "initialIsOpen": false } ], - "objects": [] + "objects": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CONTENT_FIELD_CONFIGURATION", + "type": "Object", + "tags": [], + "label": "CONTENT_FIELD_CONFIGURATION", + "description": [], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CONTENT_FIELD_CONFIGURATION.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"smart-field\"" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CONTENT_FIELD_CONFIGURATION.smartField", + "type": "string", + "tags": [], + "label": "smartField", + "description": [], + "signature": [ + "\"content\"" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.CONTENT_FIELD_CONFIGURATION.fallbackFields", + "type": "Array", + "tags": [], + "label": "fallbackFields", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.DEGRADED_DOCS_FIELDS", + "type": "Object", + "tags": [], + "label": "DEGRADED_DOCS_FIELDS", + "description": [], + "signature": [ + "readonly [\"_ignored\", \"ignored_field_values\"]" + ], + "path": "packages/kbn-discover-utils/src/field_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RESOURCE_FIELD_CONFIGURATION", + "type": "Object", + "tags": [], + "label": "RESOURCE_FIELD_CONFIGURATION", + "description": [], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RESOURCE_FIELD_CONFIGURATION.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"smart-field\"" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RESOURCE_FIELD_CONFIGURATION.smartField", + "type": "string", + "tags": [], + "label": "smartField", + "description": [], + "signature": [ + "\"resource\"" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RESOURCE_FIELD_CONFIGURATION.fallbackFields", + "type": "Array", + "tags": [], + "label": "fallbackFields", + "description": [], + "signature": [ + "string[]" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.RESOURCE_FIELD_CONFIGURATION.width", + "type": "number", + "tags": [], + "label": "width", + "description": [], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.SMART_FALLBACK_FIELDS", + "type": "Object", + "tags": [], + "label": "SMART_FALLBACK_FIELDS", + "description": [], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.SMART_FALLBACK_FIELDS.CONTENT_FIELD", + "type": "Object", + "tags": [], + "label": "[CONTENT_FIELD]", + "description": [], + "signature": [ + "SmartFieldGridColumnOptions" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/discover-utils", + "id": "def-common.SMART_FALLBACK_FIELDS.RESOURCE_FIELD", + "type": "Object", + "tags": [], + "label": "[RESOURCE_FIELD]", + "description": [], + "signature": [ + "SmartFieldGridColumnOptions" + ], + "path": "packages/kbn-discover-utils/src/data_types/logs/constants.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ] } } \ No newline at end of file diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 10757cf37cb5c..10ec6e859d318 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; @@ -21,10 +21,13 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 181 | 0 | 147 | 1 | +| 234 | 0 | 200 | 4 | ## Common +### Objects + + ### Functions diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 2f60492005fa9..13e09364b3cd5 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-10-24 +date: 2024-10-25 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 c29e85f798321..9b173b0d346eb 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-10-24 +date: 2024-10-25 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 78e5e8caa2e1f..72ddaf0b2e5f3 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-10-24 +date: 2024-10-25 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 9fb8765438dad..782221793ba6f 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-10-24 +date: 2024-10-25 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 eeb202bc59302..eb5ed51b104fb 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-10-24 +date: 2024-10-25 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 69ec49fb34abb..42fbfb0bd0a17 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-10-24 +date: 2024-10-25 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 629be95ec3fc7..fe27e860436a9 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-10-24 +date: 2024-10-25 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 570a31d6e5434..1c61735c5d90c 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index d313ebb1306ac..421b1ed14a799 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index c7b0ebb5874dd..ecd91a632b60f 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-10-24 +date: 2024-10-25 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 55707e9a38768..fe45478f29a0c 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-10-24 +date: 2024-10-25 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 f295049c285ea..3129cbb435063 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-10-24 +date: 2024-10-25 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 122e111454de1..4c257f0fbdf40 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-10-24 +date: 2024-10-25 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 33cfd56d45220..ec6bbb652b0b1 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-10-24 +date: 2024-10-25 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 6e77d2213edfc..cc4f89070d784 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-10-24 +date: 2024-10-25 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 19fe99f93f78e..1b6b1edf1a988 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_editor.mdx b/api_docs/kbn_esql_editor.mdx index e03146f39e378..1409e7d9da87f 100644 --- a/api_docs/kbn_esql_editor.mdx +++ b/api_docs/kbn_esql_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-editor title: "@kbn/esql-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-editor plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-editor'] --- import kbnEsqlEditorObj from './kbn_esql_editor.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 2ec3411c954be..7be3a7ab1705f 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-10-24 +date: 2024-10-25 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 89b610257e42a..8fad3f8784a8c 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-10-24 +date: 2024-10-25 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 d98f0b0115fdc..b951b786d4521 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-10-24 +date: 2024-10-25 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 4b34d02751a58..11c650bcd9f43 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-10-24 +date: 2024-10-25 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 b35a6c59d7a8b..f6d11d4461046 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-10-24 +date: 2024-10-25 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 e9c21d7f729de..e902fa17bcedf 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-10-24 +date: 2024-10-25 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 649469038a671..fc317182455ef 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-10-24 +date: 2024-10-25 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 603c676515bf3..59e819b16728e 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-10-24 +date: 2024-10-25 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 246393d698791..4b8160ff489d0 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-10-24 +date: 2024-10-25 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 f81cabc48d332..3046218767b28 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-10-24 +date: 2024-10-25 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 c28175e7152e4..581c52131c378 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-10-24 +date: 2024-10-25 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 42be7bae5cf30..7a2bad84b1315 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-10-24 +date: 2024-10-25 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 d9eb05cdee8a2..374fe7901ed4c 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-10-24 +date: 2024-10-25 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 830fdbea1f590..f933a8338f91f 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grid_layout.mdx b/api_docs/kbn_grid_layout.mdx index a5dd8bb8b9464..adf471b5feef3 100644 --- a/api_docs/kbn_grid_layout.mdx +++ b/api_docs/kbn_grid_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grid-layout title: "@kbn/grid-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grid-layout plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grid-layout'] --- import kbnGridLayoutObj from './kbn_grid_layout.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index affb1d2442f8c..5309134ccf8d0 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 07feed0a2f9b0..54ee126becf5b 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-10-24 +date: 2024-10-25 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 83c9a60809a28..667b48db81445 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-10-24 +date: 2024-10-25 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 ea3f6bd083270..45730b7212c56 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-10-24 +date: 2024-10-25 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 75e2918850da6..4dcb5020eb81b 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-10-24 +date: 2024-10-25 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 0a6c849e2d27e..f3d1028bee0d7 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-10-24 +date: 2024-10-25 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 a3b5c18877998..a307ee6e52d21 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-10-24 +date: 2024-10-25 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 24c51107b6757..5bb93c3d44187 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-10-24 +date: 2024-10-25 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 7365b9cf56c0c..8e465b481a286 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-10-24 +date: 2024-10-25 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 6835ab654ec62..2a19c27cfdbba 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management_shared_types.devdocs.json b/api_docs/kbn_index_management_shared_types.devdocs.json index cfb22c8dc0d9e..532c3a1bdcda9 100644 --- a/api_docs/kbn_index_management_shared_types.devdocs.json +++ b/api_docs/kbn_index_management_shared_types.devdocs.json @@ -523,7 +523,7 @@ "section": "def-common.IndexDetailsPageRoute", "text": "IndexDetailsPageRoute" }, - ") => void" + ", detailsTabId?: string | undefined) => void" ], "path": "x-pack/packages/index-management/index_management_shared_types/src/services/extensions_service.ts", "deprecated": false, @@ -549,6 +549,21 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "@kbn/index-management-shared-types", + "id": "def-common.ExtensionsSetup.setIndexDetailsPageRoute.$2", + "type": "string", + "tags": [], + "label": "detailsTabId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/packages/index-management/index_management_shared_types/src/services/extensions_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [] @@ -1034,7 +1049,7 @@ "label": "renderRoute", "description": [], "signature": [ - "(indexName: string) => string" + "(indexName: string, detailsTabId?: string | undefined) => string" ], "path": "x-pack/packages/index-management/index_management_shared_types/src/services/extensions_service.ts", "deprecated": false, @@ -1054,6 +1069,21 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "@kbn/index-management-shared-types", + "id": "def-common.IndexDetailsPageRoute.renderRoute.$2", + "type": "string", + "tags": [], + "label": "detailsTabId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/packages/index-management/index_management_shared_types/src/services/extensions_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [] diff --git a/api_docs/kbn_index_management_shared_types.mdx b/api_docs/kbn_index_management_shared_types.mdx index b3592adaed27c..9902a95586dea 100644 --- a/api_docs/kbn_index_management_shared_types.mdx +++ b/api_docs/kbn_index_management_shared_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management-shared-types title: "@kbn/index-management-shared-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management-shared-types plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management-shared-types'] --- import kbnIndexManagementSharedTypesObj from './kbn_index_management_shared_types.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kiban | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 124 | 3 | 124 | 0 | +| 126 | 3 | 126 | 0 | ## Common diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index ac27018c2f3ff..8e95c5959784c 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-10-24 +date: 2024-10-25 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 43150f2f556b3..7decfdca2c478 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-10-24 +date: 2024-10-25 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 b8fed5edc9fd4..1dd2226abf4cb 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_investigation_shared.mdx b/api_docs/kbn_investigation_shared.mdx index 61e2c59ca03cf..c5bd54e8374b2 100644 --- a/api_docs/kbn_investigation_shared.mdx +++ b/api_docs/kbn_investigation_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-investigation-shared title: "@kbn/investigation-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/investigation-shared plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/investigation-shared'] --- import kbnInvestigationSharedObj from './kbn_investigation_shared.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 779de9c3ba849..cf51181704dd9 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-10-24 +date: 2024-10-25 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 aca26680391e1..f89bc85826c7c 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_item_buffer.mdx b/api_docs/kbn_item_buffer.mdx index e238e311fae61..ed03e400a21b9 100644 --- a/api_docs/kbn_item_buffer.mdx +++ b/api_docs/kbn_item_buffer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-item-buffer title: "@kbn/item-buffer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/item-buffer plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/item-buffer'] --- import kbnItemBufferObj from './kbn_item_buffer.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 346ed1307acb5..718fcf966ced6 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-10-24 +date: 2024-10-25 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 a5973f75e5229..5cde98628f4fc 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-10-24 +date: 2024-10-25 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 79b2c1083c6e0..eb061414a8b8d 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_json_schemas.mdx b/api_docs/kbn_json_schemas.mdx index 9d9a8e0942e9d..6128d220c1066 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-schemas'] --- import kbnJsonSchemasObj from './kbn_json_schemas.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index ce2895c28a010..564d38cf64ba0 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-10-24 +date: 2024-10-25 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.mdx b/api_docs/kbn_language_documentation.mdx index 4cb5df56da3d7..40b2661ac1191 100644 --- a/api_docs/kbn_language_documentation.mdx +++ b/api_docs/kbn_language_documentation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation title: "@kbn/language-documentation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation'] --- import kbnLanguageDocumentationObj from './kbn_language_documentation.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 8363bed376074..e9e7d4b8d37ea 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-10-24 +date: 2024-10-25 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 3af2e063a80fa..e443971960cc6 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-10-24 +date: 2024-10-25 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 c3771a2efafb0..18262df1c99f6 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-10-24 +date: 2024-10-25 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 6c21ab3c5702b..87f81cfa1701c 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-10-24 +date: 2024-10-25 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 f27e92755d3d4..156a29789cf9f 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-10-24 +date: 2024-10-25 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 b20f954729a57..903c451d69cc1 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-10-24 +date: 2024-10-25 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 f19508644a759..24d3f45b0e09b 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-10-24 +date: 2024-10-25 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 1d836867112ed..d6217af2a9ce1 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-10-24 +date: 2024-10-25 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 04af4cb8bdaf5..0a8a72ec52299 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-10-24 +date: 2024-10-25 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 8d46a1cec735c..706a888e336d3 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-10-24 +date: 2024-10-25 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 4df6d303d000e..f6df4194023b3 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-10-24 +date: 2024-10-25 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 2fbd974dfd693..4b0a63da5cac4 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-10-24 +date: 2024-10-25 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 9aca16df027a3..9ceeb594828fc 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-10-24 +date: 2024-10-25 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 d80da012989c1..9573d05bbd967 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-10-24 +date: 2024-10-25 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 d48c4fb58b71c..93344ca090a73 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-10-24 +date: 2024-10-25 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 2718815816431..590c1c4615da8 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-10-24 +date: 2024-10-25 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 e331df415b004..2286f1792e48f 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-10-24 +date: 2024-10-25 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 d112f7f711464..5030148051d49 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_manifest.mdx b/api_docs/kbn_manifest.mdx index eab05016b0781..defcb3fb78c19 100644 --- a/api_docs/kbn_manifest.mdx +++ b/api_docs/kbn_manifest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-manifest title: "@kbn/manifest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/manifest plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/manifest'] --- import kbnManifestObj from './kbn_manifest.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 1dc75e2bd15d8..d76af270abf3e 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-10-24 +date: 2024-10-25 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 772c2db275abf..77f8b5f688e22 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-10-24 +date: 2024-10-25 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 1e304bc971f6d..4052a7e5184f8 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-10-24 +date: 2024-10-25 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 10c93e64321ff..e28f1fc92c187 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-10-24 +date: 2024-10-25 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 d4ba18b9f16e9..61f8a944c0892 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-10-24 +date: 2024-10-25 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 b2a3fca81adfa..76e19d40a636e 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-10-24 +date: 2024-10-25 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 220de4f84cf84..5aa3570bcfae5 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-10-24 +date: 2024-10-25 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 151ed86d568e8..b4fcf7ab8f0c2 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-10-24 +date: 2024-10-25 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 5e9cc1871e6aa..b101733529e2e 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-10-24 +date: 2024-10-25 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 6591030da75bb..73c4fe3a72aa2 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-10-24 +date: 2024-10-25 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 105c825f80d19..45c95511f5090 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-10-24 +date: 2024-10-25 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 22d9b3204d1e2..d383bd3b2df7a 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-10-24 +date: 2024-10-25 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_field_stats_flyout.mdx b/api_docs/kbn_ml_field_stats_flyout.mdx index 24ea3ef0382d4..c534ea37f9794 100644 --- a/api_docs/kbn_ml_field_stats_flyout.mdx +++ b/api_docs/kbn_ml_field_stats_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-field-stats-flyout title: "@kbn/ml-field-stats-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-field-stats-flyout plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-field-stats-flyout'] --- import kbnMlFieldStatsFlyoutObj from './kbn_ml_field_stats_flyout.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 409fa6e07494a..17f3001836a0a 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-10-24 +date: 2024-10-25 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 43e597ee21b30..0b0a0d0a64fac 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-10-24 +date: 2024-10-25 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 ffefb9c6ca19c..6d94ff686a9ae 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-10-24 +date: 2024-10-25 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 719b33ec53994..b48fa9d764cdb 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-10-24 +date: 2024-10-25 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 2b5893c9c295e..636e25e819407 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-10-24 +date: 2024-10-25 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 5296c2dbaccad..e45673e76502a 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-10-24 +date: 2024-10-25 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 bf6232a4827ff..345472ed17925 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-10-24 +date: 2024-10-25 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_parse_interval.mdx b/api_docs/kbn_ml_parse_interval.mdx index 6f96cb6e6f94c..5e839b98de318 100644 --- a/api_docs/kbn_ml_parse_interval.mdx +++ b/api_docs/kbn_ml_parse_interval.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-parse-interval title: "@kbn/ml-parse-interval" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-parse-interval plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-parse-interval'] --- import kbnMlParseIntervalObj from './kbn_ml_parse_interval.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index c64c059e5ed05..0ee1aa66f6c0e 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-10-24 +date: 2024-10-25 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 352a55b529ea1..87f1f04b3af0e 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-10-24 +date: 2024-10-25 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 c646654becebc..7b745db75a7c6 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-10-24 +date: 2024-10-25 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 1c47a531cf254..67f62124cb887 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-10-24 +date: 2024-10-25 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 4497bb7ffc4c6..6a5644d94fb88 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-10-24 +date: 2024-10-25 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 d6da826dc5ba9..718d146361bcf 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-10-24 +date: 2024-10-25 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 af8cd6a5f0449..8cfd0f206aad3 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-10-24 +date: 2024-10-25 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 a1ad069335119..2a8141166f14d 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-10-24 +date: 2024-10-25 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 76ff92117272f..76a494713f894 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_ml_validators.mdx b/api_docs/kbn_ml_validators.mdx index ef17b9c932dab..d0c0b165f58ad 100644 --- a/api_docs/kbn_ml_validators.mdx +++ b/api_docs/kbn_ml_validators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-validators title: "@kbn/ml-validators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-validators plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-validators'] --- import kbnMlValidatorsObj from './kbn_ml_validators.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 9d781ae8ef90b..bb3ed1181d1a2 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-10-24 +date: 2024-10-25 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 89067681d89d1..1ed0a07d3fc0a 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-10-24 +date: 2024-10-25 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 01acce6ddca1a..c22c7c8691581 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_object_versioning_utils.mdx b/api_docs/kbn_object_versioning_utils.mdx index 9f26696d1e97a..262d2dc8cc2f4 100644 --- a/api_docs/kbn_object_versioning_utils.mdx +++ b/api_docs/kbn_object_versioning_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning-utils title: "@kbn/object-versioning-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning-utils plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning-utils'] --- import kbnObjectVersioningUtilsObj from './kbn_object_versioning_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index cbc063a9ee9c1..5865ccb841455 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-10-24 +date: 2024-10-25 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_rule_utils.mdx b/api_docs/kbn_observability_alerting_rule_utils.mdx index 9fe0fb4744d89..138124da68d34 100644 --- a/api_docs/kbn_observability_alerting_rule_utils.mdx +++ b/api_docs/kbn_observability_alerting_rule_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-rule-utils title: "@kbn/observability-alerting-rule-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-rule-utils plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-rule-utils'] --- import kbnObservabilityAlertingRuleUtilsObj from './kbn_observability_alerting_rule_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 1992171a0064b..7b178f99c2fa2 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-10-24 +date: 2024-10-25 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 0da3e233e1801..19a62d9f06c06 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-10-24 +date: 2024-10-25 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_observability_logs_overview.devdocs.json b/api_docs/kbn_observability_logs_overview.devdocs.json index 9c980ee061d37..43156c3b352e4 100644 --- a/api_docs/kbn_observability_logs_overview.devdocs.json +++ b/api_docs/kbn_observability_logs_overview.devdocs.json @@ -176,8 +176,8 @@ "pluginId": "dataViews", "scope": "common", "docId": "kibDataViewsPluginApi", - "section": "def-common.AbstractDataView", - "text": "AbstractDataView" + "section": "def-common.DataView", + "text": "DataView" } ], "path": "x-pack/packages/observability/logs_overview/src/utils/logs_source.ts", @@ -314,6 +314,8 @@ "LogCategoriesGridHistogramCellDependencies", " & ", "LogCategoriesGridChangeTimeCellDependencies", + " & ", + "LogCategoryDocumentExamplesTableDependencies", " & { search: ", { "pluginId": "@kbn/search-types", @@ -324,7 +326,15 @@ }, "; } & { logsDataAccess: { services: { logSourcesService: ", "LogSourcesService", - "; }; }; }" + "; }; }; dataViews: ", + { + "pluginId": "dataViews", + "scope": "public", + "docId": "kibDataViewsPluginApi", + "section": "def-public.DataViewsServicePublic", + "text": "DataViewsServicePublic" + }, + "; }" ], "path": "x-pack/packages/observability/logs_overview/src/components/logs_overview/logs_overview.tsx", "deprecated": false, @@ -455,6 +465,8 @@ "LogCategoriesGridHistogramCellDependencies", " & ", "LogCategoriesGridChangeTimeCellDependencies", + " & ", + "LogCategoryDocumentExamplesTableDependencies", " & { search: ", { "pluginId": "@kbn/search-types", @@ -465,7 +477,15 @@ }, "; } & { logsDataAccess: { services: { logSourcesService: ", "LogSourcesService", - "; }; }; }" + "; }; }; dataViews: ", + { + "pluginId": "dataViews", + "scope": "public", + "docId": "kibDataViewsPluginApi", + "section": "def-public.DataViewsServicePublic", + "text": "DataViewsServicePublic" + }, + "; }" ], "path": "x-pack/packages/observability/logs_overview/src/components/logs_overview/logs_overview.tsx", "deprecated": false, diff --git a/api_docs/kbn_observability_logs_overview.mdx b/api_docs/kbn_observability_logs_overview.mdx index 498633eefc4c8..5fe22eaae5415 100644 --- a/api_docs/kbn_observability_logs_overview.mdx +++ b/api_docs/kbn_observability_logs_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-logs-overview title: "@kbn/observability-logs-overview" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-logs-overview plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-logs-overview'] --- import kbnObservabilityLogsOverviewObj from './kbn_observability_logs_overview.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 | |-------------------|-----------|------------------------|-----------------| -| 29 | 0 | 27 | 3 | +| 29 | 0 | 27 | 4 | ## Client diff --git a/api_docs/kbn_observability_synthetics_test_data.mdx b/api_docs/kbn_observability_synthetics_test_data.mdx index 2691732ed9e5c..9dd17bd7a5a88 100644 --- a/api_docs/kbn_observability_synthetics_test_data.mdx +++ b/api_docs/kbn_observability_synthetics_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-synthetics-test-data title: "@kbn/observability-synthetics-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-synthetics-test-data plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-synthetics-test-data'] --- import kbnObservabilitySyntheticsTestDataObj from './kbn_observability_synthetics_test_data.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 5f9b4d5c59fbe..daf8ee5ca9312 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-10-24 +date: 2024-10-25 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 ef82dc2240bd8..147dddf3bd965 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-10-24 +date: 2024-10-25 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 e7a08328125a9..d48c9c1a3110f 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-10-24 +date: 2024-10-25 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 d8710d1994b37..209b021bb6332 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-10-24 +date: 2024-10-25 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 08a954ce8bedd..6ee8c445269e0 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-10-24 +date: 2024-10-25 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 98497c5014770..64c8c19437ce1 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-10-24 +date: 2024-10-25 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 830692290562e..37548d98c61bc 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-10-24 +date: 2024-10-25 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 2731107736a37..b7f27290b864f 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-10-24 +date: 2024-10-25 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 5cf0010cabece..106022fe20fea 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-10-24 +date: 2024-10-25 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 a1e8d6fb77d25..5ab0261f37aa3 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-10-24 +date: 2024-10-25 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 c53c3bb5db04a..652d217f5d493 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-10-24 +date: 2024-10-25 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 ced581a4c3716..5f6b2108f36da 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_product_doc_artifact_builder.mdx b/api_docs/kbn_product_doc_artifact_builder.mdx index 27906026a3a58..518e0604a0377 100644 --- a/api_docs/kbn_product_doc_artifact_builder.mdx +++ b/api_docs/kbn_product_doc_artifact_builder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-product-doc-artifact-builder title: "@kbn/product-doc-artifact-builder" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/product-doc-artifact-builder plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/product-doc-artifact-builder'] --- import kbnProductDocArtifactBuilderObj from './kbn_product_doc_artifact_builder.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index f5b837d955f93..ba3643b36fccc 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-10-24 +date: 2024-10-25 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 c29eb601ef06d..179df1e7802f4 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-10-24 +date: 2024-10-25 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 01f92485140e3..52e5a8f8e42c3 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index 5231dac306589..eed47c302931c 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index aa58df9b3f3cd..fc031d2c6dbb1 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-10-24 +date: 2024-10-25 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 c982453cc508a..50c7b26242190 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-10-24 +date: 2024-10-25 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 80bf2e9a894eb..b699c7a5eacd2 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-10-24 +date: 2024-10-25 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 c50c21cefbb2d..5fbe47b8ecc78 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-10-24 +date: 2024-10-25 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 f39d0990c6c86..9fec1092fc09b 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-10-24 +date: 2024-10-25 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 da2e8df6af3ba..26ea4ec39cc10 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx index 4b420ff4ea28b..5145ce0100674 100644 --- a/api_docs/kbn_recently_accessed.mdx +++ b/api_docs/kbn_recently_accessed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-recently-accessed title: "@kbn/recently-accessed" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/recently-accessed plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] --- import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index aa391c71440b5..777dc475f1316 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-10-24 +date: 2024-10-25 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 ee6bef619fa75..9f9d4402db837 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-10-24 +date: 2024-10-25 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 1590607a4aa8e..c3f5229d16b8b 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-10-24 +date: 2024-10-25 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 70cecf2eadc23..161eea6aa904d 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-10-24 +date: 2024-10-25 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 7f38487a5971e..b98e8752ba075 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-10-24 +date: 2024-10-25 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 28c69946fc45b..d2ee5c2cf9775 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-10-24 +date: 2024-10-25 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 27ec46307e090..98433d7ffc6a1 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-10-24 +date: 2024-10-25 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 42cd225d97770..a25391affc31f 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-10-24 +date: 2024-10-25 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 0edbe3b0b1df5..ee400bc3d1d15 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-10-24 +date: 2024-10-25 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 6186066bb6bc9..c387b153beef1 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-10-24 +date: 2024-10-25 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 8366182dc3ba9..d598f7aa96cc4 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-10-24 +date: 2024-10-25 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 eef81b3da3ae7..4b4c80984dffd 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-10-24 +date: 2024-10-25 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 217aaea7ef540..531f5834c0502 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-10-24 +date: 2024-10-25 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 ebcdbba42865b..0a6870e601248 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-10-24 +date: 2024-10-25 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 9570c7c300ecd..ae4e9007d5dca 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-10-24 +date: 2024-10-25 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 a21dd8d7e3821..7f50cea37fe5a 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_response_ops_feature_flag_service.mdx b/api_docs/kbn_response_ops_feature_flag_service.mdx index b013f86b35189..70a1959803c8a 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_response_ops_rule_params.mdx b/api_docs/kbn_response_ops_rule_params.mdx index 88e4d676ab408..9104bde74f7a4 100644 --- a/api_docs/kbn_response_ops_rule_params.mdx +++ b/api_docs/kbn_response_ops_rule_params.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-rule-params title: "@kbn/response-ops-rule-params" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-rule-params plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-rule-params'] --- import kbnResponseOpsRuleParamsObj from './kbn_response_ops_rule_params.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 5899bb7f3c7ce..354f825ba512e 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index c438a0c052ba2..4fb97db26f75b 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rollup'] --- import kbnRollupObj from './kbn_rollup.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index 6f3297c1c9043..a2c32e9592167 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-10-24 +date: 2024-10-25 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 9875b5cb9e87c..825439d5afd8e 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-10-24 +date: 2024-10-25 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 86119a9dc91a9..c2ab6baa4e106 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-10-24 +date: 2024-10-25 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 49768d5de76ac..825f9480ae0c9 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-10-24 +date: 2024-10-25 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 fce8c568bd63e..d9f78298097a2 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_screenshotting_server.devdocs.json b/api_docs/kbn_screenshotting_server.devdocs.json index f320f3ca33d1e..0765d90fb39bc 100644 --- a/api_docs/kbn_screenshotting_server.devdocs.json +++ b/api_docs/kbn_screenshotting_server.devdocs.json @@ -354,7 +354,7 @@ "section": "def-common.Logger", "text": "Logger" }, - ", config: Readonly<{} & { enabled: boolean; capture: Readonly<{ loadDelay?: number | moment.Duration | undefined; } & { zoom: number; timeouts: Readonly<{} & { renderComplete: number | moment.Duration; openUrl: number | moment.Duration; waitForElements: number | moment.Duration; }>; }>; browser: Readonly<{} & { autoDownload: boolean; chromium: Readonly<{ inspect?: boolean | undefined; disableSandbox?: boolean | undefined; } & { proxy: Readonly<{ server?: string | undefined; bypass?: string[] | undefined; } & { enabled: boolean; }>; }>; }>; networkPolicy: Readonly<{} & { enabled: boolean; rules: Readonly<{ host?: string | undefined; protocol?: string | undefined; } & { allow: boolean; }>[]; }>; poolSize: number; }>) => Promise; }>; browser: Readonly<{} & { autoDownload: boolean; chromium: Readonly<{ inspect?: boolean | undefined; disableSandbox?: boolean | undefined; } & { proxy: Readonly<{ server?: string | undefined; bypass?: string[] | undefined; } & { enabled: boolean; }>; }>; }>; networkPolicy: Readonly<{} & { enabled: boolean; rules: Readonly<{ host?: string | undefined; protocol?: string | undefined; } & { allow: boolean; }>[]; }>; poolSize: number; }>>" + ", config: Readonly<{} & { enabled: boolean; capture: Readonly<{ loadDelay?: number | moment.Duration | undefined; } & { zoom: number; timeouts: Readonly<{} & { renderComplete: number | moment.Duration; openUrl: number | moment.Duration; waitForElements: number | moment.Duration; }>; }>; browser: Readonly<{} & { autoDownload: boolean; chromium: Readonly<{ disableSandbox?: boolean | undefined; } & { proxy: Readonly<{ server?: string | undefined; bypass?: string[] | undefined; } & { enabled: boolean; }>; }>; }>; networkPolicy: Readonly<{} & { enabled: boolean; rules: Readonly<{ host?: string | undefined; protocol?: string | undefined; } & { allow: boolean; }>[]; }>; poolSize: number; }>) => Promise; }>; browser: Readonly<{} & { autoDownload: boolean; chromium: Readonly<{ disableSandbox?: boolean | undefined; } & { proxy: Readonly<{ server?: string | undefined; bypass?: string[] | undefined; } & { enabled: boolean; }>; }>; }>; networkPolicy: Readonly<{} & { enabled: boolean; rules: Readonly<{ host?: string | undefined; protocol?: string | undefined; } & { allow: boolean; }>[]; }>; poolSize: number; }>>" ], "path": "packages/kbn-screenshotting-server/src/config/create_config.ts", "deprecated": false, @@ -389,7 +389,7 @@ "label": "config", "description": [], "signature": [ - "Readonly<{} & { enabled: boolean; capture: Readonly<{ loadDelay?: number | moment.Duration | undefined; } & { zoom: number; timeouts: Readonly<{} & { renderComplete: number | moment.Duration; openUrl: number | moment.Duration; waitForElements: number | moment.Duration; }>; }>; browser: Readonly<{} & { autoDownload: boolean; chromium: Readonly<{ inspect?: boolean | undefined; disableSandbox?: boolean | undefined; } & { proxy: Readonly<{ server?: string | undefined; bypass?: string[] | undefined; } & { enabled: boolean; }>; }>; }>; networkPolicy: Readonly<{} & { enabled: boolean; rules: Readonly<{ host?: string | undefined; protocol?: string | undefined; } & { allow: boolean; }>[]; }>; poolSize: number; }>" + "Readonly<{} & { enabled: boolean; capture: Readonly<{ loadDelay?: number | moment.Duration | undefined; } & { zoom: number; timeouts: Readonly<{} & { renderComplete: number | moment.Duration; openUrl: number | moment.Duration; waitForElements: number | moment.Duration; }>; }>; browser: Readonly<{} & { autoDownload: boolean; chromium: Readonly<{ disableSandbox?: boolean | undefined; } & { proxy: Readonly<{ server?: string | undefined; bypass?: string[] | undefined; } & { enabled: boolean; }>; }>; }>; networkPolicy: Readonly<{} & { enabled: boolean; rules: Readonly<{ host?: string | undefined; protocol?: string | undefined; } & { allow: boolean; }>[]; }>; poolSize: number; }>" ], "path": "packages/kbn-screenshotting-server/src/config/create_config.ts", "deprecated": false, @@ -594,7 +594,7 @@ "label": "ConfigType", "description": [], "signature": [ - "{ readonly enabled: boolean; readonly capture: Readonly<{ loadDelay?: number | moment.Duration | undefined; } & { zoom: number; timeouts: Readonly<{} & { renderComplete: number | moment.Duration; openUrl: number | moment.Duration; waitForElements: number | moment.Duration; }>; }>; readonly browser: Readonly<{} & { autoDownload: boolean; chromium: Readonly<{ inspect?: boolean | undefined; disableSandbox?: boolean | undefined; } & { proxy: Readonly<{ server?: string | undefined; bypass?: string[] | undefined; } & { enabled: boolean; }>; }>; }>; readonly networkPolicy: Readonly<{} & { enabled: boolean; rules: Readonly<{ host?: string | undefined; protocol?: string | undefined; } & { allow: boolean; }>[]; }>; readonly poolSize: number; }" + "{ readonly enabled: boolean; readonly capture: Readonly<{ loadDelay?: number | moment.Duration | undefined; } & { zoom: number; timeouts: Readonly<{} & { renderComplete: number | moment.Duration; openUrl: number | moment.Duration; waitForElements: number | moment.Duration; }>; }>; readonly browser: Readonly<{} & { autoDownload: boolean; chromium: Readonly<{ disableSandbox?: boolean | undefined; } & { proxy: Readonly<{ server?: string | undefined; bypass?: string[] | undefined; } & { enabled: boolean; }>; }>; }>; readonly networkPolicy: Readonly<{} & { enabled: boolean; rules: Readonly<{ host?: string | undefined; protocol?: string | undefined; } & { allow: boolean; }>[]; }>; readonly poolSize: number; }" ], "path": "packages/kbn-screenshotting-server/src/config/schema.ts", "deprecated": false, @@ -674,15 +674,7 @@ "section": "def-common.ObjectType", "text": "ObjectType" }, - "<{ inspect: ", - { - "pluginId": "@kbn/config-schema", - "scope": "common", - "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-common.ConditionalType", - "text": "ConditionalType" - }, - "; disableSandbox: ", + "<{ disableSandbox: ", { "pluginId": "@kbn/config-schema", "scope": "common", diff --git a/api_docs/kbn_screenshotting_server.mdx b/api_docs/kbn_screenshotting_server.mdx index f91e379cf0c8b..089926a228478 100644 --- a/api_docs/kbn_screenshotting_server.mdx +++ b/api_docs/kbn_screenshotting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-screenshotting-server title: "@kbn/screenshotting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/screenshotting-server plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/screenshotting-server'] --- import kbnScreenshottingServerObj from './kbn_screenshotting_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_components.mdx b/api_docs/kbn_search_api_keys_components.mdx index efdf98cc9edf3..928a5315021db 100644 --- a/api_docs/kbn_search_api_keys_components.mdx +++ b/api_docs/kbn_search_api_keys_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-components title: "@kbn/search-api-keys-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-components plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-components'] --- import kbnSearchApiKeysComponentsObj from './kbn_search_api_keys_components.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_server.mdx b/api_docs/kbn_search_api_keys_server.mdx index c72af04c3d7de..c5c33b39fbcab 100644 --- a/api_docs/kbn_search_api_keys_server.mdx +++ b/api_docs/kbn_search_api_keys_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-server title: "@kbn/search-api-keys-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-server plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-server'] --- import kbnSearchApiKeysServerObj from './kbn_search_api_keys_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 724161af9c376..38a2c78aadebb 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-10-24 +date: 2024-10-25 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 f6d6e0c1b5d55..c4da56c56cb12 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-10-24 +date: 2024-10-25 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 728996daa84be..ad21eef5ab11c 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-10-24 +date: 2024-10-25 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 6c7d6b0e425f5..bef1354fab895 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-10-24 +date: 2024-10-25 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 5d87c05626abb..99097ebc6da24 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_shared_ui.mdx b/api_docs/kbn_search_shared_ui.mdx index 5e1dcf4044ada..7cc87cdeb0226 100644 --- a/api_docs/kbn_search_shared_ui.mdx +++ b/api_docs/kbn_search_shared_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-shared-ui title: "@kbn/search-shared-ui" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-shared-ui plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-shared-ui'] --- import kbnSearchSharedUiObj from './kbn_search_shared_ui.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index ce4627c62ab75..23094c67584bc 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx index 275f4d5d54d8e..24d77665f0b1a 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-api-key-management title: "@kbn/security-api-key-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-api-key-management plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] --- import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core.mdx b/api_docs/kbn_security_authorization_core.mdx index 1800c7ac7eb4b..3966037b09c1d 100644 --- a/api_docs/kbn_security_authorization_core.mdx +++ b/api_docs/kbn_security_authorization_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core title: "@kbn/security-authorization-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core'] --- import kbnSecurityAuthorizationCoreObj from './kbn_security_authorization_core.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core_common.mdx b/api_docs/kbn_security_authorization_core_common.mdx index cd4fd6bb4374c..4687d5ed6ebfc 100644 --- a/api_docs/kbn_security_authorization_core_common.mdx +++ b/api_docs/kbn_security_authorization_core_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core-common title: "@kbn/security-authorization-core-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core-common plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core-common'] --- import kbnSecurityAuthorizationCoreCommonObj from './kbn_security_authorization_core_common.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index e44b796fc598d..9266b8dadce38 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-form-components title: "@kbn/security-form-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-form-components plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] --- import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 3699ab2e157b2..07620e7a90d21 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-10-24 +date: 2024-10-25 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 d6cd03dff66e9..d89d0ebef21be 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-10-24 +date: 2024-10-25 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 39c53f51defb3..527ced0963d2c 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-10-24 +date: 2024-10-25 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 f5ed0a2ca46f2..729078564a46f 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-10-24 +date: 2024-10-25 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_role_management_model.mdx b/api_docs/kbn_security_role_management_model.mdx index 9e4f63765a0f6..bb007a8bd2060 100644 --- a/api_docs/kbn_security_role_management_model.mdx +++ b/api_docs/kbn_security_role_management_model.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-role-management-model title: "@kbn/security-role-management-model" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-role-management-model plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-role-management-model'] --- import kbnSecurityRoleManagementModelObj from './kbn_security_role_management_model.devdocs.json'; diff --git a/api_docs/kbn_security_solution_common.mdx b/api_docs/kbn_security_solution_common.mdx index 8b4ac9b45d9a3..77ba68e966f36 100644 --- a/api_docs/kbn_security_solution_common.mdx +++ b/api_docs/kbn_security_solution_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-common title: "@kbn/security-solution-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-common plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-common'] --- import kbnSecuritySolutionCommonObj from './kbn_security_solution_common.devdocs.json'; diff --git a/api_docs/kbn_security_solution_distribution_bar.mdx b/api_docs/kbn_security_solution_distribution_bar.mdx index c67c232cd26ef..07ded1ff38392 100644 --- a/api_docs/kbn_security_solution_distribution_bar.mdx +++ b/api_docs/kbn_security_solution_distribution_bar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-distribution-bar title: "@kbn/security-solution-distribution-bar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-distribution-bar plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-distribution-bar'] --- import kbnSecuritySolutionDistributionBarObj from './kbn_security_solution_distribution_bar.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 16cfbfdcbc12a..ecade49ff9859 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-10-24 +date: 2024-10-25 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 e138249a2f819..34c5bca405704 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-10-24 +date: 2024-10-25 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 b7686231b037c..2456edd014414 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-10-24 +date: 2024-10-25 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 6a23426a72620..f49e7390ab54d 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-10-24 +date: 2024-10-25 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_security_ui_components.mdx b/api_docs/kbn_security_ui_components.mdx index 7055d7ba2ed1b..ddd5969386c2c 100644 --- a/api_docs/kbn_security_ui_components.mdx +++ b/api_docs/kbn_security_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-ui-components title: "@kbn/security-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-ui-components plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-ui-components'] --- import kbnSecurityUiComponentsObj from './kbn_security_ui_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 909df279fc1e6..2f5e1d0eed4dc 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-10-24 +date: 2024-10-25 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 7d444b8ff87bf..a4395ac31906c 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-10-24 +date: 2024-10-25 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 6263e1daccc16..8f8ab6f2ba1f8 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-10-24 +date: 2024-10-25 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 e9201e142f40a..60d29238037d6 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-10-24 +date: 2024-10-25 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 6e346b1a0522b..83a63361ca5f4 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-10-24 +date: 2024-10-25 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_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 1cfae764751f1..621319c46584a 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-10-24 +date: 2024-10-25 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 f4ec44556dc5b..b6c0ad0938187 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-10-24 +date: 2024-10-25 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 e7016c29ebcc8..5e339b3dff21f 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-10-24 +date: 2024-10-25 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 9c1dc65480ff0..00caf5c58b688 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-10-24 +date: 2024-10-25 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 06a4472891e69..9fe5e2683256d 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-10-24 +date: 2024-10-25 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 3385333a0700a..cc89b5d37b8f8 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-10-24 +date: 2024-10-25 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 63e8213fd2488..20f3ee19f391c 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-10-24 +date: 2024-10-25 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 cf0ffdf937ded..b157d31dfc713 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-10-24 +date: 2024-10-25 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 06e4d656ec796..9a24e42b4c094 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-10-24 +date: 2024-10-25 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 20226ffb9b432..026598b3bbd44 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-10-24 +date: 2024-10-25 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 1d0d49ea56bd3..5e00aa68744b5 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-10-24 +date: 2024-10-25 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 6980d27fc3c42..6c5ffd40097d2 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-10-24 +date: 2024-10-25 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 92ec5fbdde3ed..01bfe64008c4f 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-10-24 +date: 2024-10-25 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 8509e6af1bb9b..48c827079d4c9 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_client.mdx b/api_docs/kbn_server_route_repository_client.mdx index 147a3667777c5..df3dd4e7ef1a6 100644 --- a/api_docs/kbn_server_route_repository_client.mdx +++ b/api_docs/kbn_server_route_repository_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-client title: "@kbn/server-route-repository-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-client plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-client'] --- import kbnServerRouteRepositoryClientObj from './kbn_server_route_repository_client.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_utils.mdx b/api_docs/kbn_server_route_repository_utils.mdx index 503877bb56878..219d20e06fdc1 100644 --- a/api_docs/kbn_server_route_repository_utils.mdx +++ b/api_docs/kbn_server_route_repository_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-utils title: "@kbn/server-route-repository-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-utils plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-utils'] --- import kbnServerRouteRepositoryUtilsObj from './kbn_server_route_repository_utils.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 0805195332da6..6718c9fe68043 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-10-24 +date: 2024-10-25 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 cfc4a4fe4c2b8..8918e33e3072e 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-10-24 +date: 2024-10-25 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 c29a4f7c7a2dd..2f5cd7f1ee59c 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-10-24 +date: 2024-10-25 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 1c66ad3fc3e29..fb0f2a164cc46 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-10-24 +date: 2024-10-25 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 230a579ad5129..0ba4832f8f822 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-10-24 +date: 2024-10-25 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 dae791baec64a..475055266cfa3 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-10-24 +date: 2024-10-25 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 98bc180f019f4..fea2785a4e36e 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-10-24 +date: 2024-10-25 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 822da7183a72f..0eb8e8b77c0d1 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-10-24 +date: 2024-10-25 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 bd5093da6b4ef..776e90985f11d 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-10-24 +date: 2024-10-25 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 76e5c1024ba5c..8d2f988acb993 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-10-24 +date: 2024-10-25 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 e9655f2e1f443..a457331f12046 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-10-24 +date: 2024-10-25 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 7eb6e70b0bd17..d6a1185ac5cac 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-10-24 +date: 2024-10-25 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 0b41e40ad647e..298906c5672b8 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-10-24 +date: 2024-10-25 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 be45df269a1e5..345cb99e8e3a4 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-10-24 +date: 2024-10-25 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 396a33e40bbc6..1d4da8757b09f 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-10-24 +date: 2024-10-25 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 92db869bce2c4..da5dbddd59a1c 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-10-24 +date: 2024-10-25 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 de7f1b217e9cf..8962455c1e734 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-10-24 +date: 2024-10-25 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 14c8943133779..fc971eb7e23ed 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-10-24 +date: 2024-10-25 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 7e17eb7d819cc..fe2af0946b720 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-10-24 +date: 2024-10-25 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 83bf40963f947..5b704a756a9f0 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-10-24 +date: 2024-10-25 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 45446d66af211..a01de092f0d27 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-10-24 +date: 2024-10-25 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 4f12fe115c907..9013f3ff4680f 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-10-24 +date: 2024-10-25 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 24abd1ba34c9a..1cb1d6f05a3f5 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-10-24 +date: 2024-10-25 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 32f20c5915e61..7de1d9071c1b3 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-10-24 +date: 2024-10-25 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 ab38fe37dc371..b9709319635e1 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-10-24 +date: 2024-10-25 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 7c32445393765..e0b04fd59253c 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-10-24 +date: 2024-10-25 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 2004b3f43f6cb..26947ab8a9807 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-10-24 +date: 2024-10-25 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 e58e7bc7d6d95..ffeedb2f55028 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-10-24 +date: 2024-10-25 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 7eac5db08d40f..1893fbf6bfec4 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-10-24 +date: 2024-10-25 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 23dad166ea523..44a27539fd84c 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-10-24 +date: 2024-10-25 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 cee656a556007..1882a3e06cf4e 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-10-24 +date: 2024-10-25 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 64c6f6112bad2..094ac671bf5a0 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-10-24 +date: 2024-10-25 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 75a6fb420bfa8..e56c3b05d3661 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-10-24 +date: 2024-10-25 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 21d2977f02a33..1dd9923407c78 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-10-24 +date: 2024-10-25 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 a9fa2f37d4a68..58007fe4eda51 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-10-24 +date: 2024-10-25 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 d3674cc85385c..c6c446c5078a7 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-10-24 +date: 2024-10-25 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 2c3ce002a0f54..7a63b4c99cfbd 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-10-24 +date: 2024-10-25 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 3c9c69bc9f736..1dac2749c63c8 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-10-24 +date: 2024-10-25 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 db3cd8963593a..f9303ffe209eb 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-10-24 +date: 2024-10-25 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 1228353883d73..86bee58915a67 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-10-24 +date: 2024-10-25 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 610cbd90062d0..501cf0f6df841 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-10-24 +date: 2024-10-25 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 2311343e9a32d..d880fada8f33f 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-10-24 +date: 2024-10-25 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 f3fd353ce3c63..3d8b56b475ab1 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-10-24 +date: 2024-10-25 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 728e119f46547..3d758e4d42b7a 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-10-24 +date: 2024-10-25 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 7634ff5946b62..824750cd9eba8 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-10-24 +date: 2024-10-25 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_table_persist.mdx b/api_docs/kbn_shared_ux_table_persist.mdx index 8a4fc02633608..db003d9bc2e75 100644 --- a/api_docs/kbn_shared_ux_table_persist.mdx +++ b/api_docs/kbn_shared_ux_table_persist.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-table-persist title: "@kbn/shared-ux-table-persist" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-table-persist plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-table-persist'] --- import kbnSharedUxTablePersistObj from './kbn_shared_ux_table_persist.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 7d200a6679481..5592cedafe191 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-10-24 +date: 2024-10-25 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 d36c9e94676cd..459b672c7d901 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index f5bf940b18646..5750ee5bad7f1 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-10-24 +date: 2024-10-25 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 de56ad430533d..c738658afabda 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_sse_utils.mdx b/api_docs/kbn_sse_utils.mdx index 78afb2203f424..92a6969399ccf 100644 --- a/api_docs/kbn_sse_utils.mdx +++ b/api_docs/kbn_sse_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils title: "@kbn/sse-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils'] --- import kbnSseUtilsObj from './kbn_sse_utils.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_client.mdx b/api_docs/kbn_sse_utils_client.mdx index e8d3b72764177..e60a4b03794e9 100644 --- a/api_docs/kbn_sse_utils_client.mdx +++ b/api_docs/kbn_sse_utils_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-client title: "@kbn/sse-utils-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-client plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-client'] --- import kbnSseUtilsClientObj from './kbn_sse_utils_client.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_server.mdx b/api_docs/kbn_sse_utils_server.mdx index 0c11bb194bcc0..d78aeb2afba50 100644 --- a/api_docs/kbn_sse_utils_server.mdx +++ b/api_docs/kbn_sse_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-server title: "@kbn/sse-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-server plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-server'] --- import kbnSseUtilsServerObj from './kbn_sse_utils_server.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 234afc3ecf74d..1273349a1f7e8 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-10-24 +date: 2024-10-25 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 27aadb73c39c4..dffda67527183 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-10-24 +date: 2024-10-25 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 c9c8efb41bc05..af78a4a8cc9f0 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_synthetics_e2e.mdx b/api_docs/kbn_synthetics_e2e.mdx index 17a8ce6628fae..4f2b1ab687a51 100644 --- a/api_docs/kbn_synthetics_e2e.mdx +++ b/api_docs/kbn_synthetics_e2e.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-e2e title: "@kbn/synthetics-e2e" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-e2e plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-e2e'] --- import kbnSyntheticsE2eObj from './kbn_synthetics_e2e.devdocs.json'; diff --git a/api_docs/kbn_synthetics_private_location.mdx b/api_docs/kbn_synthetics_private_location.mdx index ecc295501a89f..f8f61aef9772d 100644 --- a/api_docs/kbn_synthetics_private_location.mdx +++ b/api_docs/kbn_synthetics_private_location.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-private-location title: "@kbn/synthetics-private-location" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-private-location plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-private-location'] --- import kbnSyntheticsPrivateLocationObj from './kbn_synthetics_private_location.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 93675548d4fc6..9c7c8fe29101e 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-10-24 +date: 2024-10-25 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 ef0a7177a0c0c..39410cab15250 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-10-24 +date: 2024-10-25 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 810b6d454119e..142898e0e6c55 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-10-24 +date: 2024-10-25 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 fa7efc46bb9bd..6914792e26917 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-10-24 +date: 2024-10-25 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 236ce1de84168..306475a2fdefb 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index 959f28010c41b..80c5a764632d7 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-10-24 +date: 2024-10-25 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 f417b4188be7b..e68a201d844ae 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_transpose_utils.devdocs.json b/api_docs/kbn_transpose_utils.devdocs.json new file mode 100644 index 0000000000000..0a2308c97e52d --- /dev/null +++ b/api_docs/kbn_transpose_utils.devdocs.json @@ -0,0 +1,177 @@ +{ + "id": "@kbn/transpose-utils", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/transpose-utils", + "id": "def-common.getOriginalId", + "type": "Function", + "tags": [], + "label": "getOriginalId", + "description": [], + "signature": [ + "(id: string) => string" + ], + "path": "packages/kbn-transpose-utils/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/transpose-utils", + "id": "def-common.getOriginalId.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-transpose-utils/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/transpose-utils", + "id": "def-common.getTransposeId", + "type": "Function", + "tags": [], + "label": "getTransposeId", + "description": [], + "signature": [ + "(value: string, columnId: string) => string" + ], + "path": "packages/kbn-transpose-utils/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/transpose-utils", + "id": "def-common.getTransposeId.$1", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-transpose-utils/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/transpose-utils", + "id": "def-common.getTransposeId.$2", + "type": "string", + "tags": [], + "label": "columnId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-transpose-utils/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/transpose-utils", + "id": "def-common.isTransposeId", + "type": "Function", + "tags": [], + "label": "isTransposeId", + "description": [], + "signature": [ + "(id: string) => boolean" + ], + "path": "packages/kbn-transpose-utils/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/transpose-utils", + "id": "def-common.isTransposeId.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-transpose-utils/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/transpose-utils", + "id": "def-common.TRANSPOSE_SEPARATOR", + "type": "string", + "tags": [], + "label": "TRANSPOSE_SEPARATOR", + "description": [ + "\nUsed to delimitate felids of a transposed column id" + ], + "signature": [ + "\"---\"" + ], + "path": "packages/kbn-transpose-utils/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/transpose-utils", + "id": "def-common.TRANSPOSE_VISUAL_SEPARATOR", + "type": "string", + "tags": [], + "label": "TRANSPOSE_VISUAL_SEPARATOR", + "description": [ + "\nVisual deliminator between felids of a transposed column id\n\nMeant to align with the `MULTI_FIELD_KEY_SEPARATOR` from the data plugin" + ], + "signature": [ + "\"›\"" + ], + "path": "packages/kbn-transpose-utils/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_transpose_utils.mdx b/api_docs/kbn_transpose_utils.mdx new file mode 100644 index 0000000000000..ee37aecc12c0a --- /dev/null +++ b/api_docs/kbn_transpose_utils.mdx @@ -0,0 +1,33 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnTransposeUtilsPluginApi +slug: /kibana-dev-docs/api/kbn-transpose-utils +title: "@kbn/transpose-utils" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/transpose-utils plugin +date: 2024-10-25 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/transpose-utils'] +--- +import kbnTransposeUtilsObj from './kbn_transpose_utils.devdocs.json'; + + + +Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 9 | 0 | 7 | 0 | + +## Common + +### Functions + + +### Consts, variables and types + + diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 0944855f0a148..e6d094147a15e 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-10-24 +date: 2024-10-25 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_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index f9a76b03c276d..987f45ee38df4 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index c5af21efac2a4..5ec77e2a06e07 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-10-24 +date: 2024-10-25 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 6b7dbdd723961..5a5289b6cb2ae 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-10-24 +date: 2024-10-25 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 f601e072d822d..d71283b636a38 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-10-24 +date: 2024-10-25 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 982abcfee14e5..471dc6005706e 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-10-24 +date: 2024-10-25 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 6b1c3dd2af46b..499acfa51ffcc 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-10-24 +date: 2024-10-25 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 dd86f054f1a11..dbde5de2a9249 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-10-24 +date: 2024-10-25 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 bcd7d407e54a3..823164c970adb 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-10-24 +date: 2024-10-25 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 818021341e824..c8765f73d5594 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-10-24 +date: 2024-10-25 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 fa7b9dbc097d2..0ed9d524f0d19 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index 12204ee978716..c5d4a02e9ba62 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] --- import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 352b65a450148..29ed5875748a2 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-10-24 +date: 2024-10-25 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 18ac898f99d15..e968891699024 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-10-24 +date: 2024-10-25 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 2138ec302ed95..ebeaae075a431 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-10-24 +date: 2024-10-25 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 3a0b5ef1b45ac..9bb52295063b3 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-10-24 +date: 2024-10-25 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 ce2d35f98002a..c366526745baa 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-10-24 +date: 2024-10-25 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 38c5b86994b79..eb515ec4ae82c 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-10-24 +date: 2024-10-25 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 a4d86aaf5879b..bc5e2f54a73d5 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-10-24 +date: 2024-10-25 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 ea6786600957a..840e46e49eabc 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-10-24 +date: 2024-10-25 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 23857d1860f8c..d9545969d2fa0 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-10-24 +date: 2024-10-25 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.mdx b/api_docs/kbn_zod.mdx index 9c6e95aa5a5d3..16aff3c1e9584 100644 --- a/api_docs/kbn_zod.mdx +++ b/api_docs/kbn_zod.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod title: "@kbn/zod" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod'] --- import kbnZodObj from './kbn_zod.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 98ea085a48fd1..0791b1759db0c 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-10-24 +date: 2024-10-25 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 03cb1bbe75192..4d71a4dc33e76 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-10-24 +date: 2024-10-25 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 6b15df13d6c0b..62b96df12b69f 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-10-24 +date: 2024-10-25 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 6a456f97eff7c..b2563e3613201 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-10-24 +date: 2024-10-25 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 c500dd4eb3a59..461b933e6dcf9 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 2c42b648debb8..27e7e0a324279 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -9198,12 +9198,12 @@ }, { "parentPluginId": "lens", - "id": "def-public.Visualization.getSortedColumns", + "id": "def-public.Visualization.getExportDatatables", "type": "Function", "tags": [], - "label": "getSortedColumns", + "label": "getExportDatatables", "description": [ - "\nA visualization can share how columns are visually sorted" + "\nGet all datatables to be exported as csv" ], "signature": [ "((state: T, datasourceLayers?: Partial> | undefined) => string[]) | undefined" + ">> | undefined, activeData?: ", + "TableInspectorAdapter", + " | undefined) => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + "[]) | undefined" ], "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, @@ -9222,7 +9232,7 @@ "children": [ { "parentPluginId": "lens", - "id": "def-public.Visualization.getSortedColumns.$1", + "id": "def-public.Visualization.getExportDatatables.$1", "type": "Uncategorized", "tags": [], "label": "state", @@ -9237,7 +9247,7 @@ }, { "parentPluginId": "lens", - "id": "def-public.Visualization.getSortedColumns.$2", + "id": "def-public.Visualization.getExportDatatables.$2", "type": "Object", "tags": [], "label": "datasourceLayers", @@ -9257,6 +9267,22 @@ "deprecated": false, "trackAdoption": false, "isRequired": false + }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.getExportDatatables.$3", + "type": "Object", + "tags": [], + "label": "activeData", + "description": [], + "signature": [ + "TableInspectorAdapter", + " | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [] diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 3f999d929c2a7..7e00249d1c4a9 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.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 | |-------------------|-----------|------------------------|-----------------| -| 691 | 0 | 589 | 62 | +| 692 | 0 | 590 | 63 | ## Client diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 8442a37f05f37..45ee50d90bb29 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-10-24 +date: 2024-10-25 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 39516c41eca78..35235fc313ec9 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-10-24 +date: 2024-10-25 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 585b1c7948063..c3e88c4f56aed 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-10-24 +date: 2024-10-25 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 db35d0f6d7892..6fcfed1836120 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-10-24 +date: 2024-10-25 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 f87ac4f4e3c97..250c0e52f907e 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index 933135ae01924..893832d32b813 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index 34e4ba9bfef8f..042b42f0acba1 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.devdocs.json b/api_docs/logs_shared.devdocs.json index 6dadb03d9ae09..70accf5e5f656 100644 --- a/api_docs/logs_shared.devdocs.json +++ b/api_docs/logs_shared.devdocs.json @@ -3134,6 +3134,36 @@ "path": "x-pack/plugins/observability_solution/logs_shared/public/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "logsShared", + "id": "def-public.LogsSharedClientStartDeps.fieldFormats", + "type": "CompoundType", + "tags": [], + "label": "fieldFormats", + "description": [], + "signature": [ + "Omit<", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.FieldFormatsRegistry", + "text": "FieldFormatsRegistry" + }, + ", \"init\" | \"register\"> & { deserialize: ", + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.FormatFactory", + "text": "FormatFactory" + }, + "; }" + ], + "path": "x-pack/plugins/observability_solution/logs_shared/public/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 3c2e731778ba7..4eed158298bc5 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.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 | |-------------------|-----------|------------------------|-----------------| -| 313 | 0 | 284 | 34 | +| 314 | 0 | 285 | 34 | ## Client diff --git a/api_docs/management.mdx b/api_docs/management.mdx index cb4c1fbcb1b1d..dd7cdc255be61 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-10-24 +date: 2024-10-25 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 a4567e13c4d51..8fc61b422770a 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-10-24 +date: 2024-10-25 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 352c331853b1f..473061eb99571 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-10-24 +date: 2024-10-25 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 2af6cb50a974f..d88973d983599 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.devdocs.json b/api_docs/ml.devdocs.json index 68b1195f2e6c3..8b9d3866bfad7 100644 --- a/api_docs/ml.devdocs.json +++ b/api_docs/ml.devdocs.json @@ -1251,7 +1251,7 @@ "MlDatafeed", ">; }): Promise; deleteDatafeed({ datafeedId }: { datafeedId: string; }): Promise; forceDeleteDatafeed({ datafeedId }: { datafeedId: string; }): Promise; startDatafeed({ datafeedId, start, end, }: { datafeedId: string; start?: number | undefined; end?: number | undefined; }): Promise; stopDatafeed({ datafeedId }: { datafeedId: string; }): Promise; forceStopDatafeed({ datafeedId }: { datafeedId: string; }): Promise; datafeedPreview({ datafeedId }: { datafeedId: string; }): Promise; validateDetector({ detector }: { detector: ", "MlDetector", - "; }): Promise; forecast({ jobId, duration }: { jobId: string; duration?: string | undefined; }): Promise; deleteForecast({ jobId, forecastId }: { jobId: string; forecastId: string; }): Promise<", + "; }): Promise; forecast({ jobId, duration, neverExpires, }: { jobId: string; duration?: string | undefined; neverExpires?: boolean | undefined; }): Promise; deleteForecast({ jobId, forecastId }: { jobId: string; forecastId: string; }): Promise<", "DeleteForecastResponse", ">; overallBuckets({ jobId, topN, bucketSpan, start, end, overallScore, }: { jobId: string; topN: string; bucketSpan: string; start: number; end: number; overallScore?: number | undefined; }): Promise; hasPrivileges(obj: any): Promise<", "MlHasPrivilegesResponse", diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 86f1d9507dee2..41fa17a04ef93 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-10-24 +date: 2024-10-25 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 258b635f14039..b0ecd6defef27 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-10-24 +date: 2024-10-25 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 6fb4ac29c0c62..f63f4ff6eff9d 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-10-24 +date: 2024-10-25 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 6b99b22da3d2f..aac666ff72e30 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-10-24 +date: 2024-10-25 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 d8acadab5f8cb..0ecb0e676ad05 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-10-24 +date: 2024-10-25 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 d46818f2cd7ca..9c73243df6850 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-10-24 +date: 2024-10-25 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 0475f3f105f2f..8e09cfae38518 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-10-24 +date: 2024-10-25 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 4310fbf152364..65fdff4b1242b 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-10-24 +date: 2024-10-25 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 de184d5fc23a9..524e954236a24 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-10-24 +date: 2024-10-25 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 8cb0e21202e89..8515f9c86f398 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -1147,27 +1147,6 @@ "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "observabilityAIAssistant", - "id": "def-public.FunctionDefinition.scopes", - "type": "Array", - "tags": [], - "label": "scopes", - "description": [], - "signature": [ - { - "pluginId": "@kbn/ai-assistant-common", - "scope": "common", - "docId": "kibKbnAiAssistantCommonPluginApi", - "section": "def-common.AssistantScope", - "text": "AssistantScope" - }, - "[] | undefined" - ], - "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts", - "deprecated": false, - "trackAdoption": false } ], "initialIsOpen": false @@ -1480,7 +1459,7 @@ "section": "def-common.FunctionDefinition", "text": "FunctionDefinition" }, - ", \"name\" | \"description\" | \"parameters\">[] | undefined; functionCall?: string | undefined; signal: AbortSignal; scope: ", + ", \"name\" | \"description\" | \"parameters\">[] | undefined; functionCall?: string | undefined; signal: AbortSignal; scopes: ", { "pluginId": "@kbn/ai-assistant-common", "scope": "common", @@ -1488,7 +1467,7 @@ "section": "def-common.AssistantScope", "text": "AssistantScope" }, - "; }) => ", + "[]; }) => ", "Observable", "<", { @@ -1614,13 +1593,20 @@ }, { "parentPluginId": "observabilityAIAssistant", - "id": "def-public.ObservabilityAIAssistantChatService.chat.$2.scope", - "type": "CompoundType", + "id": "def-public.ObservabilityAIAssistantChatService.chat.$2.scopes", + "type": "Array", "tags": [], - "label": "scope", + "label": "scopes", "description": [], "signature": [ - "\"search\" | \"observability\" | \"all\"" + { + "pluginId": "@kbn/ai-assistant-common", + "scope": "common", + "docId": "kibKbnAiAssistantCommonPluginApi", + "section": "def-common.AssistantScope", + "text": "AssistantScope" + }, + "[]" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", "deprecated": false, @@ -1651,7 +1637,7 @@ }, "[]; persist: boolean; disableFunctions: boolean | { except: string[]; }; signal: AbortSignal; instructions?: ", "AdHocInstruction", - "[] | undefined; scope: ", + "[] | undefined; scopes: ", { "pluginId": "@kbn/ai-assistant-common", "scope": "common", @@ -1659,7 +1645,7 @@ "section": "def-common.AssistantScope", "text": "AssistantScope" }, - "; }) => ", + "[]; }) => ", "Observable", "<", { @@ -1806,13 +1792,20 @@ }, { "parentPluginId": "observabilityAIAssistant", - "id": "def-public.ObservabilityAIAssistantChatService.complete.$1.scope", - "type": "CompoundType", + "id": "def-public.ObservabilityAIAssistantChatService.complete.$1.scopes", + "type": "Array", "tags": [], - "label": "scope", + "label": "scopes", "description": [], "signature": [ - "\"search\" | \"observability\" | \"all\"" + { + "pluginId": "@kbn/ai-assistant-common", + "scope": "common", + "docId": "kibKbnAiAssistantCommonPluginApi", + "section": "def-common.AssistantScope", + "text": "AssistantScope" + }, + "[]" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", "deprecated": false, @@ -1831,7 +1824,7 @@ "label": "getFunctions", "description": [], "signature": [ - "(options?: { contexts?: string[] | undefined; filter?: string | undefined; scope: ", + "(options?: { contexts?: string[] | undefined; filter?: string | undefined; scopes: ", { "pluginId": "@kbn/ai-assistant-common", "scope": "common", @@ -1839,7 +1832,7 @@ "section": "def-common.AssistantScope", "text": "AssistantScope" }, - "; } | undefined) => ", + "[]; } | undefined) => ", { "pluginId": "observabilityAIAssistant", "scope": "common", @@ -1894,13 +1887,20 @@ }, { "parentPluginId": "observabilityAIAssistant", - "id": "def-public.ObservabilityAIAssistantChatService.getFunctions.$1.scope", - "type": "CompoundType", + "id": "def-public.ObservabilityAIAssistantChatService.getFunctions.$1.scopes", + "type": "Array", "tags": [], - "label": "scope", + "label": "scopes", "description": [], "signature": [ - "\"search\" | \"observability\" | \"all\"" + { + "pluginId": "@kbn/ai-assistant-common", + "scope": "common", + "docId": "kibKbnAiAssistantCommonPluginApi", + "section": "def-common.AssistantScope", + "text": "AssistantScope" + }, + "[]" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", "deprecated": false, @@ -2140,10 +2140,10 @@ }, { "parentPluginId": "observabilityAIAssistant", - "id": "def-public.ObservabilityAIAssistantChatService.getScope", + "id": "def-public.ObservabilityAIAssistantChatService.getScopes", "type": "Function", "tags": [], - "label": "getScope", + "label": "getScopes", "description": [], "signature": [ "() => ", @@ -2153,7 +2153,8 @@ "docId": "kibKbnAiAssistantCommonPluginApi", "section": "def-common.AssistantScope", "text": "AssistantScope" - } + }, + "[]" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", "deprecated": false, @@ -2183,7 +2184,7 @@ "label": "callApi", "description": [], "signature": [ - "(endpoint: TEndpoint, ...args: MaybeOptionalArgs<", + "(endpoint: TEndpoint, ...args: MaybeOptionalArgs<", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -2503,7 +2504,7 @@ "RecalledEntry", "[]; }, ", "ObservabilityAIAssistantRouteCreateOptions", - ">; \"GET /internal/observability_ai_assistant/{scope}/functions\": ", + ">; \"GET /internal/observability_ai_assistant/functions\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -2511,11 +2512,15 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"GET /internal/observability_ai_assistant/{scope}/functions\", ", - "TypeC", - "<{ path: ", + "<\"GET /internal/observability_ai_assistant/functions\", ", "TypeC", - "<{ scope: ", + "<{ query: ", + "PartialC", + "<{ scopes: ", + "UnionC", + "<[", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -2523,7 +2528,15 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>, ", + "<\"all\">]>>, ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", { functionDefinitions: ", { @@ -2911,7 +2924,9 @@ "ObservabilityAIAssistantScreenContextRequest", ", ", "ObservabilityAIAssistantScreenContextRequest", - ", unknown>>; scope: ", + ", unknown>>; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -2919,7 +2934,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>]>, ", + "<\"all\">]>>; }>; }>]>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -2943,7 +2958,9 @@ "StringC", "; connectorId: ", "StringC", - "; scope: ", + "; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -2951,7 +2968,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>, ", + "<\"all\">]>>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -3009,7 +3026,9 @@ "PartialC", "<{ parameters: ", "AnyC", - "; }>]>>; scope: ", + "; }>]>>; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -3017,7 +3036,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>, ", + "<\"all\">]>>; }>, ", "PartialC", "<{ functionCall: ", "StringC", @@ -3347,7 +3366,7 @@ "RecalledEntry", "[]; }, ", "ObservabilityAIAssistantRouteCreateOptions", - ">; \"GET /internal/observability_ai_assistant/{scope}/functions\": ", + ">; \"GET /internal/observability_ai_assistant/functions\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -3355,11 +3374,23 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"GET /internal/observability_ai_assistant/{scope}/functions\", ", + "<\"GET /internal/observability_ai_assistant/functions\", ", "TypeC", - "<{ path: ", - "TypeC", - "<{ scope: ", + "<{ query: ", + "PartialC", + "<{ scopes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>>, ", "UnionC", "<[", "LiteralC", @@ -3367,7 +3398,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>, ", + "<\"all\">]>]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", { functionDefinitions: ", { @@ -3755,7 +3786,9 @@ "ObservabilityAIAssistantScreenContextRequest", ", ", "ObservabilityAIAssistantScreenContextRequest", - ", unknown>>; scope: ", + ", unknown>>; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -3763,7 +3796,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>]>, ", + "<\"all\">]>>; }>; }>]>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -3787,7 +3820,9 @@ "StringC", "; connectorId: ", "StringC", - "; scope: ", + "; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -3795,7 +3830,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>, ", + "<\"all\">]>>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -3853,7 +3888,9 @@ "PartialC", "<{ parameters: ", "AnyC", - "; }>]>>; scope: ", + "; }>]>>; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -3861,7 +3898,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>, ", + "<\"all\">]>>; }>, ", "PartialC", "<{ functionCall: ", "StringC", @@ -4160,7 +4197,7 @@ "section": "def-common.AssistantScope", "text": "AssistantScope" }, - ">" + "[]>" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", "deprecated": false, @@ -4168,10 +4205,10 @@ }, { "parentPluginId": "observabilityAIAssistant", - "id": "def-public.ObservabilityAIAssistantService.setScope", + "id": "def-public.ObservabilityAIAssistantService.setScopes", "type": "Function", "tags": [], - "label": "setScope", + "label": "setScopes", "description": [], "signature": [ "(scope: ", @@ -4182,7 +4219,7 @@ "section": "def-common.AssistantScope", "text": "AssistantScope" }, - ") => void" + "[]) => void" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", "deprecated": false, @@ -4190,8 +4227,8 @@ "children": [ { "parentPluginId": "observabilityAIAssistant", - "id": "def-public.ObservabilityAIAssistantService.setScope.$1", - "type": "CompoundType", + "id": "def-public.ObservabilityAIAssistantService.setScopes.$1", + "type": "Array", "tags": [], "label": "scope", "description": [], @@ -4202,7 +4239,8 @@ "docId": "kibKbnAiAssistantCommonPluginApi", "section": "def-common.AssistantScope", "text": "AssistantScope" - } + }, + "[]" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", "deprecated": false, @@ -4214,10 +4252,10 @@ }, { "parentPluginId": "observabilityAIAssistant", - "id": "def-public.ObservabilityAIAssistantService.getScope", + "id": "def-public.ObservabilityAIAssistantService.getScopes", "type": "Function", "tags": [], - "label": "getScope", + "label": "getScopes", "description": [], "signature": [ "() => ", @@ -4227,7 +4265,8 @@ "docId": "kibKbnAiAssistantCommonPluginApi", "section": "def-common.AssistantScope", "text": "AssistantScope" - } + }, + "[]" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/types.ts", "deprecated": false, @@ -4910,7 +4949,7 @@ "RecalledEntry", "[]; }, ", "ObservabilityAIAssistantRouteCreateOptions", - ">; \"GET /internal/observability_ai_assistant/{scope}/functions\": ", + ">; \"GET /internal/observability_ai_assistant/functions\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -4918,11 +4957,15 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"GET /internal/observability_ai_assistant/{scope}/functions\", ", - "TypeC", - "<{ path: ", + "<\"GET /internal/observability_ai_assistant/functions\", ", "TypeC", - "<{ scope: ", + "<{ query: ", + "PartialC", + "<{ scopes: ", + "UnionC", + "<[", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -4930,7 +4973,15 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>, ", + "<\"all\">]>>, ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", { functionDefinitions: ", { @@ -5318,7 +5369,9 @@ "ObservabilityAIAssistantScreenContextRequest", ", ", "ObservabilityAIAssistantScreenContextRequest", - ", unknown>>; scope: ", + ", unknown>>; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -5326,7 +5379,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>]>, ", + "<\"all\">]>>; }>; }>]>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -5350,7 +5403,9 @@ "StringC", "; connectorId: ", "StringC", - "; scope: ", + "; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -5358,7 +5413,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>, ", + "<\"all\">]>>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -5416,7 +5471,9 @@ "PartialC", "<{ parameters: ", "AnyC", - "; }>]>>; scope: ", + "; }>]>>; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -5424,7 +5481,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>, ", + "<\"all\">]>>; }>, ", "PartialC", "<{ functionCall: ", "StringC", @@ -5997,7 +6054,7 @@ "RecalledEntry", "[]; }, ", "ObservabilityAIAssistantRouteCreateOptions", - ">; \"GET /internal/observability_ai_assistant/{scope}/functions\": ", + ">; \"GET /internal/observability_ai_assistant/functions\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -6005,11 +6062,23 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"GET /internal/observability_ai_assistant/{scope}/functions\", ", - "TypeC", - "<{ path: ", + "<\"GET /internal/observability_ai_assistant/functions\", ", "TypeC", - "<{ scope: ", + "<{ query: ", + "PartialC", + "<{ scopes: ", + "UnionC", + "<[", + "ArrayC", + "<", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>>, ", "UnionC", "<[", "LiteralC", @@ -6017,7 +6086,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>, ", + "<\"all\">]>]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", { functionDefinitions: ", { @@ -6405,7 +6474,9 @@ "ObservabilityAIAssistantScreenContextRequest", ", ", "ObservabilityAIAssistantScreenContextRequest", - ", unknown>>; scope: ", + ", unknown>>; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -6413,7 +6484,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>]>, ", + "<\"all\">]>>; }>; }>]>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -6437,7 +6508,9 @@ "StringC", "; connectorId: ", "StringC", - "; scope: ", + "; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -6445,7 +6518,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>, ", + "<\"all\">]>>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -6503,7 +6576,9 @@ "PartialC", "<{ parameters: ", "AnyC", - "; }>]>>; scope: ", + "; }>]>>; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -6511,7 +6586,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>, ", + "<\"all\">]>>; }>, ", "PartialC", "<{ functionCall: ", "StringC", @@ -6568,7 +6643,7 @@ "label": "ObservabilityAIAssistantAPIEndpoint", "description": [], "signature": [ - "\"POST /internal/observability_ai_assistant/chat\" | \"POST /internal/observability_ai_assistant/chat/recall\" | \"POST /internal/observability_ai_assistant/chat/complete\" | \"POST /api/observability_ai_assistant/chat/complete 2023-10-31\" | \"GET /internal/observability_ai_assistant/conversation/{conversationId}\" | \"POST /internal/observability_ai_assistant/conversations\" | \"POST /internal/observability_ai_assistant/conversation\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}/title\" | \"DELETE /internal/observability_ai_assistant/conversation/{conversationId}\" | \"GET /internal/observability_ai_assistant/connectors\" | \"GET /internal/observability_ai_assistant/{scope}/functions\" | \"POST /internal/observability_ai_assistant/functions/recall\" | \"POST /internal/observability_ai_assistant/functions/summarize\" | \"POST /internal/observability_ai_assistant/kb/setup\" | \"GET /internal/observability_ai_assistant/kb/status\" | \"GET /internal/observability_ai_assistant/kb/entries\" | \"PUT /internal/observability_ai_assistant/kb/user_instructions\" | \"GET /internal/observability_ai_assistant/kb/user_instructions\" | \"POST /internal/observability_ai_assistant/kb/entries/import\" | \"POST /internal/observability_ai_assistant/kb/entries/save\" | \"DELETE /internal/observability_ai_assistant/kb/entries/{entryId}\"" + "\"POST /internal/observability_ai_assistant/chat\" | \"POST /internal/observability_ai_assistant/chat/recall\" | \"POST /internal/observability_ai_assistant/chat/complete\" | \"POST /api/observability_ai_assistant/chat/complete 2023-10-31\" | \"GET /internal/observability_ai_assistant/conversation/{conversationId}\" | \"POST /internal/observability_ai_assistant/conversations\" | \"POST /internal/observability_ai_assistant/conversation\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}\" | \"PUT /internal/observability_ai_assistant/conversation/{conversationId}/title\" | \"DELETE /internal/observability_ai_assistant/conversation/{conversationId}\" | \"GET /internal/observability_ai_assistant/connectors\" | \"GET /internal/observability_ai_assistant/functions\" | \"POST /internal/observability_ai_assistant/functions/recall\" | \"POST /internal/observability_ai_assistant/functions/summarize\" | \"POST /internal/observability_ai_assistant/kb/setup\" | \"GET /internal/observability_ai_assistant/kb/status\" | \"GET /internal/observability_ai_assistant/kb/entries\" | \"PUT /internal/observability_ai_assistant/kb/user_instructions\" | \"GET /internal/observability_ai_assistant/kb/user_instructions\" | \"POST /internal/observability_ai_assistant/kb/entries/import\" | \"POST /internal/observability_ai_assistant/kb/entries/save\" | \"DELETE /internal/observability_ai_assistant/kb/entries/{entryId}\"" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/api/index.ts", "deprecated": false, @@ -6979,15 +7054,7 @@ "label": "props", "description": [], "signature": [ - "{ scope: ", - { - "pluginId": "@kbn/ai-assistant-common", - "scope": "common", - "docId": "kibKbnAiAssistantCommonPluginApi", - "section": "def-common.AssistantScope", - "text": "AssistantScope" - }, - "; connectorId?: string | undefined; service: ", + "{ connectorId?: string | undefined; service: ", { "pluginId": "observabilityAIAssistant", "scope": "public", @@ -7035,7 +7102,15 @@ "section": "def-common.Message", "text": "Message" }, - "[]) => void) | undefined; }" + "[]) => void) | undefined; scopes: ", + { + "pluginId": "@kbn/ai-assistant-common", + "scope": "common", + "docId": "kibKbnAiAssistantCommonPluginApi", + "section": "def-common.AssistantScope", + "text": "AssistantScope" + }, + "[]; }" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/public/hooks/use_chat.ts", "deprecated": false, @@ -7601,7 +7676,7 @@ "RecalledEntry", "[]; }, ", "ObservabilityAIAssistantRouteCreateOptions", - ">; \"GET /internal/observability_ai_assistant/{scope}/functions\": ", + ">; \"GET /internal/observability_ai_assistant/functions\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -7609,11 +7684,15 @@ "section": "def-common.ServerRoute", "text": "ServerRoute" }, - "<\"GET /internal/observability_ai_assistant/{scope}/functions\", ", + "<\"GET /internal/observability_ai_assistant/functions\", ", "TypeC", - "<{ path: ", - "TypeC", - "<{ scope: ", + "<{ query: ", + "PartialC", + "<{ scopes: ", + "UnionC", + "<[", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -7621,7 +7700,15 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>, ", + "<\"all\">]>>, ", + "UnionC", + "<[", + "LiteralC", + "<\"observability\">, ", + "LiteralC", + "<\"search\">, ", + "LiteralC", + "<\"all\">]>]>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", { functionDefinitions: ", { @@ -8009,7 +8096,9 @@ "ObservabilityAIAssistantScreenContextRequest", ", ", "ObservabilityAIAssistantScreenContextRequest", - ", unknown>>; scope: ", + ", unknown>>; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -8017,7 +8106,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>]>, ", + "<\"all\">]>>; }>; }>]>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -8041,7 +8130,9 @@ "StringC", "; connectorId: ", "StringC", - "; scope: ", + "; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -8049,7 +8140,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>; }>, ", + "<\"all\">]>>; }>; }>, ", "ObservabilityAIAssistantRouteHandlerResources", ", ", "Readable", @@ -8107,7 +8198,9 @@ "PartialC", "<{ parameters: ", "AnyC", - "; }>]>>; scope: ", + "; }>]>>; scopes: ", + "ArrayC", + "<", "UnionC", "<[", "LiteralC", @@ -8115,7 +8208,7 @@ "LiteralC", "<\"search\">, ", "LiteralC", - "<\"all\">]>; }>, ", + "<\"all\">]>>; }>, ", "PartialC", "<{ functionCall: ", "StringC", @@ -8146,7 +8239,15 @@ "ObservabilityAIAssistantClient", "; functions: ", "ChatFunctionClient", - "; }) => Promise" + "; scopes: ", + { + "pluginId": "@kbn/ai-assistant-common", + "scope": "common", + "docId": "kibKbnAiAssistantCommonPluginApi", + "section": "def-common.AssistantScope", + "text": "AssistantScope" + }, + "[]; }) => Promise" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/types.ts", "deprecated": false, @@ -8167,7 +8268,15 @@ "ObservabilityAIAssistantClient", "; functions: ", "ChatFunctionClient", - "; }" + "; scopes: ", + { + "pluginId": "@kbn/ai-assistant-common", + "scope": "common", + "docId": "kibKbnAiAssistantCommonPluginApi", + "section": "def-common.AssistantScope", + "text": "AssistantScope" + }, + "[]; }" ], "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/types.ts", "deprecated": false, @@ -8969,27 +9078,6 @@ "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "observabilityAIAssistant", - "id": "def-common.FunctionDefinition.scopes", - "type": "Array", - "tags": [], - "label": "scopes", - "description": [], - "signature": [ - { - "pluginId": "@kbn/ai-assistant-common", - "scope": "common", - "docId": "kibKbnAiAssistantCommonPluginApi", - "section": "def-common.AssistantScope", - "text": "AssistantScope" - }, - "[] | undefined" - ], - "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts", - "deprecated": false, - "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index a436c5670e5b8..1c4817a258856 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-10-24 +date: 2024-10-25 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 | |-------------------|-----------|------------------------|-----------------| -| 298 | 1 | 296 | 27 | +| 296 | 1 | 294 | 27 | ## Client diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 3ba070e3a6df7..92ef3362fae29 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-10-24 +date: 2024-10-25 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 de39ce5afc857..94db91d595d8e 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-10-24 +date: 2024-10-25 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 3959396c3e8de..5bfb65e5dcdc3 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-10-24 +date: 2024-10-25 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 1f65e3c78a610..4589bf3c678cc 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.devdocs.json b/api_docs/observability_shared.devdocs.json index ded54140435bb..cbcd73348b303 100644 --- a/api_docs/observability_shared.devdocs.json +++ b/api_docs/observability_shared.devdocs.json @@ -293,7 +293,7 @@ "label": "AddDataPanel", "description": [], "signature": [ - "({\n content,\n actions,\n onDissmiss,\n onLearnMore,\n onTryIt,\n onAddData,\n 'data-test-subj': dataTestSubj,\n}: ", + "({\n content,\n actions,\n onDismiss,\n onLearnMore,\n onTryIt,\n onAddData,\n 'data-test-subj': dataTestSubj,\n}: ", { "pluginId": "observabilityShared", "scope": "public", @@ -312,7 +312,7 @@ "id": "def-public.AddDataPanel.$1", "type": "Object", "tags": [], - "label": "{\n content,\n actions,\n onDissmiss,\n onLearnMore,\n onTryIt,\n onAddData,\n 'data-test-subj': dataTestSubj,\n}", + "label": "{\n content,\n actions,\n onDismiss,\n onLearnMore,\n onTryIt,\n onAddData,\n 'data-test-subj': dataTestSubj,\n}", "description": [], "signature": [ { @@ -2381,10 +2381,10 @@ }, { "parentPluginId": "observabilityShared", - "id": "def-public.AddDataPanelProps.onDissmiss", + "id": "def-public.AddDataPanelProps.onDismiss", "type": "Function", "tags": [], - "label": "onDissmiss", + "label": "onDismiss", "description": [], "signature": [ "(() => void) | undefined" diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 4873cd8f74709..8e364a4fde118 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-10-24 +date: 2024-10-25 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 a4ae0ec212cdf..d8ba4c4ac9964 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-10-24 +date: 2024-10-25 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 097b63f4e0718..45487e50b6834 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-10-24 +date: 2024-10-25 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 31e2927355f02..239a584a6473a 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 876 | 748 | 45 | +| 878 | 750 | 45 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 54006 | 242 | 40588 | 2008 | +| 54116 | 242 | 40691 | 2016 | ## Plugin Directory @@ -53,7 +53,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | crossClusterReplication | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | | customBranding | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Enables customization of Kibana | 0 | 0 | 0 | 0 | | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 268 | 0 | 249 | 1 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 129 | 0 | 124 | 14 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 130 | 0 | 125 | 14 | | | [@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. | 3209 | 31 | 2594 | 24 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 6 | 0 | 6 | 0 | @@ -96,11 +96,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'shape' function and renderer to expressions | 148 | 0 | 146 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Tagcloud plugin adds a `tagcloud` renderer and function to the expression plugin. The renderer will display the `Wordcloud` chart. | 6 | 0 | 6 | 2 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression XY plugin adds a `xy` renderer and function to the expression plugin. The renderer will display the `xy` chart. | 182 | 0 | 171 | 13 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds expression runtime to Kibana | 2235 | 17 | 1765 | 6 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds expression runtime to Kibana | 2241 | 17 | 1769 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 270 | 0 | 110 | 2 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Index pattern fields and ambiguous values formatters | 292 | 5 | 253 | 3 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes services for async usage and search of fields metadata. | 44 | 0 | 44 | 9 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 88 | 0 | 88 | 8 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 89 | 0 | 89 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 240 | 0 | 24 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Simple UI for managing files in Kibana | 3 | 0 | 3 | 0 | | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1426 | 5 | 1301 | 76 | @@ -130,7 +130,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | kibanaUsageCollection | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 610 | 3 | 417 | 9 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 5 | 0 | 5 | 1 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 691 | 0 | 589 | 62 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 692 | 0 | 590 | 63 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 119 | 0 | 42 | 10 | @@ -138,7 +138,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 227 | 0 | 98 | 52 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 15 | 0 | 13 | 7 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin provides a LogsExplorer component using the Discover customization framework, offering several affordances specifically designed for log consumption. | 120 | 4 | 120 | 23 | -| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes the shared components and APIs to access and visualize logs. | 313 | 0 | 284 | 34 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes the shared components and APIs to access and visualize logs. | 314 | 0 | 285 | 34 | | logstash | [@elastic/logstash](https://github.com/orgs/elastic/teams/logstash) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 44 | 0 | 44 | 7 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 209 | 0 | 205 | 27 | @@ -153,7 +153,7 @@ 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) | - | 710 | 2 | 702 | 23 | -| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 298 | 1 | 296 | 27 | +| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 296 | 1 | 294 | 27 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 4 | 0 | 4 | 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. | 19 | 0 | 19 | 1 | @@ -187,7 +187,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 21 | 0 | 15 | 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. | 455 | 0 | 238 | 0 | -| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 185 | 0 | 117 | 32 | +| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 186 | 0 | 118 | 33 | | | [@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 | @@ -502,7 +502,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 102 | 0 | 86 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 15 | 0 | 9 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 38 | 2 | 33 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 181 | 0 | 147 | 1 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 37 | 0 | 34 | 2 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 234 | 0 | 200 | 4 | | | [@elastic/docs](https://github.com/orgs/elastic/teams/docs) | - | 79 | 0 | 79 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 5 | 0 | 5 | 1 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 57 | 0 | 30 | 6 | @@ -545,7 +546,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 37 | 0 | 27 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 36 | 0 | 7 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 47 | 0 | 40 | 0 | -| | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 124 | 3 | 124 | 0 | +| | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 126 | 3 | 126 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 7 | 1 | 7 | 1 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 12 | 43 | 0 | @@ -617,7 +618,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 5 | 0 | 5 | 0 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 99 | 1 | 99 | 0 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 6 | 0 | 6 | 1 | -| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 29 | 0 | 27 | 3 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 29 | 0 | 27 | 4 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 4 | 0 | 4 | 1 | | | [@elastic/security-detection-rule-management](https://github.com/orgs/elastic/teams/security-detection-rule-management) | - | 12 | 0 | 12 | 0 | | | [@elastic/security-detection-rule-management](https://github.com/orgs/elastic/teams/security-detection-rule-management) | - | 15 | 0 | 15 | 0 | @@ -780,6 +781,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 74 | 0 | 55 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 9 | 0 | 7 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 15 | 0 | 15 | 0 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 2 | 0 | 2 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 39 | 0 | 25 | 1 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 0c3cb44216a1a..e36455c81e2d7 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-10-24 +date: 2024-10-25 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 9e66cb19a58b0..f6792abb29a74 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-10-24 +date: 2024-10-25 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 13ae4068670b7..c579fdab20a42 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-10-24 +date: 2024-10-25 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 a56732f53c402..5857a7a734a83 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-10-24 +date: 2024-10-25 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 0b915786bb870..e9ad7e476da4f 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-10-24 +date: 2024-10-25 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 5bb77fef79184..e1e38ca53773e 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-10-24 +date: 2024-10-25 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 85102752a5e05..99651d71f063d 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-10-24 +date: 2024-10-25 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 36d91f7904e9b..7bd0eb9e450c6 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-10-24 +date: 2024-10-25 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 b05913ed4fc5e..b3b9f7810d7f1 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-10-24 +date: 2024-10-25 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 bb5d3ed8bd614..63902df405436 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-10-24 +date: 2024-10-25 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 28a39f6ce5ce7..1e7492c993743 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-10-24 +date: 2024-10-25 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 246fefcad879e..1fb8d2f192992 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-10-24 +date: 2024-10-25 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 8fb3fa86149b1..0fb0e3ab4bfc5 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-10-24 +date: 2024-10-25 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 8bd86ba5350e0..e79c626159bca 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-10-24 +date: 2024-10-25 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 6ff1f2d9f32e6..0491dfa40fb07 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-10-24 +date: 2024-10-25 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 022a3fb46a893..3a6f46a1781f8 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-10-24 +date: 2024-10-25 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 26d1fec512b5e..6c32d66087e2a 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_assistant.mdx b/api_docs/search_assistant.mdx index d66a66ace673c..344bcb84a50a5 100644 --- a/api_docs/search_assistant.mdx +++ b/api_docs/search_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchAssistant title: "searchAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the searchAssistant plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchAssistant'] --- import searchAssistantObj from './search_assistant.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 1136458004da5..62bdb500e93c0 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index eeccbe7faa08f..ca3b5baf13216 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_indices.mdx b/api_docs/search_indices.mdx index b662d6c015100..a66160b5502f9 100644 --- a/api_docs/search_indices.mdx +++ b/api_docs/search_indices.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchIndices title: "searchIndices" image: https://source.unsplash.com/400x175/?github description: API docs for the searchIndices plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchIndices'] --- import searchIndicesObj from './search_indices.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index 66f6d593c078d..b9328cdd4ffcc 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 05336feed06f4..93a3522cb9b8e 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-10-24 +date: 2024-10-25 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 5415cb0166981..41e9088935d56 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-10-24 +date: 2024-10-25 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 d3b7ef9dedc01..bae120b81c5ef 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-10-24 +date: 2024-10-25 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 090d70b441ece..cfeb857bbb82a 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -325,7 +325,7 @@ "label": "data", "description": [], "signature": [ - "({ id: string; type: \"eql\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"eql\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; rule_id: string; immutable: boolean; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; tiebreaker_field?: string | undefined; timestamp_field?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; event_category_override?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"query\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; rule_id: string; immutable: boolean; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; saved_id?: string | undefined; } | { id: string; type: \"saved_query\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; rule_id: string; immutable: boolean; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; saved_id: string; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; query?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"threshold\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; rule_id: string; immutable: boolean; threshold: { value: number; field: string | string[]; cardinality?: { value: number; field: string; }[] | undefined; }; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { duration: { value: number; unit: \"m\" | \"s\" | \"h\"; }; } | undefined; saved_id?: string | undefined; } | { id: string; type: \"threat_match\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; rule_id: string; immutable: boolean; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; threat_query: string; threat_mapping: { entries: { value: string; type: \"mapping\"; field: string; }[]; }[]; threat_index: string[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; saved_id?: string | undefined; threat_filters?: unknown[] | undefined; threat_indicator_path?: string | undefined; threat_language?: \"kuery\" | \"lucene\" | undefined; concurrent_searches?: number | undefined; items_per_search?: number | undefined; } | { id: string; type: \"machine_learning\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; rule_id: string; immutable: boolean; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; anomaly_threshold: number; machine_learning_job_id: string | string[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"new_terms\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; rule_id: string; immutable: boolean; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; new_terms_fields: string[]; history_window_start: string; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"esql\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"esql\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; rule_id: string; immutable: boolean; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; })[]" + "({ id: string; type: \"eql\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"eql\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; tiebreaker_field?: string | undefined; timestamp_field?: string | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; event_category_override?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"query\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; saved_id?: string | undefined; } | { id: string; type: \"saved_query\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; saved_id: string; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; query?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"threshold\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threshold: { value: number; field: string | string[]; cardinality?: { value: number; field: string; }[] | undefined; }; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { duration: { value: number; unit: \"m\" | \"s\" | \"h\"; }; } | undefined; saved_id?: string | undefined; } | { id: string; type: \"threat_match\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; threat_query: string; threat_mapping: { entries: { value: string; type: \"mapping\"; field: string; }[]; }[]; threat_index: string[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; saved_id?: string | undefined; threat_filters?: unknown[] | undefined; threat_indicator_path?: string | undefined; threat_language?: \"kuery\" | \"lucene\" | undefined; concurrent_searches?: number | undefined; items_per_search?: number | undefined; } | { id: string; type: \"machine_learning\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; anomaly_threshold: number; machine_learning_job_id: string | string[]; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"new_terms\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"kuery\" | \"lucene\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; new_terms_fields: string[]; history_window_start: string; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; index?: string[] | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; filters?: unknown[] | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; data_view_id?: string | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; } | { id: string; type: \"esql\"; version: number; name: string; actions: { params: {} & { [k: string]: unknown; }; id: string; action_type_id: string; frequency?: { throttle: string | null; notifyWhen: \"onActionGroupChange\" | \"onActiveAlert\" | \"onThrottleInterval\"; summary: boolean; } | undefined; uuid?: string | undefined; group?: string | undefined; alerts_filter?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; }[]; tags: string[]; setup: string; description: string; enabled: boolean; revision: number; query: string; interval: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; risk_score: number; language: \"esql\"; from: string; to: string; created_at: string; created_by: string; updated_at: string; updated_by: string; references: string[]; author: string[]; immutable: boolean; rule_id: string; threat: { framework: string; tactic: { id: string; name: string; reference: string; }; technique?: { id: string; name: string; reference: string; subtechnique?: { id: string; name: string; reference: string; }[] | undefined; }[] | undefined; }[]; risk_score_mapping: { value: string; field: string; operator: \"equals\"; risk_score?: number | undefined; }[]; severity_mapping: { value: string; severity: \"medium\" | \"high\" | \"low\" | \"critical\"; field: string; operator: \"equals\"; }[]; exceptions_list: { id: string; type: \"endpoint\" | \"detection\" | \"rule_default\" | \"endpoint_trusted_apps\" | \"endpoint_events\" | \"endpoint_host_isolation_exceptions\" | \"endpoint_blocklists\"; list_id: string; namespace_type: \"single\" | \"agnostic\"; }[]; false_positives: string[]; max_signals: number; related_integrations: { version: string; package: string; integration?: string | undefined; }[]; required_fields: { type: string; name: string; ecs: boolean; }[]; rule_source: { type: \"external\"; is_customized: boolean; } | { type: \"internal\"; }; meta?: Zod.objectOutputType<{}, Zod.ZodUnknown, \"strip\"> | undefined; namespace?: string | undefined; license?: string | undefined; throttle?: string | undefined; outcome?: \"exactMatch\" | \"aliasMatch\" | \"conflict\" | undefined; alias_target_id?: string | undefined; alias_purpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; note?: string | undefined; rule_name_override?: string | undefined; timestamp_override?: string | undefined; timestamp_override_fallback_disabled?: boolean | undefined; timeline_id?: string | undefined; timeline_title?: string | undefined; building_block_type?: string | undefined; output_index?: string | undefined; investigation_fields?: { field_names: string[]; } | undefined; response_actions?: ({ params: { query?: string | undefined; timeout?: number | undefined; queries?: { id: string; query: string; version?: string | undefined; snapshot?: boolean | undefined; platform?: string | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; removed?: boolean | undefined; }[] | undefined; ecs_mapping?: Zod.objectOutputType<{}, Zod.ZodObject<{ field: Zod.ZodOptional; value: Zod.ZodOptional]>>; }, \"strip\", Zod.ZodTypeAny, { value?: string | string[] | undefined; field?: string | undefined; }, { value?: string | string[] | undefined; field?: string | undefined; }>, \"strip\"> | undefined; saved_query_id?: string | undefined; pack_id?: string | undefined; }; action_type_id: \".osquery\"; } | { params: { command: \"isolate\"; comment?: string | undefined; } | { config: { field: string; overwrite: boolean; }; command: \"kill-process\" | \"suspend-process\"; comment?: string | undefined; }; action_type_id: \".endpoint\"; })[] | undefined; execution_summary?: { last_execution: { message: string; date: string; status: \"running\" | \"succeeded\" | \"failed\" | \"going to run\" | \"partial failure\"; metrics: { total_search_duration_ms?: number | undefined; total_indexing_duration_ms?: number | undefined; execution_gap_duration_s?: number | undefined; total_enrichment_duration_ms?: number | undefined; }; status_order: number; }; } | undefined; alert_suppression?: { group_by: string[]; duration?: { value: number; unit: \"m\" | \"s\" | \"h\"; } | undefined; missing_fields_strategy?: \"doNotSuppress\" | \"suppress\" | undefined; } | undefined; })[]" ], "path": "x-pack/plugins/security_solution/public/detection_engine/rule_management/logic/types.ts", "deprecated": false, @@ -420,7 +420,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"siemMigrationsEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -500,7 +500,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"siemMigrationsEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1791,7 +1791,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -2886,6 +2886,23 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "securitySolution", + "id": "def-server.SecuritySolutionApiRequestHandlerContext.getSiemMigrationsClient", + "type": "Function", + "tags": [], + "label": "getSiemMigrationsClient", + "description": [], + "signature": [ + "() => ", + "SiemMigrationsClient" + ], + "path": "x-pack/plugins/security_solution/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false @@ -2976,7 +2993,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3149,7 +3166,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3215,7 +3232,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 excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: true; readonly responseActionsSentinelOneProcessesEnabled: true; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly endpointManagementSpaceAwarenessEnabled: false; readonly securitySolutionNotesEnabled: false; readonly entityAlertPreviewDisabled: false; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly responseActionsTelemetryEnabled: false; readonly jamfDataInAnalyzerEnabled: true; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly filterProcessDescendantsForEventFiltersEnabled: true; readonly dataIngestionHubEnabled: false; readonly entityStoreDisabled: false; }" + "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: true; readonly responseActionsSentinelOneProcessesEnabled: true; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly endpointManagementSpaceAwarenessEnabled: false; readonly securitySolutionNotesEnabled: false; readonly entityAlertPreviewDisabled: false; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly responseActionsTelemetryEnabled: false; readonly jamfDataInAnalyzerEnabled: true; readonly timelineEsqlTabDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly filterProcessDescendantsForEventFiltersEnabled: true; readonly dataIngestionHubEnabled: false; readonly entityStoreDisabled: false; readonly siemMigrationsEnabled: 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 9e393a13639e4..799d580bc92f1 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-10-24 +date: 2024-10-25 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 | |-------------------|-----------|------------------------|-----------------| -| 185 | 0 | 117 | 32 | +| 186 | 0 | 118 | 33 | ## Client diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 895e042ec2a5e..3bb1db377d6bf 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-10-24 +date: 2024-10-25 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 f4a603c21a5c5..e6d20157cffb8 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-10-24 +date: 2024-10-25 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 3735c7acaa940..fb6ee25b16da9 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-10-24 +date: 2024-10-25 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 00225f3e8a372..0a39d56a088cf 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-10-24 +date: 2024-10-25 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 f75308b519a75..e8cc5b79f0430 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-10-24 +date: 2024-10-25 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 f5845f7aa9584..e2503457d7cd6 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-10-24 +date: 2024-10-25 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 43620b83f1230..5919a0988b784 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-10-24 +date: 2024-10-25 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 1cbb1da238d65..53dcaa9ccd441 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-10-24 +date: 2024-10-25 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 c89f36dfc4b71..364543bcef3e6 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-10-24 +date: 2024-10-25 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 f9826555b8385..167bd4ba407d2 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-10-24 +date: 2024-10-25 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 fa0f5ed1188d0..4e6b8f6db5044 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-10-24 +date: 2024-10-25 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 8588064cd6a34..ad230c18ae5c4 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-10-24 +date: 2024-10-25 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 318b944b62f39..5a5f0f87ca35f 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-10-24 +date: 2024-10-25 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 a341a90574a8f..f402acf45c06f 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-10-24 +date: 2024-10-25 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 627e130e10d2d..611519f28dd38 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-10-24 +date: 2024-10-25 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 820a18bf1d8b5..08bcd82d4751c 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-10-24 +date: 2024-10-25 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 31928ad49e6df..578ede36f50fe 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 7eccfa80a188a..16c8b51601af5 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.devdocs.json b/api_docs/timelines.devdocs.json index 446fca0dc401f..7b207604ff70e 100644 --- a/api_docs/timelines.devdocs.json +++ b/api_docs/timelines.devdocs.json @@ -3848,14 +3848,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/components/top_n/index.tsx" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.tsx" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/body/index.tsx" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/timelines/components/timeline/data_providers/add_data_provider_popover.tsx" diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 607b2eb7ae1b4..63ef6479c8745 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-10-24 +date: 2024-10-25 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 3b9479ad7e04c..70c2bb6e660e3 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-10-24 +date: 2024-10-25 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 528c0b87a54ab..a331cc99a2476 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-10-24 +date: 2024-10-25 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 3cb2db5b23aa9..3b6848a87016c 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-10-24 +date: 2024-10-25 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 677b0bd6071d0..280f694f36b66 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-10-24 +date: 2024-10-25 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 faf3ff01f37ef..3b782f0785a09 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-10-24 +date: 2024-10-25 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 e87989b8cbbe2..b5a4445640eab 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-10-24 +date: 2024-10-25 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 03ca2d121383d..100b60e87605b 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-10-24 +date: 2024-10-25 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 33d93dd245030..3fc6f67275a87 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-10-24 +date: 2024-10-25 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 8c604601a4565..34573796bb3af 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-10-24 +date: 2024-10-25 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 ba0276527dee7..b3329138f61a8 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-10-24 +date: 2024-10-25 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 1170eec5a458a..7bc577aa729de 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-10-24 +date: 2024-10-25 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 c1f92c49c267a..9e3366bb305dc 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-10-24 +date: 2024-10-25 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 70d9bcf78a1dd..2496dfbc96e48 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-10-24 +date: 2024-10-25 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 66ee00301492a..5264dea7092c5 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-10-24 +date: 2024-10-25 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 7a38ed1c1a068..5c10e69ade3c1 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-10-24 +date: 2024-10-25 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 2025517672cd9..7f9475ba64793 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-10-24 +date: 2024-10-25 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 70592aa5d8a7a..876c30ba6d62f 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-10-24 +date: 2024-10-25 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 688101a8fbc21..6425e01e09e75 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-10-24 +date: 2024-10-25 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 07e0e6f0ff158..ff46daef026ad 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-10-24 +date: 2024-10-25 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 c84cc9645b25b..03500f2fb8b8f 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-10-24 +date: 2024-10-25 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 dea129607f14e..cff1b9359f925 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-10-24 +date: 2024-10-25 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 97c9623e46d57..2305809f08236 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-10-24 +date: 2024-10-25 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 8619c2f4b9ee7..5d8fbb1f4fa01 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-10-24 +date: 2024-10-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 2b645d56b76dd44f84e1c4c31a1336260513c6b2 Mon Sep 17 00:00:00 2001 From: Julia Rechkunova Date: Fri, 25 Oct 2024 09:01:22 +0200 Subject: [PATCH 008/135] [Discover][Embeddable] Fix search highlighting (#197607) - Closes https://github.com/elastic/kibana/issues/197195 ## Summary This PR fixes the search highlights for saved search panels on Dashboard. ### 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 --- .../embeddable/utils/update_search_source.ts | 1 + .../embeddable/_saved_search_embeddable.ts | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/plugins/discover/public/embeddable/utils/update_search_source.ts b/src/plugins/discover/public/embeddable/utils/update_search_source.ts index d866e4d05b4d7..47140911b0980 100644 --- a/src/plugins/discover/public/embeddable/utils/update_search_source.ts +++ b/src/plugins/discover/public/embeddable/utils/update_search_source.ts @@ -52,6 +52,7 @@ export const updateSearchSource = ( ) => { const { sortDir } = defaults; searchSource.setField('size', sampleSize); + searchSource.setField('highlightAll', true); searchSource.setField( 'sort', getSortForSearchSource({ diff --git a/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts b/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts index c6f5fd9724629..aeee4cd709b1f 100644 --- a/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts +++ b/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts @@ -19,6 +19,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); const testSubjects = getService('testSubjects'); + const find = getService('find'); const { common, dashboard, header, discover } = getPageObjects([ 'common', 'dashboard', @@ -143,5 +144,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await addSearchEmbeddableToDashboard(); await testSubjects.existOrFail('unifiedDataTableToolbar'); }); + + it('should display search highlights', async () => { + await addSearchEmbeddableToDashboard(); + await queryBar.setQuery('Mozilla'); + await queryBar.submitQuery(); + await header.waitUntilLoadingHasFinished(); + await dashboard.waitForRenderComplete(); + const marks = await find.allByCssSelector('.unifiedDataTable__cellValue mark'); + const highlights = await Promise.all( + marks.map(async (highlight) => await highlight.getVisibleText()) + ); + expect(highlights.length).to.be.greaterThan(0); + expect(highlights.every((text) => text === 'Mozilla')).to.be(true); + }); }); } From 188beda849ae886b164c9ccd3d5f7d2edf35479c Mon Sep 17 00:00:00 2001 From: Giorgos Bamparopoulos Date: Fri, 25 Oct 2024 10:14:00 +0300 Subject: [PATCH 009/135] Update the test subjects of the feedback buttons (#197311) Update the test subjects of the feedback buttons. Closes https://github.com/elastic/kibana/issues/196297 Co-authored-by: Elastic Machine --- .../application/quickstart_flows/shared/feedback_buttons.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/shared/feedback_buttons.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/shared/feedback_buttons.tsx index bf81ab02813d0..3dd0b5c108860 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/shared/feedback_buttons.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/shared/feedback_buttons.tsx @@ -53,7 +53,7 @@ export function FeedbackButtons({ flow }: { flow: string }) { Date: Fri, 25 Oct 2024 09:36:21 +0200 Subject: [PATCH 010/135] [Cloud Security] add sideEffects: false to shared csp packages (#197486) ## Summary add `sideEffects: false` to shared packages for better tree shaking, see [docs](https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side-effect-free) and [related discussion](https://elastic.slack.com/archives/C5TQ33ND8/p1724317421954709?thread_ts=1724314732.061379&cid=C5TQ33ND8) --- x-pack/packages/kbn-cloud-security-posture/common/package.json | 3 ++- x-pack/packages/kbn-cloud-security-posture/public/package.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/x-pack/packages/kbn-cloud-security-posture/common/package.json b/x-pack/packages/kbn-cloud-security-posture/common/package.json index 9010e267fe5d0..8ead7b37ceeb6 100644 --- a/x-pack/packages/kbn-cloud-security-posture/common/package.json +++ b/x-pack/packages/kbn-cloud-security-posture/common/package.json @@ -3,5 +3,6 @@ "private": true, "version": "1.0.0", "license": "Elastic License 2.0", - "description": "Shared components for cloud security posture, both client and server side" + "description": "Shared components for cloud security posture, both client and server side", + "sideEffects": false } \ No newline at end of file diff --git a/x-pack/packages/kbn-cloud-security-posture/public/package.json b/x-pack/packages/kbn-cloud-security-posture/public/package.json index c9d9081d1b6b9..278fa091ad156 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/package.json +++ b/x-pack/packages/kbn-cloud-security-posture/public/package.json @@ -3,5 +3,6 @@ "private": true, "version": "1.0.0", "license": "Elastic License 2.0", - "description": "Shared components for cloud security posture, client side" + "description": "Shared components for cloud security posture, client side", + "sideEffects": false } \ No newline at end of file From c05e1c58ab7677bf082dc11da040a0c3be4d6498 Mon Sep 17 00:00:00 2001 From: Navarone Feekery <13634519+navarone-feekery@users.noreply.github.com> Date: Fri, 25 Oct 2024 09:53:16 +0200 Subject: [PATCH 011/135] [Search] Fix autogenerated connector names (#197585) Improve the autogenerated connector names by - Re-generating names when changing connector source - Preventing editing of names after connector is created --- .../components/connectors/create_connector/start_step.tsx | 1 + .../new_index/method_connector/new_connector_logic.ts | 5 +---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/create_connector/start_step.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/create_connector/start_step.tsx index b66a5653351bd..28d04750b80ba 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/create_connector/start_step.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/connectors/create_connector/start_step.tsx @@ -106,6 +106,7 @@ export const StartStep: React.FC = ({ name="first" value={rawName} onChange={handleNameChange} + disabled={!!connector} onBlur={() => { if (selectedConnector) { generateConnectorName({ diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_connector/new_connector_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_connector/new_connector_logic.ts index da2dcb1198800..796a2a64ab56c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_connector/new_connector_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_connector/new_connector_logic.ts @@ -143,9 +143,7 @@ export const NewConnectorLogic = kea { - if (!values.rawName) { - actions.setRawName(connectorName); - } + actions.setRawName(connectorName); }, createConnector: ({ isSelfManaged, @@ -191,7 +189,6 @@ export const NewConnectorLogic = kea { if (connector) { actions.generateConnectorName({ - connectorName: values.rawName, connectorType: connector.serviceType, }); } From 2fdfb8d769442a7591e982a0dcff40fb8eb1699a Mon Sep 17 00:00:00 2001 From: Catherine Liu Date: Fri, 25 Oct 2024 00:59:41 -0700 Subject: [PATCH 012/135] [Dashboard] Hover actions for panels (#182535) --- .../web_element_wrapper.ts | 8 +- packages/kbn-optimizer/limits.yml | 2 +- .../presentation_publishing/index.ts | 4 + .../interfaces/can_lock_hover_actions.ts | 27 + .../add_to_library_action.tsx | 2 + .../dashboard_actions/clone_panel_action.tsx | 2 + .../copy_to_dashboard_action.tsx | 2 + .../expand_panel_action.test.tsx | 19 +- .../dashboard_actions/expand_panel_action.tsx | 19 +- .../dashboard_actions/export_csv_action.tsx | 2 +- .../filters_notification_action.test.tsx | 22 - .../filters_notification_action.tsx | 25 +- .../filters_notification_popover.test.tsx | 18 +- .../filters_notification_popover.tsx | 35 +- .../public/dashboard_actions/index.ts | 2 + .../legacy_add_to_library_action.tsx | 2 + .../legacy_unlink_from_library_action.tsx | 2 + .../unlink_from_library_action.tsx | 2 + .../public/dashboard_api/track_panel.ts | 2 +- .../component/grid/_dashboard_grid.scss | 24 +- .../component/grid/_dashboard_panel.scss | 59 +- .../component/grid/dashboard_grid.tsx | 1 + .../component/grid/dashboard_grid_item.tsx | 12 +- .../viewport/_dashboard_viewport.scss | 6 + .../component/viewport/dashboard_viewport.tsx | 5 +- .../dashboard_top_nav/_dashboard_top_nav.scss | 2 +- .../actions/view_saved_search_action.ts | 3 +- .../compatibility/legacy_embeddable_to_api.ts | 5 + .../public/lib/embeddables/embeddable.tsx | 4 + .../public/lib/embeddables/i_embeddable.ts | 4 +- .../react_embeddable_renderer.test.tsx | 2 + .../react_embeddable_renderer.tsx | 5 + .../public/react_embeddable_system/types.ts | 3 +- .../public/embeddable/links_embeddable.tsx | 1 + .../inspect_panel_action.ts | 2 +- .../remove_panel_action.ts | 10 +- .../panel_component/_presentation_panel.scss | 91 ++- .../presentation_panel_context_menu.tsx | 177 ------ .../presentation_panel_header.tsx | 31 +- .../presentation_panel_hover_actions.tsx | 563 ++++++++++++++++++ .../panel_header/presentation_panel_title.tsx | 2 +- .../use_presentation_panel_header_actions.tsx | 23 +- .../presentation_panel_internal.test.tsx | 41 +- .../presentation_panel_internal.tsx | 100 ++-- .../public/panel_component/types.ts | 4 +- .../build_eui_context_menu_panels.tsx | 21 +- .../dynamic_action_grouping.ts | 2 +- .../group1/edit_embeddable_redirects.ts | 4 +- .../dashboard/group3/panel_context_menu.ts | 3 - .../group5/saved_search_embeddable.ts | 2 +- .../functional/page_objects/dashboard_page.ts | 10 +- .../screenshots/baseline/area_chart.png | Bin 50251 -> 71529 bytes .../baseline/dashboard_embed_mode.png | Bin 128213 -> 114594 bytes .../screenshots/baseline/tsvb_dashboard.png | Bin 31060 -> 45328 bytes .../services/dashboard/panel_actions.ts | 292 ++++----- .../dashboard/panel_drilldown_actions.ts | 7 +- .../panel_actions/panel_actions.ts | 4 - .../functions/common/containerStyle.ts | 2 +- .../functions/common/container_style.test.js | 4 +- .../renderers/embeddable/embeddable.scss | 10 + .../element_content/element_content.scss | 24 +- .../element_content/element_content.tsx | 7 +- .../components/element_content/index.tsx | 5 +- .../element_wrapper/element_wrapper.js | 4 +- .../components/element_wrapper/index.js | 2 +- .../actions/add_to_existing_case.tsx | 2 + .../visualizations/actions/mocks.ts | 4 +- .../drilldowns/actions/drilldown_shared.ts | 2 + .../flyout_create_drilldown.tsx | 2 + .../flyout_edit_drilldown.tsx | 2 + .../lens/public/embeddable/embeddable.tsx | 19 +- .../public/embeddable/interfaces/lens_api.ts | 5 +- .../open_in_discover_action.test.ts | 12 +- .../open_in_discover_action.ts | 31 +- .../open_in_discover_helpers.ts | 4 +- .../ui_actions/open_vis_in_ml_action.tsx | 2 + .../embeddable/use_actions.ts | 1 + .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - .../apps/group1/dashboard_panel_options.ts | 43 +- .../apps/canvas/embeddables/lens.ts | 52 +- .../apps/canvas/embeddables/maps.ts | 1 - .../apps/canvas/embeddables/visualization.ts | 2 - .../group2/dashboard_lens_by_value.ts | 3 - .../group2/dashboard_maps_by_value.ts | 1 - .../apps/dashboard/group2/panel_titles.ts | 3 +- .../drilldowns/explore_data_panel_action.ts | 7 +- .../group3/reporting/download_csv.ts | 45 +- .../baseline/sample_data_ecommerce_76.png | Bin 1315724 -> 1209040 bytes .../apps/lens/group1/ad_hoc_data_view.ts | 4 +- .../lens/group3/dashboard_inline_editing.ts | 5 - .../group4/show_underlying_data_dashboard.ts | 8 +- .../apps/lens/group6/lens_tagging.ts | 1 - .../apps/lens/open_in_lens/tsvb/dashboard.ts | 9 +- .../group2/embeddable/filter_by_map_extent.ts | 4 +- .../feature_controls/security.ts | 2 +- .../services/ml/lens_visualizations.ts | 2 +- .../apps/cases/group2/attachment_framework.ts | 4 +- .../services/scenarios.ts | 4 +- .../apps/dashboard/session_sharing/lens.ts | 2 - .../group2/open_in_lens/agg_based/gauge.ts | 6 +- .../cases/attachment_framework.ts | 4 +- .../search/dashboards/build_dashboard.ts | 1 - .../ftr/cases/attachment_framework.ts | 4 +- 105 files changed, 1349 insertions(+), 737 deletions(-) create mode 100644 packages/presentation/presentation_publishing/interfaces/can_lock_hover_actions.ts delete mode 100644 src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_context_menu.tsx create mode 100644 src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_hover_actions.tsx diff --git a/packages/kbn-ftr-common-functional-ui-services/services/web_element_wrapper/web_element_wrapper.ts b/packages/kbn-ftr-common-functional-ui-services/services/web_element_wrapper/web_element_wrapper.ts index 110251e4d759f..423fab660695b 100644 --- a/packages/kbn-ftr-common-functional-ui-services/services/web_element_wrapper/web_element_wrapper.ts +++ b/packages/kbn-ftr-common-functional-ui-services/services/web_element_wrapper/web_element_wrapper.ts @@ -427,16 +427,16 @@ export class WebElementWrapper { /** * Moves the remote environment’s mouse cursor to the current element with optional offset * https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/input_exports_Actions.html#move - * @param { xOffset: 0, yOffset: 0 } options + * @param { xOffset: 0, yOffset: 0, topOffset: number } options Optional * @return {Promise} */ - public async moveMouseTo(options = { xOffset: 0, yOffset: 0 }) { + public async moveMouseTo({ xOffset = 0, yOffset = 0, topOffset = 0 } = {}) { await this.retryCall(async function moveMouseTo(wrapper) { - await wrapper.scrollIntoViewIfNecessary(); + await wrapper.scrollIntoViewIfNecessary(topOffset); await wrapper.getActions().move({ x: 0, y: 0 }).perform(); await wrapper .getActions() - .move({ x: options.xOffset, y: options.yOffset, origin: wrapper._webElement }) + .move({ x: xOffset, y: yOffset, origin: wrapper._webElement }) .perform(); }); } diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index bd0234eaa87ec..7936e52ccbf18 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -23,7 +23,7 @@ pageLoadAssetSize: core: 564663 crossClusterReplication: 65408 customIntegrations: 22034 - dashboard: 52967 + dashboard: 68015 dashboardEnhanced: 65646 data: 454087 dataQuality: 19384 diff --git a/packages/presentation/presentation_publishing/index.ts b/packages/presentation/presentation_publishing/index.ts index ab5e396e65727..2b96c6d353eee 100644 --- a/packages/presentation/presentation_publishing/index.ts +++ b/packages/presentation/presentation_publishing/index.ts @@ -30,6 +30,10 @@ export { useInheritedViewMode, type CanAccessViewMode, } from './interfaces/can_access_view_mode'; +export { + apiCanLockHoverActions, + type CanLockHoverActions, +} from './interfaces/can_lock_hover_actions'; export { fetch$, useFetchContext, type FetchContext } from './interfaces/fetch/fetch'; export { initializeTimeRange, diff --git a/packages/presentation/presentation_publishing/interfaces/can_lock_hover_actions.ts b/packages/presentation/presentation_publishing/interfaces/can_lock_hover_actions.ts new file mode 100644 index 0000000000000..db7a0c5cc8a3b --- /dev/null +++ b/packages/presentation/presentation_publishing/interfaces/can_lock_hover_actions.ts @@ -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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { PublishingSubject } from '../publishing_subject'; + +/** + * This API can lock hover actions + */ +export interface CanLockHoverActions { + hasLockedHoverActions$: PublishingSubject; + lockHoverActions: (lock: boolean) => void; +} + +export const apiCanLockHoverActions = (api: unknown): api is CanLockHoverActions => { + return Boolean( + api && + (api as CanLockHoverActions).hasLockedHoverActions$ && + (api as CanLockHoverActions).lockHoverActions && + typeof (api as CanLockHoverActions).lockHoverActions === 'function' + ); +}; diff --git a/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx b/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx index acd46f2763bbc..90da6c3297cbd 100644 --- a/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx @@ -39,6 +39,7 @@ import { Action, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; import { coreServices } from '../services/kibana_services'; import { dashboardAddToLibraryActionStrings } from './_dashboard_actions_strings'; +import { DASHBOARD_ACTION_GROUP } from '.'; export const ACTION_ADD_TO_LIBRARY = 'saveToLibrary'; @@ -63,6 +64,7 @@ export class AddToLibraryAction implements Action { public readonly type = ACTION_ADD_TO_LIBRARY; public readonly id = ACTION_ADD_TO_LIBRARY; public order = 8; + public grouping = [DASHBOARD_ACTION_GROUP]; public getDisplayName({ embeddable }: EmbeddableApiContext) { if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); diff --git a/src/plugins/dashboard/public/dashboard_actions/clone_panel_action.tsx b/src/plugins/dashboard/public/dashboard_actions/clone_panel_action.tsx index 5eec25f1f052b..4eae444dfecb7 100644 --- a/src/plugins/dashboard/public/dashboard_actions/clone_panel_action.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/clone_panel_action.tsx @@ -20,6 +20,7 @@ import { HasUniqueId, } from '@kbn/presentation-publishing'; import { Action, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; +import { DASHBOARD_ACTION_GROUP } from '.'; import { dashboardClonePanelActionStrings } from './_dashboard_actions_strings'; export const ACTION_CLONE_PANEL = 'clonePanel'; @@ -41,6 +42,7 @@ export class ClonePanelAction implements Action { public readonly type = ACTION_CLONE_PANEL; public readonly id = ACTION_CLONE_PANEL; public order = 45; + public grouping = [DASHBOARD_ACTION_GROUP]; public getDisplayName({ embeddable }: EmbeddableApiContext) { if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); diff --git a/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_action.tsx b/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_action.tsx index fb31886919773..10b21fc36edcc 100644 --- a/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_action.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_action.tsx @@ -28,6 +28,7 @@ import { DASHBOARD_CONTAINER_TYPE } from '../dashboard_container'; import { coreServices } from '../services/kibana_services'; import { getDashboardCapabilities } from '../utils/get_dashboard_capabilities'; import { dashboardCopyToDashboardActionStrings } from './_dashboard_actions_strings'; +import { DASHBOARD_ACTION_GROUP } from '.'; import { CopyToDashboardModal } from './copy_to_dashboard_modal'; export const ACTION_COPY_TO_DASHBOARD = 'copyToDashboard'; @@ -59,6 +60,7 @@ export class CopyToDashboardAction implements Action { public readonly type = ACTION_COPY_TO_DASHBOARD; public readonly id = ACTION_COPY_TO_DASHBOARD; public order = 1; + public grouping = [DASHBOARD_ACTION_GROUP]; public getDisplayName({ embeddable }: EmbeddableApiContext) { if (!apiIsCompatible(embeddable)) throw new IncompatibleActionError(); diff --git a/src/plugins/dashboard/public/dashboard_actions/expand_panel_action.test.tsx b/src/plugins/dashboard/public/dashboard_actions/expand_panel_action.test.tsx index 09bc56ea88586..1ebf937e470e5 100644 --- a/src/plugins/dashboard/public/dashboard_actions/expand_panel_action.test.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/expand_panel_action.test.tsx @@ -13,15 +13,17 @@ import { ExpandPanelActionApi, ExpandPanelAction } from './expand_panel_action'; describe('Expand panel action', () => { let action: ExpandPanelAction; let context: { embeddable: ExpandPanelActionApi }; + let expandPanelIdSubject: BehaviorSubject; beforeEach(() => { + expandPanelIdSubject = new BehaviorSubject(undefined); action = new ExpandPanelAction(); context = { embeddable: { uuid: 'superId', parentApi: { expandPanel: jest.fn(), - expandedPanelId: new BehaviorSubject(undefined), + expandedPanelId: expandPanelIdSubject, }, }, }; @@ -38,19 +40,22 @@ describe('Expand panel action', () => { expect(await action.isCompatible(emptyContext)).toBe(false); }); + it('calls onChange when expandedPanelId changes', async () => { + const onChange = jest.fn(); + action.subscribeToCompatibilityChanges(context, onChange); + expandPanelIdSubject.next('superPanelId'); + expect(onChange).toHaveBeenCalledWith(true, action); + }); + it('returns the correct icon based on expanded panel id', async () => { expect(await action.getIconType(context)).toBe('expand'); - context.embeddable.parentApi.expandedPanelId = new BehaviorSubject( - 'superPanelId' - ); + expandPanelIdSubject.next('superPanelId'); expect(await action.getIconType(context)).toBe('minimize'); }); it('returns the correct display name based on expanded panel id', async () => { expect(await action.getDisplayName(context)).toBe('Maximize'); - context.embeddable.parentApi.expandedPanelId = new BehaviorSubject( - 'superPanelId' - ); + expandPanelIdSubject.next('superPanelId'); expect(await action.getDisplayName(context)).toBe('Minimize'); }); diff --git a/src/plugins/dashboard/public/dashboard_actions/expand_panel_action.tsx b/src/plugins/dashboard/public/dashboard_actions/expand_panel_action.tsx index b4f2a06e6895a..a207d181d26cc 100644 --- a/src/plugins/dashboard/public/dashboard_actions/expand_panel_action.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/expand_panel_action.tsx @@ -16,6 +16,8 @@ import { HasUniqueId, } from '@kbn/presentation-publishing'; import { Action, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; +import { skip } from 'rxjs'; +import { DASHBOARD_ACTION_GROUP } from '.'; import { dashboardExpandPanelActionStrings } from './_dashboard_actions_strings'; @@ -29,7 +31,8 @@ const isApiCompatible = (api: unknown | null): api is ExpandPanelActionApi => export class ExpandPanelAction implements Action { public readonly type = ACTION_EXPAND_PANEL; public readonly id = ACTION_EXPAND_PANEL; - public order = 7; + public order = 9; + public grouping = [DASHBOARD_ACTION_GROUP]; public getDisplayName({ embeddable }: EmbeddableApiContext) { if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); @@ -47,6 +50,20 @@ export class ExpandPanelAction implements Action { return isApiCompatible(embeddable); } + public couldBecomeCompatible({ embeddable }: EmbeddableApiContext) { + return apiHasParentApi(embeddable) && apiCanExpandPanels(embeddable.parentApi); + } + + public subscribeToCompatibilityChanges( + { embeddable }: EmbeddableApiContext, + onChange: (isCompatible: boolean, action: ExpandPanelAction) => void + ) { + if (!isApiCompatible(embeddable)) return; + return embeddable.parentApi.expandedPanelId.pipe(skip(1)).subscribe(() => { + onChange(isApiCompatible(embeddable), this); + }); + } + public async execute({ embeddable }: EmbeddableApiContext) { if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); embeddable.parentApi.expandPanel(embeddable.uuid); diff --git a/src/plugins/dashboard/public/dashboard_actions/export_csv_action.tsx b/src/plugins/dashboard/public/dashboard_actions/export_csv_action.tsx index fd55816134ed1..94dbf9e3087aa 100644 --- a/src/plugins/dashboard/public/dashboard_actions/export_csv_action.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/export_csv_action.tsx @@ -41,7 +41,7 @@ const isApiCompatible = (api: unknown | null): api is ExportCsvActionApi => export class ExportCSVAction implements Action { public readonly id = ACTION_EXPORT_CSV; public readonly type = ACTION_EXPORT_CSV; - public readonly order = 18; // right after Export in discover which is 19 + public readonly order = 18; public getIconType() { return 'exportAction'; diff --git a/src/plugins/dashboard/public/dashboard_actions/filters_notification_action.test.tsx b/src/plugins/dashboard/public/dashboard_actions/filters_notification_action.test.tsx index 29b0353979073..e639168b00c7f 100644 --- a/src/plugins/dashboard/public/dashboard_actions/filters_notification_action.test.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/filters_notification_action.test.tsx @@ -9,7 +9,6 @@ import { Filter, FilterStateStore, type AggregateQuery, type Query } from '@kbn/es-query'; -import { ViewMode } from '@kbn/presentation-publishing'; import { BehaviorSubject } from 'rxjs'; import { FiltersNotificationAction, @@ -42,7 +41,6 @@ describe('filters notification action', () => { let updateFilters: (filters: Filter[]) => void; let updateQuery: (query: Query | AggregateQuery | undefined) => void; - let updateViewMode: (viewMode: ViewMode) => void; beforeEach(() => { const filtersSubject = new BehaviorSubject(undefined); @@ -50,14 +48,10 @@ describe('filters notification action', () => { const querySubject = new BehaviorSubject(undefined); updateQuery = (query) => querySubject.next(query); - const viewModeSubject = new BehaviorSubject('edit'); - updateViewMode = (viewMode) => viewModeSubject.next(viewMode); - action = new FiltersNotificationAction(); context = { embeddable: { uuid: 'testId', - viewMode: viewModeSubject, filters$: filtersSubject, query$: querySubject, }, @@ -83,22 +77,6 @@ describe('filters notification action', () => { expect(await action.isCompatible(context)).toBe(true); }); - it('is incompatible when api is in view mode', async () => { - updateFilters([getMockPhraseFilter('SuperField', 'SuperValue')]); - updateQuery({ esql: 'FROM test_dataview' } as AggregateQuery); - updateViewMode('view'); - expect(await action.isCompatible(context)).toBe(false); - }); - - it('calls onChange when view mode changes', () => { - const onChange = jest.fn(); - updateFilters([getMockPhraseFilter('SuperField', 'SuperValue')]); - updateQuery({ esql: 'FROM test_dataview' } as AggregateQuery); - action.subscribeToCompatibilityChanges(context, onChange); - updateViewMode('view'); - expect(onChange).toHaveBeenCalledWith(false, action); - }); - it('calls onChange when filters change', async () => { const onChange = jest.fn(); action.subscribeToCompatibilityChanges(context, onChange); diff --git a/src/plugins/dashboard/public/dashboard_actions/filters_notification_action.tsx b/src/plugins/dashboard/public/dashboard_actions/filters_notification_action.tsx index 854ff5da948f4..9662c8956dcc8 100644 --- a/src/plugins/dashboard/public/dashboard_actions/filters_notification_action.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/filters_notification_action.tsx @@ -13,17 +13,15 @@ import { merge } from 'rxjs'; import { isOfAggregateQueryType, isOfQueryType } from '@kbn/es-query'; import { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; import { - CanAccessViewMode, + apiPublishesPartialUnifiedSearch, + apiHasUniqueId, EmbeddableApiContext, HasParentApi, HasUniqueId, PublishesDataViews, PublishesUnifiedSearch, - apiCanAccessViewMode, - apiHasUniqueId, - apiPublishesPartialUnifiedSearch, - getInheritedViewMode, - getViewModeSubject, + CanLockHoverActions, + CanAccessViewMode, } from '@kbn/presentation-publishing'; import { Action, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; @@ -34,17 +32,16 @@ import { FiltersNotificationPopover } from './filters_notification_popover'; export const BADGE_FILTERS_NOTIFICATION = 'ACTION_FILTERS_NOTIFICATION'; export type FiltersNotificationActionApi = HasUniqueId & - CanAccessViewMode & Partial & - Partial>>; + Partial>> & + Partial & + Partial; const isApiCompatible = (api: unknown | null): api is FiltersNotificationActionApi => - Boolean( - apiHasUniqueId(api) && apiCanAccessViewMode(api) && apiPublishesPartialUnifiedSearch(api) - ); + Boolean(apiHasUniqueId(api) && apiPublishesPartialUnifiedSearch(api)); const compatibilityCheck = (api: EmbeddableApiContext['embeddable']) => { - if (!isApiCompatible(api) || getInheritedViewMode(api) !== 'edit') return false; + if (!isApiCompatible(api)) return false; const query = api.query$?.value; return ( (api.filters$?.value ?? []).length > 0 || @@ -97,9 +94,7 @@ export class FiltersNotificationAction implements Action { ) { if (!isApiCompatible(embeddable)) return; return merge( - ...[embeddable.query$, embeddable.filters$, getViewModeSubject(embeddable)].filter((value) => - Boolean(value) - ) + ...[embeddable.query$, embeddable.filters$].filter((value) => Boolean(value)) ).subscribe(() => onChange(compatibilityCheck(embeddable), this)); } diff --git a/src/plugins/dashboard/public/dashboard_actions/filters_notification_popover.test.tsx b/src/plugins/dashboard/public/dashboard_actions/filters_notification_popover.test.tsx index b02443f01aaa8..4488a96b52b68 100644 --- a/src/plugins/dashboard/public/dashboard_actions/filters_notification_popover.test.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/filters_notification_popover.test.tsx @@ -10,13 +10,13 @@ import { AggregateQuery, Filter, FilterStateStore, Query } from '@kbn/es-query'; import { I18nProvider } from '@kbn/i18n-react'; import { waitForEuiPopoverOpen } from '@elastic/eui/lib/test/rtl'; -import { ViewMode } from '@kbn/presentation-publishing'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; import { BehaviorSubject } from 'rxjs'; import { FiltersNotificationActionApi } from './filters_notification_action'; import { FiltersNotificationPopover } from './filters_notification_popover'; +import { ViewMode } from '@kbn/presentation-publishing'; const getMockPhraseFilter = (key: string, value: string): Filter => { return { @@ -50,18 +50,23 @@ describe('filters notification popover', () => { let api: FiltersNotificationActionApi; let updateFilters: (filters: Filter[]) => void; let updateQuery: (query: Query | AggregateQuery | undefined) => void; + let updateViewMode: (viewMode: ViewMode) => void; beforeEach(async () => { const filtersSubject = new BehaviorSubject(undefined); updateFilters = (filters) => filtersSubject.next(filters); const querySubject = new BehaviorSubject(undefined); updateQuery = (query) => querySubject.next(query); + const viewModeSubject = new BehaviorSubject('view'); + updateViewMode = (viewMode) => viewModeSubject.next(viewMode); api = { uuid: 'testId', - viewMode: new BehaviorSubject('edit'), filters$: filtersSubject, query$: querySubject, + parentApi: { + viewMode: viewModeSubject, + }, }; }); @@ -87,7 +92,15 @@ describe('filters notification popover', () => { expect(await screen.findByTestId('filtersNotificationModal__query')).toBeInTheDocument(); }); + it('does not render an edit button when not in edit mode', async () => { + await renderAndOpenPopover(); + expect( + await screen.queryByTestId('filtersNotificationModal__editButton') + ).not.toBeInTheDocument(); + }); + it('renders an edit button when the edit panel action is compatible', async () => { + updateViewMode('edit'); updateFilters([getMockPhraseFilter('ay', 'oh')]); await renderAndOpenPopover(); expect(await screen.findByTestId('filtersNotificationModal__editButton')).toBeInTheDocument(); @@ -104,6 +117,7 @@ describe('filters notification popover', () => { }); it('calls edit action execute when edit button is clicked', async () => { + updateViewMode('edit'); updateFilters([getMockPhraseFilter('ay', 'oh')]); await renderAndOpenPopover(); const editButton = await screen.findByTestId('filtersNotificationModal__editButton'); diff --git a/src/plugins/dashboard/public/dashboard_actions/filters_notification_popover.tsx b/src/plugins/dashboard/public/dashboard_actions/filters_notification_popover.tsx index bafd06297fe7e..5f23b21dc9155 100644 --- a/src/plugins/dashboard/public/dashboard_actions/filters_notification_popover.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/filters_notification_popover.tsx @@ -26,8 +26,11 @@ import { css } from '@emotion/react'; import { AggregateQuery, getAggregateQueryMode, isOfQueryType } from '@kbn/es-query'; import { getEditPanelAction } from '@kbn/presentation-panel-plugin/public'; import { FilterItems } from '@kbn/unified-search-plugin/public'; -import { useStateFromPublishingSubject } from '@kbn/presentation-publishing'; -import { BehaviorSubject } from 'rxjs'; +import { + apiCanLockHoverActions, + getViewModeSubject, + useBatchedOptionalPublishingSubjects, +} from '@kbn/presentation-publishing'; import { dashboardFilterNotificationActionStrings } from './_dashboard_actions_strings'; import { FiltersNotificationActionApi } from './filters_notification_action'; @@ -59,8 +62,10 @@ export function FiltersNotificationPopover({ api }: { api: FiltersNotificationAc } }, [api, setDisableEditButton]); - const dataViews = useStateFromPublishingSubject( - api.parentApi?.dataViews ? api.parentApi.dataViews : new BehaviorSubject(undefined) + const [hasLockedHoverActions, dataViews, parentViewMode] = useBatchedOptionalPublishingSubjects( + api.hasLockedHoverActions$, + api.parentApi?.dataViews, + getViewModeSubject(api ?? undefined) ); return ( @@ -69,13 +74,23 @@ export function FiltersNotificationPopover({ api }: { api: FiltersNotificationAc setIsPopoverOpen(!isPopoverOpen)} + onClick={() => { + setIsPopoverOpen(!isPopoverOpen); + if (apiCanLockHoverActions(api)) { + api?.lockHoverActions(!hasLockedHoverActions); + } + }} data-test-subj={`embeddablePanelNotification-${api.uuid}`} aria-label={displayName} /> } isOpen={isPopoverOpen} - closePopover={() => setIsPopoverOpen(false)} + closePopover={() => { + setIsPopoverOpen(false); + if (apiCanLockHoverActions(api)) { + api.lockHoverActions(false); + } + }} anchorPosition="upCenter" > {displayName} @@ -112,8 +127,8 @@ export function FiltersNotificationPopover({ api }: { api: FiltersNotificationAc )} - - {!disableEditbutton && ( + {!disableEditbutton && parentViewMode === 'edit' && ( + - )} - + + )} ); } diff --git a/src/plugins/dashboard/public/dashboard_actions/index.ts b/src/plugins/dashboard/public/dashboard_actions/index.ts index 55a371719d953..1b9f2091fbce6 100644 --- a/src/plugins/dashboard/public/dashboard_actions/index.ts +++ b/src/plugins/dashboard/public/dashboard_actions/index.ts @@ -24,6 +24,8 @@ interface BuildAllDashboardActionsProps { plugins: DashboardStartDependencies; } +export const DASHBOARD_ACTION_GROUP = { id: 'dashboard_actions', order: 10 } as const; + export const buildAllDashboardActions = async ({ plugins, allowByValueEmbeddables, diff --git a/src/plugins/dashboard/public/dashboard_actions/legacy_add_to_library_action.tsx b/src/plugins/dashboard/public/dashboard_actions/legacy_add_to_library_action.tsx index dee049dc2874e..6cc46b6af51e3 100644 --- a/src/plugins/dashboard/public/dashboard_actions/legacy_add_to_library_action.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/legacy_add_to_library_action.tsx @@ -18,6 +18,7 @@ import { HasLegacyLibraryTransforms, } from '@kbn/presentation-publishing'; import { Action, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; +import { DASHBOARD_ACTION_GROUP } from '.'; import { dashboardAddToLibraryActionStrings } from './_dashboard_actions_strings'; import { coreServices } from '../services/kibana_services'; @@ -35,6 +36,7 @@ export class LegacyAddToLibraryAction implements Action { public readonly type = ACTION_LEGACY_ADD_TO_LIBRARY; public readonly id = ACTION_LEGACY_ADD_TO_LIBRARY; public order = 15; + public grouping = [DASHBOARD_ACTION_GROUP]; public getDisplayName({ embeddable }: EmbeddableApiContext) { if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); diff --git a/src/plugins/dashboard/public/dashboard_actions/legacy_unlink_from_library_action.tsx b/src/plugins/dashboard/public/dashboard_actions/legacy_unlink_from_library_action.tsx index 96daab215dec6..668f02dee3159 100644 --- a/src/plugins/dashboard/public/dashboard_actions/legacy_unlink_from_library_action.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/legacy_unlink_from_library_action.tsx @@ -20,6 +20,7 @@ import { HasLegacyLibraryTransforms, } from '@kbn/presentation-publishing'; import { dashboardUnlinkFromLibraryActionStrings } from './_dashboard_actions_strings'; +import { DASHBOARD_ACTION_GROUP } from '.'; import { coreServices } from '../services/kibana_services'; export const ACTION_LEGACY_UNLINK_FROM_LIBRARY = 'legacyUnlinkFromLibrary'; @@ -37,6 +38,7 @@ export class LegacyUnlinkFromLibraryAction implements Action { public readonly type = ACTION_UNLINK_FROM_LIBRARY; public readonly id = ACTION_UNLINK_FROM_LIBRARY; public order = 15; + public grouping = [DASHBOARD_ACTION_GROUP]; public getDisplayName({ embeddable }: EmbeddableApiContext) { if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); diff --git a/src/plugins/dashboard/public/dashboard_api/track_panel.ts b/src/plugins/dashboard/public/dashboard_api/track_panel.ts index 42345f38d614f..b9f9b3218488b 100644 --- a/src/plugins/dashboard/public/dashboard_api/track_panel.ts +++ b/src/plugins/dashboard/public/dashboard_api/track_panel.ts @@ -73,7 +73,7 @@ export function initializeTrackPanel(untilEmbeddableLoaded: (id: string) => Prom }; return; } - panelRef.scrollIntoView({ block: 'nearest' }); + panelRef.scrollIntoView({ block: 'start' }); }); }, scrollToTop: () => { diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/_dashboard_grid.scss b/src/plugins/dashboard/public/dashboard_container/component/grid/_dashboard_grid.scss index f6e7918fb1b0b..49a6b01049da7 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/_dashboard_grid.scss +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/_dashboard_grid.scss @@ -19,7 +19,7 @@ .dshLayout--editing { .react-resizable-handle { @include size($euiSizeL); - z-index: $euiZLevel1; /* 1 */ + z-index: $euiZLevel2; /* 1 */ right: 0; bottom: 0; padding-right: $euiSizeS; @@ -33,6 +33,10 @@ */ .dshLayout-isMaximizedPanel { height: 100% !important; /* 1. */ + + .embPanel__hoverActionsLeft { + visibility: hidden; + } } /** @@ -40,8 +44,7 @@ * Shifting the rendered panels offscreen prevents a quick flash when redrawing the panels on minimize */ .dshDashboardGrid__item--hidden { - top: -9999px; - left: -9999px; + transform: translate(-9999px, -9999px); } /** @@ -98,13 +101,26 @@ */ &.resizing, &.react-draggable-dragging { - z-index: $euiZLevel2 !important; + z-index: $euiZLevel3 !important; } &.react-draggable-dragging { transition: box-shadow $euiAnimSpeedFast $euiAnimSlightResistance; @include euiBottomShadowLarge; border-radius: $euiBorderRadius; // keeps shadow within bounds + + .embPanel__hoverActionsWrapper { + z-index: $euiZLevel9; + top: -$euiSizeXL; + + .embPanel__hoverActions:has(.embPanel--dragHandle) { + opacity: 1; + } + + .embPanel__hoverActions:not(:has(.embPanel--dragHandle)) { + opacity: 0; + } + } } /** diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/_dashboard_panel.scss b/src/plugins/dashboard/public/dashboard_container/component/grid/_dashboard_panel.scss index d54f513a207a4..93a95e1ef37e5 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/_dashboard_panel.scss +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/_dashboard_panel.scss @@ -4,24 +4,42 @@ * .embPanel--editing doesn't get updating without a hard refresh */ -.dshDashboardGrid__item { - scroll-margin-top: calc((var(--euiFixedHeadersOffset, 100) * 2) + $euiSizeS); - scroll-margin-bottom: $euiSizeS; +.dshLayout--editing { + // change the style of the hover actions border to a dashed line in edit mode + .embPanel__hoverActionsAnchor { + .embPanel__hoverActionsWrapper { + .embPanel__hoverActions { + border-color: $euiColorMediumShade; + border-style: dashed; + } + } + } } // LAYOUT MODES // Adjust borders/etc... for non-spaced out and expanded panels .dshLayout-withoutMargins { - .embPanel { + .embPanel, + .embPanel__hoverActionsAnchor { box-shadow: none; + outline: none; border-radius: 0; } - .embPanel__content { - border-radius: 0; + &.dshLayout--editing { + .embPanel__hoverActionsAnchor:hover { + outline: 1px dashed $euiColorMediumShade; + } } - .dshDashboardGrid__item--highlighted { + .embPanel__hoverActionsAnchor:hover { + outline: $euiBorderThin; + z-index: $euiZLevel2; + } + + .embPanel__content, + .dshDashboardGrid__item--highlighted, + .lnsExpressionRenderer { border-radius: 0; } } @@ -35,6 +53,20 @@ background-color: unset; cursor: default; } + + .embPanel__hoverActions { + .embPanel--dragHandle { + visibility: hidden; + } + } +} + +// Hide hover actions when dashboard has an overlay +.dshDashboardGrid__item--blurred, +.dshDashboardGrid__item--focused { + .embPanel__hoverActions { + visibility: hidden; + } } @keyframes highlightOutline { @@ -52,10 +84,11 @@ } .dshDashboardGrid__item--highlighted { - border-radius: $euiSizeXS; - animation-name: highlightOutline; - animation-duration: 4s; - animation-timing-function: ease-out; - // keeps outline from getting cut off by other panels without margins - z-index: 999 !important; + .embPanel { + border-radius: $euiSizeXS; + animation-name: highlightOutline; + animation-duration: 4s; + animation-timing-function: ease-out; + z-index: $euiZLevel2; + } } diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.tsx b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.tsx index 577661b393c67..0ef976af51eb6 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.tsx @@ -133,6 +133,7 @@ export const DashboardGrid = ({ viewportWidth }: { viewportWidth: number }) => { rowHeight={DASHBOARD_GRID_HEIGHT} margin={useMargins ? [DASHBOARD_MARGIN_SIZE, DASHBOARD_MARGIN_SIZE] : [0, 0]} draggableHandle={'.embPanel--dragHandle'} + useCSSTransforms={false} > {panelComponents} diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx index 7b21db4ea3f84..9b5a00c628608 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx @@ -15,6 +15,7 @@ import { css } from '@emotion/react'; import { EmbeddablePanel, ReactEmbeddableRenderer } from '@kbn/embeddable-plugin/public'; import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; +import { DASHBOARD_MARGIN_SIZE } from '../../../dashboard_constants'; import { DashboardPanelState } from '../../../../common'; import { useDashboardApi } from '../../../dashboard_api/use_dashboard_api'; import { embeddableService, presentationUtilService } from '../../../services/kibana_services'; @@ -91,12 +92,21 @@ export const Item = React.forwardRef( } }, [id, dashboardApi, scrollToPanelId, highlightPanelId, ref, blurPanel]); + const dashboardContainerTopOffset = + (document.querySelector('.dashboardContainer') as HTMLDivElement)?.offsetTop || 0; + const globalNavTopOffset = + (document.querySelector('#app-fixed-viewport') as HTMLDivElement)?.offsetTop || 0; + const focusStyles = blurPanel ? css` pointer-events: none; opacity: 0.25; ` - : undefined; + : css` + scroll-margin-top: ${dashboardContainerTopOffset + + globalNavTopOffset + + DASHBOARD_MARGIN_SIZE}px; + `; const renderedEmbeddable = useMemo(() => { const panelProps = { diff --git a/src/plugins/dashboard/public/dashboard_container/component/viewport/_dashboard_viewport.scss b/src/plugins/dashboard/public/dashboard_container/component/viewport/_dashboard_viewport.scss index f0c51724b551b..79e7c16bfe4a7 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/viewport/_dashboard_viewport.scss +++ b/src/plugins/dashboard/public/dashboard_container/component/viewport/_dashboard_viewport.scss @@ -23,3 +23,9 @@ .dashboardViewport--screenshotMode .controlsWrapper--empty { display:none } + +.dshDashboardViewportWrapper--isFullscreen { + .dshDashboardGrid__item--expanded { + padding: $euiSizeS; + } +} \ No newline at end of file diff --git a/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx b/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx index ac39b3747b1bd..664a3c43a8d9d 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx @@ -57,6 +57,7 @@ export const DashboardViewportComponent = () => { viewMode, useMargins, uuid, + fullScreenMode, ] = useBatchedPublishingSubjects( dashboardApi.controlGroupApi$, dashboardApi.panelTitle, @@ -66,7 +67,8 @@ export const DashboardViewportComponent = () => { dashboardApi.panels$, dashboardApi.viewMode, dashboardApi.useMargins$, - dashboardApi.uuid$ + dashboardApi.uuid$, + dashboardApi.fullScreenMode$ ); const panelCount = useMemo(() => { @@ -114,6 +116,7 @@ export const DashboardViewportComponent = () => {
{viewMode !== ViewMode.PRINT ? ( diff --git a/src/plugins/dashboard/public/dashboard_top_nav/_dashboard_top_nav.scss b/src/plugins/dashboard/public/dashboard_top_nav/_dashboard_top_nav.scss index 6b0141a50861d..0d3f80ae79fec 100644 --- a/src/plugins/dashboard/public/dashboard_top_nav/_dashboard_top_nav.scss +++ b/src/plugins/dashboard/public/dashboard_top_nav/_dashboard_top_nav.scss @@ -7,7 +7,7 @@ .dashboardTopNav { width: 100%; position: sticky; - z-index: $euiZLevel2; + z-index: $euiZLevel3; top: var(--euiFixedHeadersOffset, 0); background: $euiPageBackgroundColor; } diff --git a/src/plugins/discover/public/embeddable/actions/view_saved_search_action.ts b/src/plugins/discover/public/embeddable/actions/view_saved_search_action.ts index 4d77e9dbd4400..d1092a28d9f55 100644 --- a/src/plugins/discover/public/embeddable/actions/view_saved_search_action.ts +++ b/src/plugins/discover/public/embeddable/actions/view_saved_search_action.ts @@ -20,6 +20,7 @@ export const ACTION_VIEW_SAVED_SEARCH = 'ACTION_VIEW_SAVED_SEARCH'; export class ViewSavedSearchAction implements Action { public id = ACTION_VIEW_SAVED_SEARCH; public readonly type = ACTION_VIEW_SAVED_SEARCH; + public readonly order = 20; // Same order as ACTION_OPEN_IN_DISCOVER constructor( private readonly application: ApplicationStart, @@ -43,7 +44,7 @@ export class ViewSavedSearchAction implements Action { } getIconType(): string | undefined { - return 'inspect'; + return 'discoverApp'; } async isCompatible({ embeddable }: EmbeddableApiContext) { 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 dab0968af0056..daab774d7f35d 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 @@ -245,6 +245,8 @@ export const legacyEmbeddableToApi = ( return !isInputControl && !isMarkdown && !isImage && !isLinks; }; + const hasLockedHoverActions$ = new BehaviorSubject(false); + return { api: { parentApi: parentApi as LegacyEmbeddableAPI['parentApi'], @@ -270,6 +272,9 @@ export const legacyEmbeddableToApi = ( disabledActionIds, setDisabledActionIds: (ids) => disabledActionIds.next(ids), + hasLockedHoverActions$, + lockHoverActions: (lock: boolean) => hasLockedHoverActions$.next(lock), + panelTitle, setPanelTitle, defaultPanelTitle, diff --git a/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx b/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx index 89df109be5ef1..9fc3598bcd5ad 100644 --- a/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx +++ b/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx @@ -148,6 +148,8 @@ export abstract class Embeddable< canUnlinkFromLibrary: this.canUnlinkFromLibrary, isCompatibleWithUnifiedSearch: this.isCompatibleWithUnifiedSearch, savedObjectId: this.savedObjectId, + hasLockedHoverActions$: this.hasLockedHoverActions$, + lockHoverActions: this.lockHoverActions, } = api); setTimeout(() => { @@ -191,6 +193,8 @@ export abstract class Embeddable< public canUnlinkFromLibrary: LegacyEmbeddableAPI['canUnlinkFromLibrary']; public isCompatibleWithUnifiedSearch: LegacyEmbeddableAPI['isCompatibleWithUnifiedSearch']; public savedObjectId: LegacyEmbeddableAPI['savedObjectId']; + public hasLockedHoverActions$: LegacyEmbeddableAPI['hasLockedHoverActions$']; + public lockHoverActions: LegacyEmbeddableAPI['lockHoverActions']; public async getEditHref(): Promise { return this.getOutput().editUrl ?? undefined; diff --git a/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts b/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts index 779c1a235bc82..57cf7eec6eb95 100644 --- a/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts +++ b/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts @@ -27,6 +27,7 @@ import { PublishesSavedObjectId, HasLegacyLibraryTransforms, EmbeddableAppContext, + CanLockHoverActions, } from '@kbn/presentation-publishing'; import { Observable } from 'rxjs'; import { EmbeddableInput } from '../../../common/types'; @@ -58,7 +59,8 @@ export type LegacyEmbeddableAPI = HasType & Partial & HasParentApi & EmbeddableHasTimeRange & - PublishesSavedObjectId; + PublishesSavedObjectId & + CanLockHoverActions; export interface EmbeddableOutput { // Whether the embeddable is actively loading. diff --git a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx index 3722647526c79..63433d1d1319b 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx +++ b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx @@ -194,6 +194,8 @@ describe('react embeddable renderer', () => { resetUnsavedChanges: expect.any(Function), snapshotRuntimeState: expect.any(Function), phase$: expect.any(Object), + hasLockedHoverActions$: expect.any(Object), + lockHoverActions: expect.any(Function), }) ); }); diff --git a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx index 0f9ae361bbf93..c3dc06e198cd8 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx +++ b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx @@ -122,11 +122,16 @@ export const ReactEmbeddableRenderer = < const setApi = ( apiRegistration: SetReactEmbeddableApiRegistration ) => { + const hasLockedHoverActions$ = new BehaviorSubject(false); return { ...apiRegistration, uuid, phase$, parentApi, + hasLockedHoverActions$, + lockHoverActions: (lock: boolean) => { + hasLockedHoverActions$.next(lock); + }, type: factory.type, } as unknown as Api; }; diff --git a/src/plugins/embeddable/public/react_embeddable_system/types.ts b/src/plugins/embeddable/public/react_embeddable_system/types.ts index 1ab43d4bb1b7d..4ba8653310ff0 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/types.ts +++ b/src/plugins/embeddable/public/react_embeddable_system/types.ts @@ -14,6 +14,7 @@ import { } from '@kbn/presentation-containers'; import { DefaultPresentationPanelApi } from '@kbn/presentation-panel-plugin/public/panel_component/types'; import { + CanLockHoverActions, HasType, PublishesPhaseEvents, PublishesUnsavedChanges, @@ -48,7 +49,7 @@ export type SetReactEmbeddableApiRegistration< SerializedState, RuntimeState > -> = Omit; +> = Omit; /** * Defines the subset of the default embeddable API that the `buildApi` method uses, which allows implementors diff --git a/src/plugins/links/public/embeddable/links_embeddable.tsx b/src/plugins/links/public/embeddable/links_embeddable.tsx index 177f2f1c82118..685f0a6c46a3b 100644 --- a/src/plugins/links/public/embeddable/links_embeddable.tsx +++ b/src/plugins/links/public/embeddable/links_embeddable.tsx @@ -248,6 +248,7 @@ export const getLinksEmbeddableFactory = () => { data-shared-item data-rendering-count={1} data-test-subj="links--component" + borderRadius="none" > { export class InspectPanelAction implements Action { public readonly type = ACTION_INSPECT_PANEL; public readonly id = ACTION_INSPECT_PANEL; - public order = 20; + public order = 19; // right after Explore in Discover which is 20 constructor() {} diff --git a/src/plugins/presentation_panel/public/panel_actions/remove_panel_action/remove_panel_action.ts b/src/plugins/presentation_panel/public/panel_actions/remove_panel_action/remove_panel_action.ts index b065ed5cedf59..335fda267a800 100644 --- a/src/plugins/presentation_panel/public/panel_actions/remove_panel_action/remove_panel_action.ts +++ b/src/plugins/presentation_panel/public/panel_actions/remove_panel_action/remove_panel_action.ts @@ -33,14 +33,8 @@ const isApiCompatible = (api: unknown | null): api is RemovePanelActionApi => export class RemovePanelAction implements Action { public readonly type = ACTION_REMOVE_PANEL; public readonly id = ACTION_REMOVE_PANEL; - public order = 1; - - public grouping = [ - { - id: 'delete_panel_action', - order: 1, - }, - ]; + public order = 0; + public grouping = [{ id: 'remove_panel_group', order: 1 }]; constructor() {} diff --git a/src/plugins/presentation_panel/public/panel_component/_presentation_panel.scss b/src/plugins/presentation_panel/public/panel_component/_presentation_panel.scss index 434cca42e7c9f..5094cf6b02ba3 100644 --- a/src/plugins/presentation_panel/public/panel_component/_presentation_panel.scss +++ b/src/plugins/presentation_panel/public/panel_component/_presentation_panel.scss @@ -6,6 +6,8 @@ height: 100%; min-height: $euiSizeL + 2px; // + 2px to account for border position: relative; + border: none; + outline: $euiBorderThin; &-isLoading { // completely center the loading indicator @@ -44,6 +46,13 @@ display: flex; // ensure menu button is on the right even if the title doesn't exist justify-content: flex-end; + height: $euiSizeL; +} + +.embPanel__header + .embPanel__content { + border-radius: 0; + border-bottom-left-radius: $euiBorderRadius; + border-bottom-right-radius: $euiBorderRadius; } .embPanel__title { @@ -112,7 +121,6 @@ &:focus { background-color: transparentize($euiColorLightestShade, .5); } - } .embPanel__optionsMenuPopover-loading { @@ -129,43 +137,20 @@ font-size: $euiSizeL; } -.embPanel .embPanel__optionsMenuButton { - opacity: 0; /* 1 */ - - &:focus { - opacity: 1; /* 2 */ - } -} - -.embPanel:hover { - .embPanel__optionsMenuButton { - opacity: 1; - } -} - // EDITING MODE .embPanel--editing { transition: all $euiAnimSpeedFast $euiAnimSlightResistance; + outline: 1px dashed $euiColorMediumShade; .embPanel--dragHandle { transition: background-color $euiAnimSpeedFast $euiAnimSlightResistance; - &:hover { + .embPanel--dragHandle:hover { background-color: transparentize($euiColorWarning, lightOrDarkTheme(.9, .7)); cursor: move; } } - - .embPanel__content { - border-radius: 0; - border-bottom-left-radius: $euiBorderRadius; - border-bottom-right-radius: $euiBorderRadius; - } - - .embPanel__optionsMenuButton { - opacity: 1; /* 3 */ - } } // LOADING and ERRORS @@ -184,3 +169,57 @@ padding-left: $euiSizeS; z-index: $euiZLevel1; } + +.embPanel__hoverActionsAnchor { + position: relative; + height: 100%; + + .embPanel__hoverActionsWrapper { + height: $euiSizeXL; + position: absolute; + top: 0; + display: flex; + justify-content: space-between; + padding: 0 $euiSize; + flex-wrap: nowrap; + min-width: 100%; + z-index: -1; + pointer-events: none; // Prevent hover actions wrapper from blocking interactions with other panels + } + + .embPanel__hoverActions { + opacity: 0; + padding: calc($euiSizeXS - 1px); + display: flex; + flex-wrap: nowrap; + border: $euiBorderThin; + + background-color: $euiColorEmptyShade; + height: $euiSizeXL; + + pointer-events: all; // Re-enable pointer-events for hover actions + } + + .embPanel--dragHandle { + cursor: move; + + img { + pointer-events: all !important; + } + } + + .embPanel__descriptionTooltipAnchor { + padding: $euiSizeXS; + } + + &:hover .embPanel__hoverActionsWrapper, + &:focus-within .embPanel__hoverActionsWrapper, + .embPanel__hoverActionsWrapper--lockHoverActions { + z-index: $euiZLevel9; + top: -$euiSizeXL; + + .embPanel__hoverActions { + opacity: 1; + } + } +} \ No newline at end of file diff --git a/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_context_menu.tsx b/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_context_menu.tsx deleted file mode 100644 index 2376c4b43edbb..0000000000000 --- a/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_context_menu.tsx +++ /dev/null @@ -1,177 +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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { i18n } from '@kbn/i18n'; -import classNames from 'classnames'; -import React, { useEffect, useMemo, useState } from 'react'; - -import { - EuiButtonIcon, - EuiContextMenu, - EuiContextMenuItem, - EuiContextMenuPanel, - EuiContextMenuPanelDescriptor, - EuiPopover, - EuiSkeletonText, -} from '@elastic/eui'; -import { Action, buildContextMenuForActions } from '@kbn/ui-actions-plugin/public'; - -import { - getViewModeSubject, - useBatchedOptionalPublishingSubjects, -} from '@kbn/presentation-publishing'; -import { uiActions } from '../../kibana_services'; -import { contextMenuTrigger, CONTEXT_MENU_TRIGGER } from '../../panel_actions'; -import { getContextMenuAriaLabel } from '../presentation_panel_strings'; -import { DefaultPresentationPanelApi, PresentationPanelInternalProps } from '../types'; - -export const PresentationPanelContextMenu = ({ - api, - index, - getActions, - actionPredicate, -}: { - index?: number; - api: DefaultPresentationPanelApi; - getActions: PresentationPanelInternalProps['getActions']; - actionPredicate?: (actionId: string) => boolean; -}) => { - const [menuPanelsLoading, setMenuPanelsLoading] = useState(false); - const [contextMenuActions, setContextMenuActions] = useState>>([]); - const [isContextMenuOpen, setIsContextMenuOpen] = useState(undefined); - const [contextMenuPanels, setContextMenuPanels] = useState([]); - - const [title, parentViewMode] = useBatchedOptionalPublishingSubjects( - api.panelTitle, - - /** - * View mode changes often have the biggest influence over which actions will be compatible, - * so we build and update all actions when the view mode changes. This is temporary, as these - * actions should eventually all be Frequent Compatibility Change Actions which can track their - * own dependencies. - */ - getViewModeSubject(api) - ); - - useEffect(() => { - /** - * isContextMenuOpen starts as undefined which allows this use effect to run on mount. This - * is required so that showNotification is calculated on mount. - */ - if (isContextMenuOpen === false || !api) return; - - setMenuPanelsLoading(true); - let canceled = false; - (async () => { - /** - * Build and update all actions - */ - let compatibleActions: Array> = await (async () => { - if (getActions) return await getActions(CONTEXT_MENU_TRIGGER, { embeddable: api }); - return ( - (await uiActions.getTriggerCompatibleActions(CONTEXT_MENU_TRIGGER, { - embeddable: api, - })) ?? [] - ); - })(); - if (canceled) return; - - const disabledActions = api.disabledActionIds?.value; - if (disabledActions) { - compatibleActions = compatibleActions.filter( - (action) => disabledActions.indexOf(action.id) === -1 - ); - } - - if (actionPredicate) { - compatibleActions = compatibleActions.filter(({ id }) => actionPredicate(id)); - } - - compatibleActions.sort( - ({ order: orderA }, { order: orderB }) => (orderB || 0) - (orderA || 0) - ); - - /** - * Build context menu panel from actions - */ - const panels = await buildContextMenuForActions({ - actions: compatibleActions.map((action) => ({ - action, - context: { embeddable: api }, - trigger: contextMenuTrigger, - })), - closeMenu: () => setIsContextMenuOpen(false), - }); - if (canceled) return; - - setMenuPanelsLoading(false); - setContextMenuActions(compatibleActions); - setContextMenuPanels(panels); - })(); - return () => { - canceled = true; - }; - }, [actionPredicate, api, getActions, isContextMenuOpen, parentViewMode]); - - const showNotification = useMemo( - () => contextMenuActions.some((action) => action.showNotification), - [contextMenuActions] - ); - - const contextMenuClasses = classNames({ - // eslint-disable-next-line @typescript-eslint/naming-convention - embPanel__optionsMenuPopover: true, - 'embPanel__optionsMenuPopover-notification': showNotification, - }); - - const ContextMenuButton = ( - setIsContextMenuOpen((isOpen) => !isOpen)} - iconType={'boxesHorizontal'} - /> - ); - - return ( - setIsContextMenuOpen(false)} - data-test-subj={ - isContextMenuOpen ? 'embeddablePanelContextMenuOpen' : 'embeddablePanelContextMenuClosed' - } - > - {menuPanelsLoading ? ( - - - - - - ) : ( - - )} - - ); -}; diff --git a/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_header.tsx b/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_header.tsx index 669f15cb2ba6b..0747e4a4f8229 100644 --- a/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_header.tsx +++ b/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_header.tsx @@ -13,7 +13,6 @@ import classNames from 'classnames'; import React from 'react'; import { getAriaLabelForTitle } from '../presentation_panel_strings'; import { DefaultPresentationPanelApi, PresentationPanelInternalProps } from '../types'; -import { PresentationPanelContextMenu } from './presentation_panel_context_menu'; import { PresentationPanelTitle } from './presentation_panel_title'; import { usePresentationPanelHeaderActions } from './use_presentation_panel_header_actions'; @@ -24,23 +23,18 @@ export type PresentationPanelHeaderProps; +} & Pick; export const PresentationPanelHeader = < ApiType extends DefaultPresentationPanelApi = DefaultPresentationPanelApi >({ api, - index, viewMode, headerId, getActions, hideTitle, panelTitle, panelDescription, - actionPredicate, showBadges = true, showNotifications = true, }: PresentationPanelHeaderProps) => { @@ -52,11 +46,9 @@ export const PresentationPanelHeader = < ); const showPanelBar = - !hideTitle || - panelDescription || - viewMode !== 'view' || - badgeElements.length > 0 || - notificationElements.length > 0; + (!hideTitle && panelTitle) || badgeElements.length > 0 || notificationElements.length > 0; + + if (!showPanelBar) return null; const ariaLabel = getAriaLabelForTitle(showPanelBar ? panelTitle : undefined); const ariaLabelElement = ( @@ -66,6 +58,7 @@ export const PresentationPanelHeader = < ); const headerClasses = classNames('embPanel__header', { + 'embPanel--dragHandle': viewMode === 'edit', 'embPanel__header--floater': !showPanelBar, }); @@ -73,19 +66,6 @@ export const PresentationPanelHeader = < 'embPanel--dragHandle': viewMode === 'edit', }); - const contextMenuElement = ( - - ); - - if (!showPanelBar) { - return ( -
- {contextMenuElement} - {ariaLabelElement} -
- ); - } - return (
{showNotifications && notificationElements} - {contextMenuElement}
); }; diff --git a/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_hover_actions.tsx b/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_hover_actions.tsx new file mode 100644 index 0000000000000..469a1f8c4f6e3 --- /dev/null +++ b/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_hover_actions.tsx @@ -0,0 +1,563 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import classNames from 'classnames'; +import React, { + MouseEventHandler, + ReactElement, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; + +import { + EuiButtonIcon, + EuiContextMenu, + EuiContextMenuPanelDescriptor, + EuiIcon, + EuiIconTip, + EuiNotificationBadge, + EuiPopover, + EuiToolTip, + IconType, +} from '@elastic/eui'; +import { ActionExecutionContext, buildContextMenuForActions } from '@kbn/ui-actions-plugin/public'; + +import { + apiCanLockHoverActions, + EmbeddableApiContext, + getViewModeSubject, + useBatchedOptionalPublishingSubjects, + ViewMode, +} from '@kbn/presentation-publishing'; +import { Subscription } from 'rxjs'; +import { euiThemeVars } from '@kbn/ui-theme'; +import { css } from '@emotion/react'; +import { ActionWithContext } from '@kbn/ui-actions-plugin/public/context_menu/build_eui_context_menu_panels'; +import { uiActions } from '../../kibana_services'; +import { + contextMenuTrigger, + CONTEXT_MENU_TRIGGER, + panelNotificationTrigger, + PANEL_NOTIFICATION_TRIGGER, +} from '../../panel_actions'; +import { getContextMenuAriaLabel } from '../presentation_panel_strings'; +import { DefaultPresentationPanelApi, PresentationPanelInternalProps } from '../types'; +import { AnyApiAction } from '../../panel_actions/types'; + +const QUICK_ACTION_IDS = { + edit: [ + 'editPanel', + 'ACTION_CONFIGURE_IN_LENS', + 'ACTION_CUSTOMIZE_PANEL', + 'ACTION_OPEN_IN_DISCOVER', + 'ACTION_VIEW_SAVED_SEARCH', + ], + view: ['ACTION_OPEN_IN_DISCOVER', 'ACTION_VIEW_SAVED_SEARCH', 'openInspector', 'togglePanel'], +} as const; + +const ALLOWED_NOTIFICATIONS = ['ACTION_FILTERS_NOTIFICATION'] as const; + +const ALL_ROUNDED_CORNERS = `border-radius: ${euiThemeVars.euiBorderRadius}; +`; +const TOP_ROUNDED_CORNERS = `border-top-left-radius: ${euiThemeVars.euiBorderRadius}; + border-top-right-radius: ${euiThemeVars.euiBorderRadius}; + border-bottom: 0 !important; + `; + +const createClickHandler = + (action: AnyApiAction, context: ActionExecutionContext) => + (event: React.MouseEvent) => { + if (event.currentTarget instanceof HTMLAnchorElement) { + // from react-router's + if ( + !event.defaultPrevented && // onClick prevented default + event.button === 0 && // ignore everything but left clicks + (!event.currentTarget.target || event.currentTarget.target === '_self') && // let browser handle "target=_blank" etc. + !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey) // ignore clicks with modifier keys + ) { + event.preventDefault(); + } + } + (event.currentTarget as HTMLElement).blur(); + action.execute(context); + }; + +export const PresentationPanelHoverActions = ({ + api, + index, + getActions, + actionPredicate, + children, + className, + viewMode, + showNotifications = true, +}: { + index?: number; + api: DefaultPresentationPanelApi | null; + getActions: PresentationPanelInternalProps['getActions']; + actionPredicate?: (actionId: string) => boolean; + children: ReactElement; + className?: string; + viewMode?: ViewMode; + showNotifications?: boolean; +}) => { + const [quickActions, setQuickActions] = useState([]); + const [contextMenuPanels, setContextMenuPanels] = useState([]); + const [showNotification, setShowNotification] = useState(false); + const [isContextMenuOpen, setIsContextMenuOpen] = useState(false); + const [notifications, setNotifications] = useState([]); + const hoverActionsRef = useRef(null); + const anchorRef = useRef(null); + const leftHoverActionsRef = useRef(null); + const rightHoverActionsRef = useRef(null); + const [combineHoverActions, setCombineHoverActions] = useState(false); + const [borderStyles, setBorderStyles] = useState(TOP_ROUNDED_CORNERS); + + const updateCombineHoverActions = () => { + if (!hoverActionsRef.current || !anchorRef.current) return; + const anchorBox = anchorRef.current.getBoundingClientRect(); + const anchorLeft = anchorBox.left; + const anchorTop = anchorBox.top; + const anchorWidth = anchorRef.current.offsetWidth; + const hoverActionsWidth = + (rightHoverActionsRef.current?.offsetWidth ?? 0) + + (leftHoverActionsRef.current?.offsetWidth ?? 0) + + parseInt(euiThemeVars.euiSize, 10) * 2; + const hoverActionsHeight = rightHoverActionsRef.current?.offsetHeight ?? 0; + + // Left align hover actions when they would get cut off by the right edge of the window + if (anchorLeft - (hoverActionsWidth - anchorWidth) <= parseInt(euiThemeVars.euiSize, 10)) { + hoverActionsRef.current.style.removeProperty('right'); + hoverActionsRef.current.style.setProperty('left', '0'); + } else { + hoverActionsRef.current.style.removeProperty('left'); + hoverActionsRef.current.style.setProperty('right', '0'); + } + + if (anchorRef.current && rightHoverActionsRef.current) { + const shouldCombine = anchorWidth < hoverActionsWidth; + const willGetCutOff = anchorTop < hoverActionsHeight; + + if (shouldCombine !== combineHoverActions) { + setCombineHoverActions(shouldCombine); + } + + if (willGetCutOff) { + hoverActionsRef.current.style.setProperty('position', 'absolute'); + hoverActionsRef.current.style.setProperty('top', `-${euiThemeVars.euiSizeS}`); + } else if (shouldCombine) { + hoverActionsRef.current.style.setProperty('top', `-${euiThemeVars.euiSizeL}`); + } else { + hoverActionsRef.current.style.removeProperty('position'); + hoverActionsRef.current.style.removeProperty('top'); + } + + if (shouldCombine || willGetCutOff) { + setBorderStyles(ALL_ROUNDED_CORNERS); + } else { + setBorderStyles(TOP_ROUNDED_CORNERS); + } + } + }; + + const [ + defaultTitle, + title, + description, + hidePanelTitle, + hasLockedHoverActions, + parentHideTitle, + parentViewMode, + ] = useBatchedOptionalPublishingSubjects( + api?.defaultPanelTitle, + api?.panelTitle, + api?.panelDescription, + api?.hidePanelTitle, + api?.hasLockedHoverActions$, + api?.parentApi?.hidePanelTitle, + /** + * View mode changes often have the biggest influence over which actions will be compatible, + * so we build and update all actions when the view mode changes. This is temporary, as these + * actions should eventually all be Frequent Compatibility Change Actions which can track their + * own dependencies. + */ + getViewModeSubject(api ?? undefined) + ); + + const hideTitle = hidePanelTitle || parentHideTitle; + + const showDescription = description && (!title || hideTitle); + + const quickActionIds = useMemo( + () => QUICK_ACTION_IDS[parentViewMode === 'edit' ? 'edit' : 'view'], + [parentViewMode] + ); + + const onClose = useCallback(() => { + setIsContextMenuOpen(false); + if (apiCanLockHoverActions(api)) { + api?.lockHoverActions(false); + } + }, [api]); + + useEffect(() => { + if (!api) return; + let canceled = false; + + const apiContext = { embeddable: api }; + const subscriptions = new Subscription(); + const handleActionCompatibilityChange = ( + type: 'quickActions' | 'notifications', + isCompatible: boolean, + action: AnyApiAction + ) => { + if (canceled) return; + (type === 'quickActions' ? setQuickActions : setNotifications)((currentActions) => { + const newActions = currentActions?.filter((current) => current.id !== action.id); + if (isCompatible) return [...newActions, action]; + return newActions; + }); + }; + + (async () => { + // subscribe to any frequently changing context menu actions + const frequentlyChangingActions = uiActions.getFrequentlyChangingActionsForTrigger( + CONTEXT_MENU_TRIGGER, + apiContext + ); + + for (const frequentlyChangingAction of frequentlyChangingActions) { + if ((quickActionIds as readonly string[]).includes(frequentlyChangingAction.id)) { + subscriptions.add( + frequentlyChangingAction.subscribeToCompatibilityChanges( + apiContext, + (isCompatible, action) => + handleActionCompatibilityChange( + 'quickActions', + isCompatible, + action as AnyApiAction + ) + ) + ); + } + } + + // subscribe to any frequently changing notification actions + const frequentlyChangingNotifications = uiActions.getFrequentlyChangingActionsForTrigger( + PANEL_NOTIFICATION_TRIGGER, + apiContext + ); + + for (const frequentlyChangingNotification of frequentlyChangingNotifications) { + if ( + (ALLOWED_NOTIFICATIONS as readonly string[]).includes(frequentlyChangingNotification.id) + ) { + subscriptions.add( + frequentlyChangingNotification.subscribeToCompatibilityChanges( + apiContext, + (isCompatible, action) => + handleActionCompatibilityChange( + 'notifications', + isCompatible, + action as AnyApiAction + ) + ) + ); + } + } + })(); + + return () => { + canceled = true; + subscriptions.unsubscribe(); + }; + }, [api, quickActionIds]); + + useEffect(() => { + if (!api) return; + + let canceled = false; + const apiContext = { embeddable: api }; + + (async () => { + let compatibleActions = (await (async () => { + if (getActions) return await getActions(CONTEXT_MENU_TRIGGER, apiContext); + return ( + (await uiActions.getTriggerCompatibleActions(CONTEXT_MENU_TRIGGER, { + embeddable: api, + })) ?? [] + ); + })()) as AnyApiAction[]; + if (canceled) return; + + const disabledActions = api.disabledActionIds?.value; + if (disabledActions) { + compatibleActions = compatibleActions.filter( + (action) => disabledActions.indexOf(action.id) === -1 + ); + } + + if (actionPredicate) { + compatibleActions = compatibleActions.filter(({ id }) => actionPredicate(id)); + } + + compatibleActions.sort( + ({ order: orderA }, { order: orderB }) => (orderB || 0) - (orderA || 0) + ); + + const contextMenuActions = compatibleActions.filter( + ({ id }) => !(quickActionIds as readonly string[]).includes(id) + ); + + const menuPanels = await buildContextMenuForActions({ + actions: contextMenuActions.map((action) => ({ + action, + context: apiContext, + trigger: contextMenuTrigger, + })) as ActionWithContext[], + closeMenu: onClose, + }); + setContextMenuPanels(menuPanels); + setShowNotification(contextMenuActions.some((action) => action.showNotification)); + setQuickActions( + compatibleActions.filter(({ id }) => (quickActionIds as readonly string[]).includes(id)) + ); + })(); + + return () => { + canceled = true; + }; + }, [ + actionPredicate, + api, + getActions, + isContextMenuOpen, + onClose, + parentViewMode, + quickActionIds, + ]); + + const quickActionElements = useMemo(() => { + if (!api || quickActions.length < 1) return []; + + const apiContext = { embeddable: api, trigger: contextMenuTrigger }; + + return quickActions + .sort(({ order: orderA }, { order: orderB }) => { + const orderComparison = (orderB || 0) - (orderA || 0); + return orderComparison; + }) + .map((action) => { + const name = action.getDisplayName(apiContext); + const iconType = action.getIconType(apiContext) as IconType; + const id = action.id; + + return { + iconType, + 'data-test-subj': `embeddablePanelAction-${action.id}`, + onClick: createClickHandler(action, apiContext), + name, + id, + }; + }); + }, [api, quickActions]); + + const notificationElements = useMemo(() => { + if (!showNotifications || !api) return []; + return notifications?.map((notification) => { + let notificationComponent = notification.MenuItem ? ( + React.createElement(notification.MenuItem, { + key: notification.id, + context: { + embeddable: api, + trigger: panelNotificationTrigger, + }, + }) + ) : ( + + notification.execute({ embeddable: api, trigger: panelNotificationTrigger }) + } + > + {notification.getDisplayName({ embeddable: api, trigger: panelNotificationTrigger })} + + ); + + if (notification.getDisplayNameTooltip) { + const tooltip = notification.getDisplayNameTooltip({ + embeddable: api, + trigger: panelNotificationTrigger, + }); + + if (tooltip) { + notificationComponent = ( + + {notificationComponent} + + ); + } + } + + return notificationComponent; + }); + }, [api, notifications, showNotifications]); + + const contextMenuClasses = classNames({ + // eslint-disable-next-line @typescript-eslint/naming-convention + embPanel__optionsMenuPopover: true, + 'embPanel__optionsMenuPopover-notification': showNotification, + }); + + const ContextMenuButton = ( + { + setIsContextMenuOpen(!isContextMenuOpen); + if (apiCanLockHoverActions(api)) { + api?.lockHoverActions(!hasLockedHoverActions); + } + }} + iconType="boxesVertical" + /> + ); + + const dragHandle = ( + + ); + + return ( +
+ {children} + {api ? ( +
+ {viewMode === 'edit' && !combineHoverActions ? ( +
+ {dragHandle} +
+ ) : ( +
// necessary for the right hover actions to align correctly when left hover actions are not present + )} +
+ {viewMode === 'edit' && combineHoverActions && dragHandle} + {showNotifications && notificationElements} + {showDescription && ( + + )} + {quickActionElements.map( + ({ iconType, 'data-test-subj': dataTestSubj, onClick, name }, i) => ( + + + + ) + )} + {contextMenuPanels.length ? ( + + + + ) : null} +
+
+ ) : null} +
+ ); +}; diff --git a/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_title.tsx b/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_title.tsx index 4189250e394d3..ef819c427c765 100644 --- a/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_title.tsx +++ b/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_title.tsx @@ -131,8 +131,8 @@ export const PresentationPanelTitle = ({ }, [api, onClick]); const describedPanelTitleElement = useMemo(() => { + if (hideTitle) return null; if (!panelDescription) { - if (hideTitle) return null; return ( {panelTitleElement} diff --git a/src/plugins/presentation_panel/public/panel_component/panel_header/use_presentation_panel_header_actions.tsx b/src/plugins/presentation_panel/public/panel_component/panel_header/use_presentation_panel_header_actions.tsx index 570fdfd91e229..b48a4eca7ae1f 100644 --- a/src/plugins/presentation_panel/public/panel_component/panel_header/use_presentation_panel_header_actions.tsx +++ b/src/plugins/presentation_panel/public/panel_component/panel_header/use_presentation_panel_header_actions.tsx @@ -22,6 +22,8 @@ import { import { AnyApiAction } from '../../panel_actions/types'; import { DefaultPresentationPanelApi, PresentationPanelInternalProps } from '../types'; +const disabledNotifications = ['ACTION_FILTERS_NOTIFICATION']; + export const usePresentationPanelHeaderActions = < ApiType extends DefaultPresentationPanelApi = DefaultPresentationPanelApi >( @@ -47,10 +49,8 @@ export const usePresentationPanelHeaderActions = < embeddable: api, })) as AnyApiAction[]) ?? []; - const disabledActions = api.disabledActionIds?.value; - if (disabledActions) { - nextActions = nextActions.filter((badge) => disabledActions.indexOf(badge.id) === -1); - } + const disabledActions = (api.disabledActionIds?.value ?? []).concat(disabledNotifications); + nextActions = nextActions.filter((badge) => disabledActions.indexOf(badge.id) === -1); return nextActions; }; @@ -85,8 +85,8 @@ export const usePresentationPanelHeaderActions = < ); for (const badge of frequentlyChangingBadges) { subscriptions.add( - badge.subscribeToCompatibilityChanges(apiContext, (isComptaible, action) => - handleActionCompatibilityChange('badge', isComptaible, action as AnyApiAction) + badge.subscribeToCompatibilityChanges(apiContext, (isCompatible, action) => + handleActionCompatibilityChange('badge', isCompatible, action as AnyApiAction) ) ); } @@ -97,11 +97,12 @@ export const usePresentationPanelHeaderActions = < apiContext ); for (const notification of frequentlyChangingNotifications) { - subscriptions.add( - notification.subscribeToCompatibilityChanges(apiContext, (isComptaible, action) => - handleActionCompatibilityChange('notification', isComptaible, action as AnyApiAction) - ) - ); + if (!disabledNotifications.includes(notification.id)) + subscriptions.add( + notification.subscribeToCompatibilityChanges(apiContext, (isCompatible, action) => + handleActionCompatibilityChange('notification', isCompatible, action as AnyApiAction) + ) + ); } })(); 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 550c76a14aee1..fa86060859098 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 @@ -37,7 +37,7 @@ describe('Presentation panel', () => { ); await waitFor(() => { - expect(screen.getByTestId('embeddablePanelToggleMenuIcon')).toBeInTheDocument(); + expect(screen.getByTestId('embeddablePanel')).toBeInTheDocument(); }); }; @@ -223,12 +223,10 @@ describe('Presentation panel', () => { viewMode: new BehaviorSubject('view'), }; await renderPresentationPanel({ api }); - const header = await screen.findByTestId('embeddablePanelHeading'); - const titleComponent = screen.queryByTestId('dashboardPanelTitle'); - expect(header).not.toContainElement(titleComponent); + expect(screen.queryByTestId('presentationPanelTitle')).not.toBeInTheDocument(); }); - it('renders a placeholder title when in edit mode and the provided title is blank', async () => { + it('does not render a title when in edit mode and the provided title is blank', async () => { const api: DefaultPresentationPanelApi & PublishesDataViews & PublishesViewMode = { uuid: 'test', panelTitle: new BehaviorSubject(''), @@ -236,9 +234,7 @@ describe('Presentation panel', () => { dataViews: new BehaviorSubject([]), }; await renderPresentationPanel({ api }); - await waitFor(() => { - expect(screen.getByTestId('embeddablePanelTitleInner')).toHaveTextContent('[No Title]'); - }); + expect(screen.queryByTestId('presentationPanelTitle')).not.toBeInTheDocument(); }); it('opens customize panel flyout on title click when in edit mode', async () => { @@ -274,7 +270,7 @@ describe('Presentation panel', () => { expect(screen.queryByTestId('embeddablePanelTitleLink')).not.toBeInTheDocument(); }); - it('hides title when API hide title option is true', async () => { + it('hides title in view mode when API hide title option is true', async () => { const api: DefaultPresentationPanelApi & PublishesViewMode = { uuid: 'test', panelTitle: new BehaviorSubject('SUPER TITLE'), @@ -285,7 +281,18 @@ describe('Presentation panel', () => { expect(screen.queryByTestId('presentationPanelTitle')).not.toBeInTheDocument(); }); - it('hides title when parent hide title option is true', async () => { + it('hides title in edit mode when API hide title option is true', async () => { + const api: DefaultPresentationPanelApi & PublishesViewMode = { + uuid: 'test', + panelTitle: new BehaviorSubject('SUPER TITLE'), + hidePanelTitle: new BehaviorSubject(true), + viewMode: new BehaviorSubject('edit'), + }; + await renderPresentationPanel({ api }); + expect(screen.queryByTestId('presentationPanelTitle')).not.toBeInTheDocument(); + }); + + it('hides title in view mode when parent hide title option is true', async () => { const api: DefaultPresentationPanelApi & PublishesViewMode = { uuid: 'test', panelTitle: new BehaviorSubject('SUPER TITLE'), @@ -298,5 +305,19 @@ describe('Presentation panel', () => { await renderPresentationPanel({ api }); expect(screen.queryByTestId('presentationPanelTitle')).not.toBeInTheDocument(); }); + + it('hides title in edit mode when parent hide title option is true', async () => { + const api: DefaultPresentationPanelApi & PublishesViewMode = { + uuid: 'test', + panelTitle: new BehaviorSubject('SUPER TITLE'), + viewMode: new BehaviorSubject('edit'), + parentApi: { + viewMode: new BehaviorSubject('edit'), + ...getMockPresentationContainer(), + }, + }; + await renderPresentationPanel({ api }); + expect(screen.queryByTestId('presentationPanelTitle')).not.toBeInTheDocument(); + }); }); }); 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 6890ea2f76109..ccf2e694d1b7a 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 @@ -16,6 +16,7 @@ import { } from '@kbn/presentation-publishing'; import classNames from 'classnames'; import React, { useMemo, useState } from 'react'; +import { PresentationPanelHoverActions } from './panel_header/presentation_panel_hover_actions'; import { PresentationPanelHeader } from './panel_header/presentation_panel_header'; import { PresentationPanelError } from './presentation_panel_error'; import { DefaultPresentationPanelApi, PresentationPanelInternalProps } from './types'; @@ -76,7 +77,7 @@ export const PresentationPanelInternal = < const hideTitle = Boolean(hidePanelTitle) || Boolean(parentHidePanelTitle) || - (viewMode === 'view' && !Boolean(panelTitle ?? defaultPanelTitle)); + !Boolean(panelTitle ?? defaultPanelTitle); const contentAttrs = useMemo(() => { const attrs: { [key: string]: boolean } = {}; @@ -90,55 +91,56 @@ export const PresentationPanelInternal = < }, [dataLoading, blockingError]); return ( - - {!hideHeader && api && ( - - )} - {blockingError && api && ( - - - - )} - {!initialLoadComplete && } -
- - )} - ref={(newApi) => { - if (newApi && !api) setApi(newApi); - }} + + {!hideHeader && api && ( + - -
-
+ )} + {blockingError && api && ( + + + + )} + {!initialLoadComplete && } +
+ + )} + ref={(newApi) => { + if (newApi && !api) setApi(newApi); + }} + /> + +
+ + ); }; diff --git a/src/plugins/presentation_panel/public/panel_component/types.ts b/src/plugins/presentation_panel/public/panel_component/types.ts index a05fbc6d92a75..fa60f134321ac 100644 --- a/src/plugins/presentation_panel/public/panel_component/types.ts +++ b/src/plugins/presentation_panel/public/panel_component/types.ts @@ -9,6 +9,7 @@ import { PresentationContainer } from '@kbn/presentation-containers'; import { + CanLockHoverActions, HasParentApi, HasUniqueId, PublishesBlockingError, @@ -74,7 +75,8 @@ export interface DefaultPresentationPanelApi HasParentApi< PresentationContainer & Partial & PublishesViewMode> - > + > & + CanLockHoverActions > {} export type PresentationPanelProps< diff --git a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx index 7f02a934a4370..d62551efce297 100644 --- a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx +++ b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx @@ -21,7 +21,7 @@ export const txtMore = i18n.translate('uiActions.actionPanel.more', { defaultMessage: 'More', }); -interface ActionWithContext { +export interface ActionWithContext { action: Action | ActionInternal; context: Context; @@ -37,6 +37,7 @@ type ItemDescriptor = EuiContextMenuPanelItemDescriptor & { }; type PanelDescriptor = EuiContextMenuPanelDescriptor & { + _order?: number; _level?: number; _icon?: string; items: ItemDescriptor[]; @@ -101,7 +102,7 @@ const removeItemMetaFields = (items: ItemDescriptor[]): EuiContextMenuPanelItemD const removePanelMetaFields = (panels: PanelDescriptor[]): EuiContextMenuPanelDescriptor[] => { const euiPanels: EuiContextMenuPanelDescriptor[] = []; for (const panel of panels) { - const { _level: omit, _icon: omit2, ...rest } = panel; + const { _level: omit, _icon: omit2, _order: omit3, ...rest } = panel; euiPanels.push({ ...rest, items: removeItemMetaFields(rest.items) }); } return euiPanels; @@ -124,15 +125,18 @@ export async function buildContextMenuForActions({ const panels: Record = { mainMenu: { id: 'mainMenu', - title, items: [], }, }; const promises = actions.map(async (item) => { const { action } = item; - const context: ActionExecutionContext = { ...item.context, trigger: item.trigger }; + const context: ActionExecutionContext = { + ...item.context, + trigger: item.trigger, + }; const isCompatible = await item.action.isCompatible(context); if (!isCompatible) return; + let parentPanel = ''; let currentPanel = ''; if (action.grouping) { @@ -146,6 +150,7 @@ export async function buildContextMenuForActions({ title: name, items: [], _level: i, + _order: group.order || 0, _icon: group.getIconType ? group.getIconType(context) : 'empty', }; if (parentPanel) { @@ -190,7 +195,11 @@ export async function buildContextMenuForActions({ wrapMainPanelItemsIntoSubmenu(panels, 'mainMenu'); - for (const panel of Object.values(panels)) { + const sortedPanels = Object.values(panels).sort((a, b) => { + return (b._order || 0) - (a._order || 0); + }); + + for (const panel of sortedPanels) { if (panel._level === 0) { if (panels.mainMenu.items.length > 0) { panels.mainMenu.items.push({ @@ -198,7 +207,7 @@ export async function buildContextMenuForActions({ key: panel.id + '__separator', }); } - if (panel.items.length > 3) { + if (panel.items.length > 4) { panels.mainMenu.items.push({ name: panel.title || panel.id, icon: panel._icon || 'empty', diff --git a/src/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_grouping.ts b/src/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_grouping.ts index f1c64555e048e..640a3bbb70391 100644 --- a/src/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_grouping.ts +++ b/src/plugins/ui_actions_enhanced/public/dynamic_actions/dynamic_action_grouping.ts @@ -21,6 +21,6 @@ export const dynamicActionGrouping: PresentableGrouping<{ defaultMessage: 'Custom actions', }), getIconType: () => 'symlink', - order: 26, + order: 0, }, ]; diff --git a/test/functional/apps/dashboard/group1/edit_embeddable_redirects.ts b/test/functional/apps/dashboard/group1/edit_embeddable_redirects.ts index 2f40111ce1ed0..6546f5091a0db 100644 --- a/test/functional/apps/dashboard/group1/edit_embeddable_redirects.ts +++ b/test/functional/apps/dashboard/group1/edit_embeddable_redirects.ts @@ -61,7 +61,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const newTitle = 'wowee, my title just got cooler'; await header.waitUntilLoadingHasFinished(); const originalPanelCount = await dashboard.getPanelCount(); - await dashboardPanelActions.clickEdit(); + await dashboardPanelActions.editPanelByTitle('wowee, looks like I have a new title'); await visualize.saveVisualizationExpectSuccess(newTitle, { saveAsNew: true, redirectToOrigin: true, @@ -76,7 +76,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('loses originatingApp connection after save as when redirectToOrigin is false', async () => { const newTitle = 'wowee, my title just got cooler again'; await header.waitUntilLoadingHasFinished(); - await dashboardPanelActions.editPanelByTitle('wowee, my title just got cooler'); + await dashboardPanelActions.clickEdit(); await visualize.linkedToOriginatingApp(); await visualize.saveVisualizationExpectSuccess(newTitle, { saveAsNew: true, diff --git a/test/functional/apps/dashboard/group3/panel_context_menu.ts b/test/functional/apps/dashboard/group3/panel_context_menu.ts index 0bf31cf58616c..367dae942af92 100644 --- a/test/functional/apps/dashboard/group3/panel_context_menu.ts +++ b/test/functional/apps/dashboard/group3/panel_context_menu.ts @@ -48,9 +48,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('are shown in edit mode', async function () { await dashboard.switchToEditMode(); - const isContextMenuIconVisible = await dashboardPanelActions.isContextMenuIconVisible(); - expect(isContextMenuIconVisible).to.equal(true); - await dashboardPanelActions.expectExistsEditPanelAction(); await dashboardPanelActions.expectExistsClonePanelAction(); await dashboardPanelActions.expectExistsRemovePanelAction(); diff --git a/test/functional/apps/dashboard/group5/saved_search_embeddable.ts b/test/functional/apps/dashboard/group5/saved_search_embeddable.ts index 4b488fdb25d8a..25e525747edc6 100644 --- a/test/functional/apps/dashboard/group5/saved_search_embeddable.ts +++ b/test/functional/apps/dashboard/group5/saved_search_embeddable.ts @@ -84,7 +84,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await header.waitUntilLoadingHasFinished(); await dashboard.waitForRenderComplete(); - await dashboardPanelActions.clickContextMenuItem( + await dashboardPanelActions.clickPanelAction( 'embeddablePanelAction-ACTION_VIEW_SAVED_SEARCH' ); diff --git a/test/functional/page_objects/dashboard_page.ts b/test/functional/page_objects/dashboard_page.ts index f6a3aec2eacd5..2a263e9aa8ca7 100644 --- a/test/functional/page_objects/dashboard_page.ts +++ b/test/functional/page_objects/dashboard_page.ts @@ -296,11 +296,13 @@ export class DashboardPageObject extends FtrService { // if the dashboard is not already in edit mode await this.testSubjects.click('dashboardEditMode'); } - // wait until the count of dashboard panels equals the count of toggle menu icons + // wait until the count of dashboard panels equals the count of drag handles await this.retry.waitFor('in edit mode', async () => { - const panels = await this.testSubjects.findAll('embeddablePanel', 2500); - const menuIcons = await this.testSubjects.findAll('embeddablePanelToggleMenuIcon', 2500); - return panels.length === menuIcons.length; + const panels = await this.find.allByCssSelector('.embPanel__hoverActionsWrapper'); + const dragHandles = await this.find.allByCssSelector( + '[data-test-subj="embeddablePanelDragHandle"]' + ); + return panels.length === dragHandles.length; }); } diff --git a/test/functional/screenshots/baseline/area_chart.png b/test/functional/screenshots/baseline/area_chart.png index 07004fbb366551aef787d17667c2b3503e353355..dc6ba3498298e9021d5260fa0b51b80c1609891f 100644 GIT binary patch literal 71529 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 !sTHf`)a(1(+ezhZklKaUq9$< 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%0AY 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%0Ddv1*v4hk2v1i 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%0D&7&V_t)#dfdk* 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 diff --git a/test/functional/screenshots/baseline/tsvb_dashboard.png b/test/functional/screenshots/baseline/tsvb_dashboard.png index 8b33a0077efa23c82dcff6369306df238224dd23..5d29b891e6fd0df9eb37b40b18eb84051160cf7c 100644 GIT binary patch literal 45328 zcma(3Wmr`0`vwYQ&>%>MIE2!TfHaaK-3`*+-O|zxQbRK|(hbtx-O@dD*IwiE`@ipT z>`(g>FthHu^1RObT7<~Sh@+zrp}@hxp-X%fQGkPcwF?LL;sWU<@Cn(sXm{Yp3kL;p zA-J-UcYAPfq;L``E{~5!A;&7Ae(}Sh*Cd^G@2&EO>BP)KPt6(!7 z_fapwo)?rqYGux&P+=QAAPmZyj-;qEWc}C`oAt(b_iM!@?Z*E-#sxgqE0-r~uTp(m zI87{*KfyW!jn{hhZ_Nw(B^o(yR-7Vdp|9#O378Y(Gz09UC@!!)$bA(TsZKG{xlJFn zG#36$-p5Y#e_zmpH!s5%XyOgVsw!L+%EsmDUjYMt2q_dgt{sUTy%-#0tsUNb#Fb^H z7s>v22-H$_4A`WCWy&)(mnZ6lULVSL(wr4XH!hUwsTB8m@Y)8gY3)jfe~S| z`7UbAXFI>fJ><-44j%2nrXfrG*&XK;v9e|q`FaJ}Vu;CX9CQX*vh*DPFf+Ll>p-y=n8*yft z!wv>#bU0UW5QU%aGtJJ4E%fAgitF*TYRLL{ntfh(JjZ@xp{zWujand zbj0Q3x|R1aAbOx^|G@fYvE{kh>*1#2kx1{mq>=j#oeSL*&7EINs6sC|W8Yhb4^Q^Y zz4jO%HY*%Kvw*f|H}F0u{OXU2}CS-Vi1iofhNa(z@l-O+{IZLk*Dk zg&l|IRa?XP_O(|4Q>&Kq^D7MYy2F|{`Er-t8A21VB8z^>>hbZdbyP5IKQ?&QSwD3}T1UO{R0Odm$m%_UCmOwhN>gRbeU1Ehu?@G zHP5c*hF8RTn?K*0fZe#s42M%}mZ3o#k(%GD=D$gPyW{Uj()GTa7%YEp*VU}IwOp>e zfBDA$ZHNfS^(4mad^^qlOrjFw4Y1=(ZnK`pyrk8eDf66eRDh%j%jiMi9bouTySCq&R&ArTf87X3pr$n(_$D$|0= zDq*ooX~X(}1=!U-#PPmiN85J!k~1Qed8;5NYPr&=_*3624F2ZP)=Ah51I6X4;RGJH zxT+?-85~yok738HKBvoU`LYxNT3%aQ*G#SV3l?P;uFY+2yQA2YN1RqYCEeG2(J~NZ zvT61jlc%fZkT}4OkA9?Dw=%?h<-IsDU}|}wCEE;GO*^~6mQ*RzVmHe$%kaK)bADKc zk|K2|tLoORR==W@S~y-hXEe1oD=c?`ZDNAP zY{q=o4`IvRix|J0kjOSuZB!yN>Y2z4=T&u|_kV5lO3&?N3U4>xOwhf$hr9;V*9V#i zzt11mjO1NE;S=!aTI%Gqxh;$me!T0d%AG%T6KC+eO~~Waa_M#{Zo4^cD))YX76YD9 zL_8&QH8WG2lAv)}M;J2gR7%PnHwu<@ZhiQ^Lo*a7-1nj^nwJ=%71HpgN>DGRRl zybToxJ#vz5f?Sp#PpL9wz@O|ccIBVlpgZK#2bW;4k>maSS?yg=+P? zsVIxtn%dfQ&j}l6)ZgyIDYdm%x8fuX4m)KQWlb@dXXCvYOV58g#d7Rcnz=CeFHAwt z+VGUfexhcNo<1@IG}ZmbbKCsEUIwX9u4u?WgxG%A4$_3S#bM z=1m^&&||)e;1~!z+-w9OZ%|1QFnQf>$TD(W%^9qp-biz<&K$kWrDJT1$7HoW{6$>W zCWd2x|9HACNb0(QJ{$3lW&MuWTBl9V;Q1LHmK)E0e%i2RO>WfQStblQY0iog_5vJ6 zA^GWQ0zbobU!bx}(Jp=HPtrj1)dF#O%T>_D=~6@RXd26-tWRq^X60sKuXyA;7Ejmi zyd>@0%QKts<`_)-Lq7v(%T8HPP>(-GdXv+EY(TUu|Krkk=H{mbNy@koy^V$BGq&p8skhWxguZ4@f$v6C_&Srbh zDhuy^KM$3;xE>t2Ad?waxdFO`fbA<~AQS=gTCPj7i?!uC=jq@L{fe9Hz+R)ahb+Y7 zR4#+Nt`KbN`qRWHfm_R-@VzMht7B88Xnv3Gtt7C+mCdow-?cT0AYIq?XL!GMHTtrg zf;C)R4F2E0vT2%zIez;{1A6(vOLiHT%;B`ET-?UDt=g2-cfe_x!s2DVDn1CV{1CeS zw~A&`IUn&=nq9_cyN*Eo2hd<8Uf7nvC~w~6o`!}75?Sy&j&dMhNHR6WV#XdlDkyD| z2dI^*2z}*!PZeVemG+cP?tl`DEOL5G<%ShMqMf<#2V z8Q9stH_4eYZJ*l&)m6{I)e+u}YCD5osgzH4-J#0vk;FX4L;P`6CT-@bM$<3uN8?+` zL`6jdqDwVrTu4-ChbQ;Y$a1Ty9Ig)4b-kbLsNZ=%oPM-vc^nC2YVq8{^*K6rK?5X4 z3X=N849$rWc)rXwP)}TTS@mMP9RxAnZEWqNyKMg&&w0bYD`=KOJ4$SBegI^WyxDQu z;-c~fXl?iPgXci(CtcpJuXuh)i1}-5c=zi*Nlji*L_P7ud`)xPHVcTphkDq~SC*GG zt!>B2aCJ6a8}s!t-Xu`>j658xwiIp$b3!J+yuKnttWC-6SH&n-|ECNxE*O2d3J`Cx<>@0ps?Lw&x8f z36BdUR)1_P)*efp>6+d2H2Y%h@h=1``84dt$+o4rOl9xrx+Y-ScVuro zxy@P)50?U}cnXTpL?Scj4foz`_pol=I$m@++;^kii_g1bm!L&&yse??KYfb_5>V56)Yz z?j}~#U1UIQ`|~DX?)9H;OwBg~#FDG9#03Os46@Bas%Nj=EJT6R&DgqCx8vM6Z-?Ha zIxHb?mz4%Yl20B$lofb5$yqjLPaS52R2|4^AKPwR&Vt>x_jEmPr#qu~IlS(sb~5f8 z9v=Ybc)s@6#ew2K-$sEvZ&(H^ecCo`*i58W*&sTj%Xasryg({nA7o5APljaJ&RK;W zH~H+0Xsc>@?-81$&8*tMAiN;>7oWxRM_K-6<1Ldmo@4sGM0LawAju4Z-2Y}&nH(`K zv$|jO1%sOJgHoY$R=C5~)~%PvZr%eEe|EcE%||uq4i>IbGyC@z4O!KXt*Pl4SdyhI zW=o%kLm*%m==^i@flQ6Vzany8W1jVf+(FgI$;4#miLEJlYpBqdA%XCZuA7C?V8D2u z#|r-+cBtDy%e6rLVY%us0DU*21gk3X_Ym#=&2wB|y4bxAdo+_bB|o+wr*q64QT{7=vi|ND2I=FXvBUw` zmx3!r7H18I#$giW&X|FYA|krX+>IUc!S_$2D~SVrS1@=FOkv_&%(6sNkS@fP^=4de zYl{dykO%e!b(i&;6SsCTXNfcB$7=V^Ptx=B|EswDgA(Q@_M{Xwe^ZcC#x9r4&oqj# zPQQIitobS#jfSaq;In;}l?*&E$q!!6k}kY`OwaZL0?7}GW;Gjq;aN2PU?(*F9?x;Z(*X9@Ld({hd&1rZ1$z~+Z=xUYCu z?HBFTrbC=D$BOW4)1RHUln)k+?rYG;s_r6d@bbHeOO<*0qOSn7#rLoq=W~00EZ})u zqiNl^?T;bgbvKW1NO*g&Mdy6kV2dw$>Wlcy4miyr13J32%j*4DDW~rJG(KqPSM6%4 zPm={4A)qWl@Lkzfp#Qf~i^vC@pX>$c@YPfV7G}G1w!6PqeOAx17u3HO6rlUqOeZ09 ziPiYy#LG2rC6M^EdQbm8P(}AJ>dg>3O?(eclYxNluVcHfmsoaAgwtetUmymeXX0ID0PYCAaS>I>9t-rkB2lW^I)UL^v@+C5waa~RwywSb%c zJ~%MlJsu;REW@nMt!S!xlxKPty2Cw^198++f>>baT?Z*zEeFtv_7HS$teRQm5C z`9^)DNb$lK6mjYm`_U-GQcHJo91G-b4HXVPw`+_lkAh_j^L;6?jaEfU6B|NK>!D&M zK52O+EA2-TpSJ5V9-G^{K@8)OU+%+Bbyv2_?5o~BYw$Z>5ADQN#z)WPy&06SO7EjM z3D8eLWOL660DsC~;=jXIC&ZlatrfGeyBckN+-XsJFV30sOXHuJ;je zPEt^dy4&=JopBXmH|^dibCVaPMaX6E&5{XaMfW>galVYOi`Qyg8sT*RQiJF^7Lz~( zEzg?kb|Mx%GoVLLZ<>a8&Ryngow1UGI^aZ zpPf|-Vss_a#aJxDn|p#I5SgIT3T9tE{>Ro21Z$+;t}yYA>_ZcoIkTsA>lS@&vL*k z(YieXa>LV56%&>afSb!E<)6_7k;u5S503xBWOUqIaejt;a z310PE6Gf0_zRgu@6q_CCthw+iF&92rK#to`{h(1>cA&>fefdFs%W_6`fh6Nor_=0e zt^4q`ub}O6V+7}l=gtGgjsi~2_x6Wtfg9J}NbNnxJ0Q<(I&$?!kXW%2NmEWH4JJ~> z^_zgbXwsp3m|_&8s>;({`YkxuqkQM(HmY8&K(@6|@#ZiYA#+)ES`5TblSEQ?eDDL1 zPF`&pKM^ie{b5Wm_`T()v&UOwOjw+9(V$o?_A3VVE$LHjZv;JYuMzgWIy_;jvNM|K z%_*&FGj|m^5|R6BF0{IE*@;Ak(6jyaZv2SY-L|8iN4li=fPr%6GWGO%cTEzHLCbdU zBR=0oJ%o_kPv&F##yn zj{~XFSS;1%t&1mI&KIj>?xFWJ_`3Gff1VhF-@A`-nPk}Q>6UBSKG2-HKFp++ll&p& zW&tmp&kQuyK2pYG&?mm+eHzh+s2|}hU`F+_B}C(%kU3#RKgOzBV1tcP`CibdHktpM6#5bPZ2)&keQ>jU| zLR8@OBUIo2<`u^$G6&)*hPn0f{^L(f)^4{$o1SN3jaa3*T9sNU0`10~qZ@g|AG``A z8b@I>k#qu|Ji@efb@1k)j} zqZUFModXn8lwM#vSAXU}$t2Gs+WO}L18y^h(^-dqg#~iJpiFrd*AW0D{|UaC4Is}%t?PQ&bA|DK-dQl z8;Rd)<2By(nZfcDoUu+Q?$xWoF62uo8rS~4q`zp@OLx}v;1D-Lwg3kOMN87LcuGO6 zW0K#n>%@>lC@o!=0`M@~Nhg-~)%2 zD@Ke6CNJ?KIrMr+>|X#lrhp#PLalP^f_2jHmDS$W8)soR#U0~r2Va#V6#BZ~AD6w& z1Dq&jLN){YCdDJkKnwV+~56K^RONVU&ph=w9*$nQtj;srh*1?^$Gkc)OfjAM1zZiH7C; z=WcZ{uK{Xz>J%zGJSt2MCA9VSpjj5a)!uxjUWtG)eC758ys~?EsCo`PVzaJOu|i1Z zA3z3p#Jy1G956@sM2v`r5)BRxJ)pnL{Gz|K!QP)G_dHrt)9GyX=W>;($9`M2GQIO~ zv|WwpWVTm5DHi8^U#vt;ZFsp>V{CoBk`sW*rWg-iihLu+LjNFBFWt67yhcmPa_?8M{Z3qPB(J({!0J``jNunvBI?0 zd%XpAezc``2nJ6FwYltyD+EAqt?xhk)HH5ML~>j$t0WiC4zCabY>Q@%vy z_cCeV1Fz7fZ=MPCmL`%Ty8^9GCZvN82l{Ytr79W7Lk2+Iw%QASI>weU-OKiG=b z=~_A}l@~`*QJS`!;bw|Dns-k{>;faH4!>Wv!wG5&-15_~Tus5{(xtXGQ~rD`9E&>w zWF8dSx)hg(=IkYEWZV7verajP&rcbobFkj)cuxbasS&5cm3<8_6OzYTs6?v?Ah{xo zeesAATP_l`&LN(MzfQ!pxf5nC!jr&~NMz?xyq-sQ3@EuT;ij!DeR>;`{Ozv{r;|7x zt%vN$$7)kf>STnOcoeI&g5-%8R!8i}scm5@&aYpTJq<_i?eRUd*QpQFFJZ%Kx%Q>9 zZhdS$_MQ_&I)(S^78L+7t0){^-1@KCLOS*0tZD4I{IYDz6kiDP&q1HFt4G-VnD3LClT?{T2a)YI+kGcDC1cGjyObD6Hd%3Qj%os~lw&$c6T z;}qF`H)95)Xmm^;2`7x6(sv!Xg;;^4ZWhlck|Tdxg_rHh%h54MuYwjdaT=4yUYtGYJV~4w!%P5WI^?*gJDZh2=9Q(NYLRX2wkJONrFjPq3$4Z_8 z&0a`xTWt+PRpnNQh%QLxU4`Mq9?@|l>jwX;dMz-fC`-&&=5Q=j-5TH;CM=u!n9Wmr zH#p?#cA0;lKp(AJNbEq|toSW+^y_UOiK zI;r=-h1*i4xEmkoTiwmWi>Bd)gWv96OxhV=vM2XglhInWz2d)qxNzq~xo*v*28crR z?W~%rJqId*N?rJ1^<(q5byAZ|?@mM$K0IDXfT-dmT6Cg1T9|S}f?n`e)AF?1opjz` z{-j;+g(CTI53uC4%?^O}98-+caiCsg!|Z)Gs4Ovf{vl$BZL>$0lruED&CX@A_l#41 zJ0Gq3Z=)JlL7oqLNo6hTvfL!|wO+G@R3rlChTUQ1tsCcvmMVjx%B#=NG)1#eA|3f! zyYpJY$$a{I_sbV-kSlKbg^`Q5(v!(j2&-lM*=8yEX8#tg!2r%MeZBU1aqaQWdhx=@ ziDcE{^pu{j`UJHyD%VEUr>%&x+THnf{?T0|A%(K+nx4=5Q2Mb&I< zQD@rO(sob$`Xrjoq3nBed-t`|D!gDhV3<7VS6sovPrWTs$l3LOcN+jI=tDr7-G25x zNGDb*KazWWOm8bMAbL_(=Vp_wy!q^|X`?rSYpZL+Asq#7YPwu3TAjm-%Nbj!&Qm{K zM%=aWn$xn$emB?#a}}j`v1B>j6B(%fPBhqNA4ims#nm6OJ<^Vt;f25WDy|RLGz1TW zJ?0L}>JB-LCba8x7cUbz_;{xOuNQzk={(j1-_ zCYBBT@EXd5YHMQ{hB{SKpWWhiTDWlWw@7ht>QlyaT=KttPPxuW;ORp-UVQljg~M&- z$YZg!EbZZIS_X>8!kVt}@ec9lSpAK;n$q$e(ziJLF1-t2jE8mgRPh28X5epFX!i4F z_d6UI!eh_04dw$t?`MPyh2H@ga)fu3=@Q$(T9s-=Y&aI|Rib=L!6ueq(+Iz;%#$pD z9LQ6KSLM2(FeTyqQO;h~&E9@&kBRaLNV%buulSPW_z0}Qwf*Pdr7Xd7)(=(HXJ;QZ zWh8UE`2-H2YO@Eob_ff2KN}qIFoVcp`>1AE!8i(9dv&jo+Pbt{Ap;f3)N5Cp>^#^Z zCa|EN=KB3MElB=gA#orb_0#cvB7RQD_d>e?>{J<)UQL&KOE1^byx#P}iEt0*nY6)h z=1mxVk!NM@Qyu{7<0dpKl%ifq`-*BG{IYam?CFZ&pnc=WVIjK-fkP+y%0U?i2gxA z40KMcxmt*459c!xpCB8>4xqQeW%kCgSZfh9iq@@?0y!4 zI%ew88&R{!(2nE=Yv#Y5wd1dVHYMV(mNi-j7#SDZWj7ft6D%I;AhNJ9X2{u8f5r(x z3&dapq*PG4A{%;h>QC6-h1=8#V6f*n$~~0xi}vup%;6fVPl=u(nSwXn?i3bD{LX}8 zvUVg67kzX`THPamDi7Y=WaT+{lvA9PkPI$;5rcsf`BdKH#v2`H$IGD(-08s9B&N5f zI)awWtXJ*fa^`8(6^|shSYLdRenxnJiR8^wKKHXck4yJT*^eAMz2>vJ$^y&}5kMH! z=6@nct1PwL0C0DU+tUc7iZU-Wnzb(piP6NCO_L$%b_zmg*4gF>YeJG^hFA$54wQVl_2~sTqX@Ytrqy(FVBEW=G zFRx2jH#Ub|sSuwAnHtpxnESq5RI7gth)u4S%KBaaLw4Ux!=Uc&021n9z0v)?mG6br z@7moc9GuRi$UXM^$}}(Ly^>^d3As0#%AjB(mB#YX$kY?7L$~**#23jh>;CvKcQw#D zvM~^G?@G>kI7wu@;4+Hcr)PSGQo~CpyQX9LPM1WBL{ij{5WRYYYKCZwddaN^ia$O; zvgr$x_HWxEE8>>pu1Wm{w~Y3v9=5AU5f9q9XbK`zP3D=;eUwmj!q|#aT$kt1#7wAP zxIu!6gf8HUJJF$fe_j|c!*UeCmlYM)Fz#c|OrW!fQW;<;GF2jH=$d$IZ7aQ0wUEst z_A8%6>#k`lBC4O2)Kr6X#xOd^)`aGj@zNJYm;sWlxuP;n4pEbJ4dK;@y7U7R#LE`2 zRk41uONuAF4x#if)&y%X?;|wyypF(9B-xWPKS@9R7Z$L1&9SXKi!g~ia+E5 zw$*RjP}`|y`ftpmFoV`<_hVve`T0`)-i|rCzY$ksr3-9(%dN*C}6bJEk zf@}xoArBumeq@UBXN?GI8orC3kavFkJ=5n**!!9R<)<|`Q7=7wYJd;ZBHoA^MyY1L zZc`hb^yeGMrK32oj5v(86C5KaOszLjuaC{|Q*rBkJ$xEwt^VdJHgO=p_BVdtYnX?$ zQ%zNTV%qpYIkWZFaF-rAh0*}~njT!s;bI-*A~p7|ZP(Z=hhBIOsT(MM22d+u2Kvo3 zN~M27jbTtwQ@>xPdg=YTq2)T*Xgp~qcy@q?(lk;$`kZF4i~E%+{VV%_15QHO?b#Pc zD)$B##?_2XQM-tY%;shj0=pFmNp-ShdOFfgtoQ+F%=MoP;OoBRr|YPT^@Q}W3agVd z^h~59B;%2rB&(U2H1oyaZIa+sf28IZu(vD<$O$*ydh_45ka|)h?3v8Q*o>>~K?9!I zY0^tgm3wq4+$?+ixq%y{tRwXf)$?I|T%?GAyrLblTv25;X-F83e^buPhwqysog+Jm z&BTPoFj%r&LEad(tHs4QVP?l!2x1#tqp;gYAP5t}I3un$Ih)v;kfyGo`UP?xBM@G7 z2i3q*7hjmkAvy`M0}HFEpRVJ1cv?BKTTf6PD=F%~)%YvGCPq4cWsq1Z8KZtmlw=JO zm#$H}5nUbibR^by9{m5u?Z^kpWcr{=!e^$n0le9m zSA;I1a+?6uz&2Ayjtr8nKG5Iu&*!PK5V^R+;mckoNg;|UWNn;|Mu(_K*Y!i98zo{(g-RX zEnC1o(ZB$N$h)hxjzqrK)e?*fX`Q;IJ6IU6_+KY~dC;IDU)l`lG?T!T%b* zD@bd!KD8nC?qnfN=jB;6mBvR8Nx~3q0eT#pH$5p1ET7Td{u8f#V~;j>6eiGNnPSLI zN!fXq29wWao~tSPmsT~B(d~Vj;;GMe059|o{f+Pom<}1*=AtJFT_`rX!tdoaun&f` z-lWz`(py$=YQ&N4Y3U-JePf>al|$$v^cA2)7C1^0eSKlsh3i8;w?guV)KvH!EVhHQ zP^SiB&>3(%wh9?|#?8Ot`V(FS$UPeNs`W`H8^y1R$8fL^(10+t8LeAV_gj>!<#k?; zba*Gz%+3XEv?_po$q>B+t_-(AQ+X-`oRE;aHPPaglLq$-I#|(LjK2SY3G>ZufV&Pf zvd@FHs@uwxo-O_+fSWN1PzxIDS|;Zuz8~)z{&IsiTdxs8O{%i%TY zWxXa7^#yFZxOHl|LdO^N3-~0=`jx@(-p2u{xH?yXp}mipKVYu*?hLuc5^5rb9-sHI zl5bYk_aRFV+a)BB!EEnA0yYlmr!`-C=c|p}b1*=W@x0RAx}cRS__s&5Y-LLL!~xr~ z#1X58R+LQ)_>_7{*B(4cCzSr^m$QDJKxK#~WxW`VC8YIGfPQ4Nb4M!|{ol}TZs8Gb zAULWgsg?{}DwE1mPj>MQmVtuK6@%Z{RQE(zC93#n<0=^3Yo&!Qe2ypAb zG|^O^`Yq}i=RjWlyk_zBw0EiD06w{!%{gVAh=+6QPDsubHmdByWQAH~XJ+3}fwTY` zV9iJwY9@y7LbXTwxR>>Spg=2BVGNG~)3_deickj}5XygO$=e%Gb=8ll8UH*%c5>GU z0pv)hIx!a#87(YC&hTNvk2PIPQW|@vrX}l7VCJ8HV@|^^Lx;on%@lczmx2*8)OyFi z#j9YUs!kBiXU%O1iUNsKUu!@MVBUf^tbEmSSd;wyV93Ekx-ipMebDC}=SWh0fIIHd>0=r)1+qr*F9;Uk1#(O?b#06iQSkfLUy=?IBceZ58VFO6Ecs;kXC zWNWT9AV{#1MCJR*+HeWqO8Vo`DAfmdkR)k8)`4cMW1s51Os0qHR$V$vuRU8W10BNz zFduf-eYAZB`D6vIHE0tQC~@I7BV|iWXts!oB}$k0UUCcJeQr~OY`*1ESE)6GJX>s) zqlO~?v<}3tm&}$}_3bvP74a5Qq~ApiM7ic%xwD<>L)qJKGPmtAzOpy$zBGTn=s zX1~l4Q>jmT6Qs9I;(gMHuBotB-IQh4Q%w^PeJlRH)tPVR?MqWIl}70a4OajrvFc1D z6ck98AR!X>;#JPY_7qxwwK$z@>PcVF73XAfZigzOk!t`^BrBbdwnnc;g8~b#!qY^i zC>PVxMo3o^$lH5gqSwUcA5q4*w-Kuk83myQ^N>Vlm~4k?MSiDFJ5Yj)ws=zW_f@&` zGQr-ljLNQ%YCl7EGByI>h@(hdltcUEqKq!{Ho~`FY7iXG--wxlN~Ivoj`8goq^ljl zjLiq+-Oi|_VV;NYRfU6#vV_@_kH@kA6&f8Lx!d@7)*?a4vNKNAZ^#>f5*fYM+pj{e_Co1o1 zJ`tUU4+UOfH1Jh_}&oL5I$>SVgb1k{+D$>BCOo{i;oq#@*k?s8*nrCAslRM_%n@I2JHc#JV6pDj6DCyIf| zEB0HSD_DGO1s|<5SAoXAeeB32b)%GWq?`F06D{VXH_LPb*Twc1qa9k$J#gNn8F=S( zv4TmV5JyygnZG|+Q5s>UBFgNvd|gd<0Ilh61d46q>@FI;;lbA|MaItA&LXAta%nHt?Lb+EC7 zU~sQ`!ib<$A7SiuvkfZT**VfQf=b|ePZ1O6#E9uq`9mJrEWg9*<81OExkSdVLnS)@ zbmEzb+c*u?;3c3)+gc2FHp(monEfu`nk(12;_-@@jOBn46=B0M34sYSjd7`ccKh=$9JR%8+j>3{sw<_N2OXM@c9A zQp4XCL5$&VamZiX)Y~0pj_+*z(_EW9q6C`_I))GAA3@`E zWTw&$QEZBVKEFIx_&%n_%g{R7g@`~pvxv+JsjQGZ3bb+TY)KOZb0g-8ksrG% z2m6_1|3(8`>Y7*`M>n}6%@j?*TLk{W8M4avC*Rcw1wFO_OZC>mBR&~LXQUMf6lMYEm_ZkgcC!@7*8WcQJGA}9% zQOc;-dkfP2FonXyu_cW%0l#@6$UzvZQ@K^$(D|%Ie5cYK*=Owa_R1BPplz4Kfw4vr z6G;1n5|oo~ZB%)X`V4}fEl^d9oKb|3SnOncN_38JqK{!awsZ`bn8b^cGt&=q6oIIq zfonqx<;WQdaN!Jh@DJP)M%I_(qycA=i zd#qT!wmIf`F5P7UmD&<^zaG}WPQX6Gfy;G)4MGpL8FKvBWP~U^DJ6H!zwDCm^xa-J zYa;Q%1YHTVQQ1U6(++=?uRAsYRNmsaTK*3Jg~&|5&(Ti)tSU@JG>GF@^ml-KL#;;f z0b_LT_YjGD5X>sh)gSpf8Q7*|z95mg_xPzm1G^}cc7%b#D3HN=U(g^~=r`L*P2h0S zp0m(TUk(qsdf_P8v3UawO}!RVDH!gHNdhp1fSdh7hcK9uyes%YGP<#9b6E6Uv}in! zy10Z>$A7^_hIY;P7cXHBxN+X-(L0Z!$kROv3}X)kdj(REa%_)=^GFh_X@J7n3rSuh zd`y?%5Urg<@0@;fCIAp0gf6=Rk^BT2)B zu#6um+*)16T3;EEk?9<&%j_VNp$2hA>9c_89AWj-lSjOj3V&J@g`U}~(wuS2Cgz(! zcQ(}$;Mu?GJc*x7wT)~W*af)jO~$z+vo6+LQy0FF`oIWGLQjqBQC{_B7`3DCW3C54 z7K-AhkPB@>GYC&JU=hsJi(Z58ZpYhO=ukEN&NngW0cnEM_ zn&gXsF|(e8UD6xL0b_s7uRFhs&oOdZ1HHR@i<33|rjiG^RrjI2fOQ9=eY3i`H)Y-Z zw7JYPVmuSL!GP*7UcfPSI{{qW%cc3&eh0d_lo3?sE;^@V#?dMKBcsQ#fkK~|I%9Lo zkq2P6Qk2hv$1*~sz0qlq|dQoS-TpwT%ZUH)$7FC*?m*=&yJ z%Nqz-F9LOfM2Wc$>wz#iz74#2C;&&Z^A!u z3w7wg3R>^M=pjiSCbi`&r3N$InyQPgu7+d6&1C@(<2ku09k-CZ4UYI7Jp3v7k4*d zi(ez4ls*rG@>&8FlH<|2E2rVFfL;qtm{Li(H{M5b6sKpq z00ibz@@%P1CL({uO8jbEj>@OR@%W-KP8F|Y;0O?iG{BNB!-}rQL^3ln!ik*&UQ<=d z+JcXj!hjzOdXJ}P{Ig%&2%~E9lna~Fw&Q_~H&Au4nel}X7yC?NV7<&$p$Zj>13=ap zzqpcQ3xHUJCMW24P}uBk(A$B>>1+)c@I^lbab)uMRANlx={FNR6dRVfzqt?_VJZ2p zlw!sB``PtPY#Bj1IIG^aS^0>R8IwPY-$oXQp!HZo^%g=YAFv7A3tT=-$O8s9(#8D< zq}OFw)PKZ_tlPc?c5PhtI>P8v5uZjv9fQ#a&m(3nVAD$hxU~x#o|fNdstgLt67U@wx>W z8r5Hq=*LjYJ~+MtV%mi!^Gfcl5I`a&JGq@iRw2L}42$*1?48|RdrKj~H1IAA}>I$OWo&9?@f| zv`Oqz6+lzu=@L#Kc-_AdAN|gajGj}*@c3sSc#$=Ggu^({08Bd7NGqKbfZsd!G${h^ zDgFhsOnm-|nSq3Y^lT8|aa8MQD03u$5%1QG z7$(o_xBZm3Zr;W=cT-_IF#MnbJKMiO$h{g7C4lKZ8tA8eUQuuW2N-< z*$LSd>Z?9QjflF9P)wN?;C~=9jKBQDuo4Bd&5^Jkde&44zW-;#*pW5n`h(w95qii! z2+d^_k?9vvBuG>eaqSGkY;sN{X7*+FVxOs51gO+NT+`&hj4l%CM;VZJ1fK&oO40Hv zbUy%Hs+2rC0#%nKrmO|dc)QqbyS28WfZ&0MbAse5N#zq#Xv-b9X=>H{W{9;S5{`qf zlL;1@o{)P|K9@2igg~<07t%&@$26tsUS_94YAR&JQtU9gmH@MEITQIPeGa@+Mf&gm z0$2=LRxHrm4GS(l>H}f>e;NbkK_fDoNMc{$9t30rnk|2KhXR~2<3_Yj#r+GG5ReDi z)+9}00e^ztc4-V>c8~|iaSse}zp4P#{C~0ttuZag9-w7A#+H5!WO}bH>;rWTNlhAh zOJt(KO@?y0K^7v93^{$naWfomSm)e@tVxH#_iEMp^Kg>lXm$X(ndRk$0|2n)b0)uT zji@t`X#{&k!b$Zsz!Ek7%R!TGuTAZGmiy)&U)H*r1<4jnegoVIXybkD7%-%GB$OcG zFKL8C_Rgv+oW~KCWADfkLxDaU4gaJ5@M^xFRyqr7_(ZPKPRkr)ltba$3_v4ZsZKO- zH{~mnGlmN@{NPAe;!$(6_n*SD3HS`&^lDDOdFeF~V>&$(-sD?RheG}POi9l2(}adQ z$uA?rqxWwu9{&2kG%66VUP`1*`wfYORfgVpEZ}?d_>g%%aIe(2&@xU0I1Q)JDPAOt zB2JETwC`W_U|kW2{0#`eEMpjJYQ=Z}W92#%dE}o0@RVXbh0dW*EG&_kKWn{ifrzM9 zeZ|cj1}O!qFzyH;l@Z+^#;nOv{EzOBJq)L=`t9QmJMTDBF)INEZLqv0^;=$KnoA$c z`3{!QgYRG9)uneRE|DP4{Raox95e3OcDV0w-0N2Va2T8&P86YwG*S;SdU(&u+?r|J zuh6bZ`N#Yf3WSr-O1!b ziVQ?o^R68?Nyl}kRQ0jm+CkEShsx~{`2R!0S%VBb+$(HM;_4=)o}VgEqBUF#H+1VfX4W^3&_Q9V@pLhjI3C51 z2s5GV-qCquMAs%@kH>}7rv{*j=UwmJ%l38hBu5X4ipd>}pw9F+y`we;xDD^x<b)WX0M`%Ad8ISEZ1uH8i7Nu4~P7U#!NyY0m;ol&tEU*0u~qY5QNyh#>HEn#|S zW0T=AS`&`qe&z>W??md~{aFSnUlsm<6(e9o7TUWJ5N(KcuW|PQcoXcJ z1$i0ur?jzy8Si^p2+-L?3458P0Hmf5lu|ezSAB-8^Suh6hydaYC(s+NMKVv}OGQ>d z1}UGH8B!_Rr(kEXccD-2SfVj{1VQ75gE&U6IW-j0h{is|#;k-j*q0cRL&IxU4IbWLfGE}wd%6V5@Gg3MBi@zdtD8bfRl*}_7nB%G$&qk?$;gVVe8H>uO+0G~L)!0+?N z`rwg70leezu32#GQ+mJQg?lOEHx)J7gmt&~fgTv-66NYPCT1MzGLT8L;RIA(gD`pT zrdFY~gM1jrBwv3mN}I6%wN?X-QLMKpJgM2NK)iOzn8sm;?m%uwWbQL-Fy&lsVs6nx*PU+c$_a(GGB}=0(z`I+jsrO*Y)b% z!I&#a#4Y}R82ih(DxdES6h@G4LFtkP>5%Sj*o2gTG=emn6bS+8F6nNA?v(CsL>gox zB_(iX^Zosw^SnH~+8^NFGqYyJwXU^h?za0C!Qx3mzLq@ujco^>B31pr=le)jYKQKx z{@oqWhUfj)^(LbU$S%)k2apW;D6a zFuu853^*qK|Fta)MM5FOhC=y(SERnLnm=3P<)}yMqGXN_N&I`4p-=SxJhNZzz>g-W z-4p9KQ&ldXM(S1YeIpenFnvkxpi-~_C$bE|@s|CeD-P34HR!J|F@nc)eQvGJ|HqKk z6EPF}=4c;IX{`g+~g{90|jPLC76*y=uK9{!`&6m!)tRFsRF)77ea88vV z^^3p`GiSB->kqNqx-JpbL+Tu{mQzFozo*gldn69`7@H(y28}z_7^lVu#^7UBxOz5p)S2}BmD^P`W@E;p3lQaQps~MI$z}^L%o8`DkIk;{LwG{ zX7wHt6|Vx(CgrJCYI^Tp(7Hnh2Yp|lY*ysqX%0U+2vDsPtew3?tNcdF`Gz3KF2@IBa z#6IF4pRHrUs1SLAN9K7*1ViavrR?0mKzoP>5*3{iZ~baZMu!^_xoYnEA+YFkeziUJ z8*VU5Mgu?rU8bdC6!R!nwyQI_2cMavKf`;#B{bB$PrLXzWM z_YAo`UC+$ccpd=kZkUfCe3_&`Z?xsR5)?j(IDk`SIjMp*E@MOvamFZeOSr`^kj%R` zFyNuhMD~dol6jF^y8k4nGY){Y9vHiF(w?nToKlB`L6!xFsU#x=Ao_lq@l_^4mnS)H zKzx{7t|zNHQI{l44s-;;;mErN;aQ?yeZf}|NsPWym6|tTYen8V68zDnfzPWAz`*lJ z*+W9^pCmp^s}=B3RBfV)KpG1m2wNZ`E63v>a z3LtHUKW)=MJ%f^_eAnL<98x|)PQC^#m8f|xliVTo3Fo)y4`Gn(2X#;tSRJ&xCnxyy z$u*DGq7C!_yIl;THO1kFsggm5XW0mv4q_QeCki`a(M zYWY-Ey3afG^{Mbfrw~3Melih(tob-Uer1!F+GFB5=qVk8pDwuW;ov2%S;N%onv~XS-7slyKeaon*~X1Lz$g|&g6mwlMuol!lYAPnt&eaW?snS# zc)f0w%pu_kXEl3v7^1QzJa*MdcoYG{36G9_7^Hx9LYEWtI={UL;{&2LvHAVV1Oa4J zB5%7HFlK7y%P*z&keS#2Cu*_%FrRrTueF5-D22Nn=P5)QS)01>yf&yms8GYS6wWi( z`oECSlk1%zT>zw?2Asg!O|Y3X5#WJEg4{2Q#^NX5;W1AU(`ivksk$3-Nh-pYI3@J=r0xd>* zNpPx&SjwHnripSINHa~Bo=-QJSpi3^l?z3BOqFwVvP7&^urlxQH?yr)W z2HB!u1!o1*60rvuxiA+P#pgeMB9t2(i;xS2IAEb5rrL4BR#xr4w6-d;I!u&BHCb)n z;k|gPXxKW*IwG=$>z|r7vHLPV?(Fw28y(hGmTZ$>=ov=bnM#zp%U(e4@;6enI&eKl zfB4kol~bSOFQDECkt1ZzS^{OVHg?>b`t7o@tbKX8=WxA z%fLN5X?{IywOQM3jfg7(hOOpcB2}`Fm7WZpv}rEbtWa<9_%cgTPq=) zi{*C4Dy8_qj97pT_Nilj*^G=W`5W~{Vu2Yo!U}4&RDHdY^3J*%*AL=G91LhAij;$$ z^LcTMIhwma0!nfm@55NG9~~lJ^#(>l;!yM&$e@T3k`{eH17+iD?aGI6?mY?9@_ z(aMPDJwrB~wN`}Z(wzK`^X%VI@-eh_VsN@Hu@-W=eIyu@1ws3dg7lYrVi@6*r;%Qs z0r}|kFlvapEa}a9v6Suqo-9atHb-&cc_F!*osLa@ha$?>*0nN^E8S?$jb~3Z@}dP@ zyP%UIARB}Jzg79hy_aLJ>oS%l&E-P!SZTAX&U*snSzM6A_KY7XSNAD>S5_$+O}d8c zl|tC*Iu7DjI8(ui@;Xe`v;FctR5y0q53ilwBuUqe$EbH_&@3OR1+SYz#$|au%m3xt zlV9_xc%7N_Y&F`Hk!Z}8Km!qae|{3se)D@Zd4mblk)MnMgI%!)w-Mckd0ef~1OqL7Wm z@n@K*jggTjxoOut&Zvq+^reTmwLjG!{cn|yJ(Bn=%gjYt>D*0$#tje!gP8lT0qpTZ zXv>n5fpO)Pt3u1nbfE-!_BAGnQ$@YZ3ep^y(v8YQz*&Fb@}$L4lG{+@IwzJQ2=_Ag zC5Gbd?VsrG?Mf{(PyV2CrEquHw<>o=jZ0pYNO(nN@}rb_gPON9p7TL-oIcvu5Pu$| z4(4^EtdZ(1>25ZWO>-(%z*O&1>n~9*UTG{ma9-9gDC8Kgc>cpn^9M6}5Uc%{dm8)<)?jXNI&&bi$n%s&yGs9AWD`^4JcC5Pi-&)Z zL4o)N*2Ls9;z8r@4;I-;beJz|&@knqKz$kcyF{FgKTG+ljQ_A4? zT|P_PC>E!TBFWEUsR4Ls=S1P>&cU;Vknq|5#_hPo^8Ed+y&{*b0a8H3D?i#2VETFY z2z)8uvUAGALHztrCz6yu6i9-E6%0C}SdHv%#COjq2_Lf$e`}~Nhzp!G~6v0-97A7-ji!CdSNf) z`@MtH`_~1pOY%>htrcmNs$4>ZoQq>);k%1UOz|Yr3z2K=3z6TY*-~ahH3HUyzY8Y?v=u7K4lhn0MoPM0O z{~AT)ghwe(QWIeE=bj!clW4S3R#{P%bKy|xei{rd)JzD^z$oQ2zcKA#jc-=DDso}& zuSGb8;L4SMEJq%!GK}<>S;4_1=P49p;M+HMQgp&sN?JQnXFt_wXrd+ZLkO>4#X8#! zE>qce0FvM}a;7QCV`oW&Jg<1`FzWhHJ@X z;3um%#v_H1JK(n#bc99Yyyqg`cls(1%q*o%qFPh4sp;%q?4W@PXyLbOJNL*-`TJPf zz~|bW!hTkl`9X+JY@~)&Z$g;RGQ0h;faiP!-#Pr5zwPbw|BOSXFZ2AsR?D{8=`wBK z7M!j|usC*S${Jh;MrkoE<4f5M?&3)DT&V0~@+z7E`SLl`q00CuBS#`WOs6XAbb2<6 zk=2d0Cefzv_vg1l;^e283LO+OQr<|aq(bV^z{I%&Xlh`b!<~ufew|iNZF@4GOHUV+ zilb$^7Qm5gN7(N>6s0O|Zu*9xf)q{7*)7p9;g7-d^FnO&Ny7OxM%YM07II(O70=8i zaWo+e&=Pn6_-`5d3kIUbVZySDwoI;}7YM+ozcD{ZO0+57P?aE1vSCRe5xwiq%l5Ms zpfG-X3!(pSyoxphdgeRCp$@|OCg?A)O_{4mleQ5RbZ)nu{6O}(9Pl6N!%lS9!882#X80HB3OUs7Rh+!G{lNhe%^}Ge>s24{Y3R`(mSx}O z&Ad!vi5B$%k5^_i5{>H5$D0DqR?CdQ=|<^sLB2x~d|_rtm``29Vpo z9u*8KVaIP$DM@p3Y!Onz1YyK_k$}%{k{L4E4W2|JVUs>F9S#x>>pw?M*DiPj4UY`O zrzwO_R>DrVPFF~@6-&jr+6NUz7(c#Mo@^8#`#Fb3w+a0B(*nBpl;nuCQcCb*)`w{! z5!9Ii02#`^pg=JccmL`rT8vK9U`V05au$A`(JM|KjtZgSd|vPvPDd(?49?onLrgVY z=%q{6p*vVkmoZA#e+vadG(h;-o29bXjMLgX7Lk$GzXr{;%J4?!57XXAeFdC1lXyrF z#9PSJ2t^&fOE^PfLy!d_y`B^#&5aDrU7^@^4G$T_nhp)vq?FZ9K^&dA_WKEj03!Bg zi*wtd6q?{@{<;d|d$B&}ohk#b_5EsmsUY?XSB|Q4PjH(h%X^PQT(rP`2~LC#1$+BU zMa=+VS-DbXNT~HaGqTuPbfSh-*rauwT6EO#4)1S5vVK}p4Z3b4eU zg4<}}16<#;fo_nr{V#W^3CMyhM}$R+5axZZPN3Y2jB3cAa>5yjfS5*sUA>>-z?)%7uGf&JNDJ9 zci8)Ng_b+BljZfbOl+kT0U`h3uTD9WE%vRMX}Ck1!7{T<)sT;dv|?3{ENd%( zXQna==t@58Raz{?I>|J_-Zv;l@6;s&e(bsI=(oKKOU|}-!D(uJJ!>=Fm-1>@uDPNg6R$l8kv43>`d#6mp_3Fb?elWl@C(LgYl$+1oyW7P?;BS=@=n`bp&!x z^it3eVtvdqsfI1yH)$~>&^#KjSgVR3us}oSrXxE%R(u}UKV3|iuR!-4El`F3+Z3yQ zoI-FOlYlWA&F3#|M%5V`4RQQGy|Q+^;xbu9ji-eg`cy_TPDJIO;|Ef2x|GJCj+5CK zB|~SJ=5+o|{t{4A*$J0$OT@jBrc@F;Z*|$AIuRLDzshnA8_{z#4VP=L!jlT54*NYR zg=SkS^|_b^+^DGzjz#8}o8b(|tdE}l!+g8i;&i@{^t2F-CP8z}>G#1z#5F34s$8pD zv3t|o*rV|@E=Iu3y6<&$mbrUX_aOb6b>bgCIil>WJ{+r%X-nbVw_x^F{pu$MpJMKtrU`7oj1e?q(*x#tjD5s6z$Pf-{Mwq zdvds2^KP{X+>rEp-VcH1EdTx=EME5Xz2}T2uJ~W67rmL#(Y+tC$Y{CuEhm#ZuMO&9 zl^52dseh@~n&}?2`s?@FC*;>iG!_<0f4_2UsL>bz+g03iF760Qerw8f!3!|jLE+2Z zT|A(7cEEo0bQ9bDOb4N35{+h`c8I>jHF?AJ`Caps{}crZ0w*O!780rV?~u=e-}n@?69?fmwMd;Fz?1}?zi9z!w7$Y9B@M65^fYs$|he) zpct_zeHXk{>?$m8Cqa++%s;7S3KQNz=SHz5;j@iS`5) z0?4Hwg<+F$rsJnT=4y~o>0gzosaP-Y5iD4>{)@q2`zFBZi3`}YQfjpT@~L&1OZIk# z#m2*%Tz(3`r3nH)vYHS>`%Eh)6yw{sn;0dJl01Q@mQDbul+F^_B%g2yI@?WJgmxKo z!-Kc)(9^njmvngW_-T<7A)H$}oJfiV8Vl0nmAzf$L&m!_U=V<^dhke>nK>bvMFARQ zFhXkS|DN41=Ntb4wyP-j6eMGuJAD)~A{F)&HP$(sN~t35gXfnq9TZTYQ(FK1|KO~W zht~D_i!!B#J+Y4}j{1Il2Bm6B;u%@&_U=bL znNlKP6t$DNq`+xONLuOBUoBi>1+l(l(BRm>$#di!r$A9IIS}1pLD9BN)42ht<9ufE|M$qAU`Y^4{@VDItotn$m`n z-^tRA4BsFoA}0_MJXZ}e)J=JPgaPf2xjY_#pa#Lidrw*X+Dg5n<~MIH=3-~-0St^M zU{Vizghpd=KC_?p2CTmS%@Fi{#e3*SQhfq96DGr_#0etp<&*bI*+ic?QfNqE0+-B+ znLJnt#cJ43Ew#0JrOwI0oIi$73%??MCHD`$Y1F~7NtHTE?}0wrNR<{xEbJn{s2fKJ z_P96;d2<1C&B~;Z$vPb+{83^4R(_h!t>`{EomUW%GqL#+j@%@U75B`B+aB9Z+MLh+ zREt|$6usf&jpVxKqc1%THp3|@H8Vdjt;t&laN!d?kNVIOxBBb?9Bw4ANfr6rP6-WP zwmR22$n86QNi4O44mSYw@-J$b{scHkKt&z{6;a6iaLHKK?rPV`r%SbLEEXLyc!0?Z zAXoR}o(p7y8p3~)mwZxkTESgZ?!R!Jqxf|)V5<;AMMNP0(96Pap(;=d*$j@va(RbA z`kX3;W;&w-I0D6kzcZ;iNkCtT=xu{@m(?>~PDaFHU8~V)K(_Cwv9{P<;Mz7Gp7(Z1 z#K&q^y^n(KfH?I{^F11juyJs|JYeY%Ju!HcB4hxfp187>V;$~P+%HsPgbZDN7!_gP zjO;|G+PS!2j%Cuunhg9^XT`oYJdp2xQNR0H*Q%-Q+NbZ=c4i7`7Iupwcy@rdD1fsj3Yk39op^Ry zy+3i{qo%d9x^baj8M;aKP0^mpGC83Ruq!F;V04qKFqUy3NDmg|Jddi19ibxYp?F+? z|L}NJ<&@;hFZfJo*o-o_nwQTrzP>Yw%3=l#(*cvhZiaW>{4N5c6IO07kea|hd7@Mf z@0NY3*J10Uh?C%W4no1`emNxG8|ZOL7W?-bV1>bOPf!&Pbe3q_REUeSU|3_Wb~=XBAf*S#bDgo=`5F+E-E1LrU6V@6vQX{mf&mazvJhAe zi}Orh^iOXSj~&2Mxkr=mtdNe4K?Wsgg>*1bSmE!ahL>*LGiW$D!LOFiR6|86_oTq^ zNok%70=T{_q{Z!~BC0nq;<;|%{I^`X5fCPrS%D7Nk+OW5TLUR+^xoeYVnR!xfXpG| z4FG@;j2}1#(^$%xX^z@>ICO)Zf+so(=~0zIUpgiLg%FJS*qm}%(&f{PUOB@E{6Vd% z4+9X!5h{vEbo`KUu$Qf8D(hTxdJT{dZg2t-D7j8~Ztd=?GZp8U2gNOzf=Vb$-;_@i z2G5e%^<_TSTe!vcCJjj>iPG1c5NLqMZFabPZCBb@*v?caB7nV{nx=i)J<$asqt%RW z>eL{DTL8>aLlbP04ftx49QrO)C)7u_@VFgsWgcT=rgi;|iMchZ5{!@nT*rD7DZ2Eo zk)#a^k0O5^&U-p?NPyilURNSk;A&&pq4RQs%;_4xaN-YZw6kVVk%l7m00kJw95?jy zhMteU@Kg>s6UFb}YscBFRScSb&QpVD881zdC7M8Tlog`5*H>hALJ?pN>?QJ@33g2a ziELtw2KN@ufont1CLOVsm554sxH-GcHoF>pdBz~^B{hhM4vHT~Hh-OZ=#tUYqN9XJ z$`e^K(|UU`Bqlt6QN%O-Nmw}=y;lUEJ%_p$q?W=7c@?3RJMchZx(^)S2RC<5+%jh3 zYDXh1w{H~J#nI};M;|C*4KWo`(0!is6hMUPKY}o+sKnfdWd%^7_tC2hmM_#&KruMa zfdiIkvbSf$V&+jJU3_B=PN@Z7zS=mm+{DiOav}Vv0ig z`YK9(|A7IOR1t;m7ZaIbxn+)Mx2Nr%2=OZ`5jbChej(GRTW0K%1Eqiw3ijd)6q)^$ z?>ZjT8-3?|)B&F4f0+nt$p@&rirKC8c&Oi&wD+m=06qc4Gnr?8EGN8*(swVNrBU-6wmcdXF{AQG1Vv20U znT%%_qj26s;oaA2Y);?9;MAlfimX;(M9gqTTx&Dx>?Ew%Y&YhUMywF=pr4zrNz|tR z$}s|sGUKMXJ5pc`oxQWA!0tcA(suPH)=LxVIK$14`TI9_&a*xl+tQYICVVhLeSnd= zL?_Uhwa1obkj#f7Ba$j-I%2sAEVL7OrFo$Ld+6Fuhcjm2acOA_CBS#u@I(V_yevBx zH@$riI?}VK&~ASfW$AS>F7Kwzl2goO<_>MRTVviop_m+ZvUYnjofsE&E`Nmw@J#s- zR6$*GZ2A-P|Ln;CM4-?0i5Z3rJYm>=M+Aa!q4GrO&^vADDE+Kb|gyh zTxbd)%A2`-_{5^gvHaE_85(Xs*G*p{|#e&DmN>m?a4-9H5Z5|koBIaeYAxI$!5-kT-lsf1Vn zE2X3_tp+|6|CJw~kPRca-J(pt*#{0QW&nPD5|Wrkhy?Mq$4hUFfI~-xXuu=Um@WPp z7$4{SIvfW4KztxWe}ZP2zDvh3!++9-M?OU^W|q$@!p=YwP~e)-*E?Hg!}OIwT6sqh zQ69u+EeBYucPfv2yv0^i!iDhcujshe-@i5a2w@3Q1WHd!j{^ALzj<(NQ|qD#q7X)T z+4SYyEKqTwpd(vA3Uwzm(o4|JNw1#ziwK4Vx;6i*J)IkPvvRC(ZsHMRUbv~dc)tRJ zjy*`$0``@S9Fs+X0-!Axb;0iKFQ8cFj5;6(xc)455JW@w_VV(BOn#|7DuUmzst_T* zABk>;T>688PS18%gczSYKwRk3?a&fMHWyw^P{v`^?3kwJIpwXR>~rO){4DM`JELbDjVH7?|J~#EhP*Gc*>3A&`IsCUcGL1$Ys2h@ zrS)jZF@HtwK zMF8*_EUYlQcRW+B0Nm{fv6OVbt?-gYL0XJ3rhsNz!v^fHr-|VWEF6;DbD#46iTy(5 zj>SN*1y;l|87wS|18S0>ga|OhkmA)nexz5^g7nmR@y2L;w{{{8u`9sL-^BNOGU=P$ zZtQq@|49mXwRGTfpMWE1P2K#<`W>GJWdLKveD8MaF8k30SA1@9R$ue=8-5bScq8|1 z+t9KD!K|bGIyPewDw>+>WgcAJ8EfjN2$RzweF*VVQTq@QSj5eY^?1>GcdR4xdHurt z^~dBPE0WO#Ol+&@9W?S8srC1W`}Ba>4Y_dcPAUjG|a4MM2+eu<&)fgYM<$j77Dy;DASmt*Io{p4x2mz!@ zxRGOg`uD2$yM_B-qw%tDq9~xD0X=HrjZ>3XkQ!kP)@7jh(irFl;l+9^U1jVy9$X(sw#%P@@5| zOS8%-k0EMFcs9en(fe#<)8%UX3LPcr+bb1zq8(2JdE=!sw*hUx(LW+o?M;A~YP4*+ zuHdluKdtUO7N;Y`h@%ty2TM)ux%}fAMYO|gEp%(VNRXAHH<+SZYUfq`HgxIW4Vrrw zONg0GdT%183UNq%(?E%%z%2Pa^u8l!pk!{ZMlD6Stw(T|d$*5LL#6y97gsO+lTT=Y z9h_LeXe1dDN@wiwiD1zkTolIrK_!9{5~#bm!?Vt2v$cn{8*4+4}tWoTqoi@B^LV{$+OUkAekbRf0jm zBFx2Q;gS6lg5}TDXkg*rQ!NT|W>D3u7j=F+Z3)Tj zbpPYcP=d#|*_zc}*D;-zBH*=344)evCW(a00+0McFfvw?oNDV5O|`_ydf*uwEE9z^ zge9HSTUN8&2Oz73H_7YvND$q*`#bU}uZHSP5w^^=^?*)s7s`;XOzJSI*X|45F|AGq z#`mx4+{~OcA4%j{qD{nO9G>Qo?DE0gT%%qxexhV>vOTgTnso$eo~<^qCLzW zBf!bb9hT2da88{jPE7p(I0*Q4^aqR&=Fav31qK<+%UGqkvVu`$`Dy4C2FdbKq&LzA zli%eF+5CLzPFRqni6NV8Fqj1fncUEx`D7&%8z)4W{*VmhyiC@p01cig-CX|*+)AjG14bs`{>k!n;Z zhP^jZln{#vJFOEcKFw3xz$?iA9tP{80zh`jFiIGi5|rzZa|<^ymL+ABC2bT0SE%fN zP&~#ZGyGzX;arTz7=(CTybW(zz!N0y6!lXe$uGbH&Tm6*q)VEa=n84-8AJr zJ~koDHs3lNSW`3{hjP6I8mT? zVw`i{rpd;pn%AF&5Pru#9uJtpJMW_TQGT>Az_;WJwcN0U?}3JpKv_ZKK!1|OdG8=Z zD{nPgQOJvtYz$dA#n$t?zr)&!9te{o!cMNa2WDLB^VgR7GKiCa*X?!nnZeNfy!WnT zoUV7%{C+t+hk+xiuxGqZV^|c%nu=txv@2=oqZeX4?gme2?J`=b?g-~lMBfYc&J;Hi#x@qyGD4d>PCTSa>Rf0&6N!UUV z$PFJ9gz?caAV(Nvkzv&Frf*mlTeTXYGq9Cn!0bX4!m`+f_(7Tct-ZS8)WkZq=x!c}4F?xXD zHr0doxur&I7R1J+$=rnNfE#mWi~MR0fi&8z(Q z!fS9ZD-0WoXUjEC|LYxFQ|Sg(R8^%T|6O`~`I!nnOknbRzYEC|i(8uG`XArFowF## zfQ|^85|E8E)PtJAhxz&W#Z){R3qlz6WS(B)s|5qlU;_wJF;7$3R@aTP$+ZlF%LI~; zDQCv`yvCwaA<@ul#1YV6p_g(I`;4@~IyQOq%f6qy1R_{m3w&|fl%h2Tis>!utA$>A zzeb<4fom(7ia#B#&eXxI-!1V~zG^j%J{AFQpOO2iMrS;A#wzx%9TggW2GBbx2FArO z38<(fdLK@h{K7%(h2KplBPG%0(99AwIEk?`@U#iS)QAXuJ}{w$Jac>BoB77h?W!!# zcQ;OY2j<%H{{0m;C$b|y(-eC-)nz}?A@B}S*FkJT4I5d^h)>@5+5{ZO-YmmEhsMh>mMOBmf&3K*1v7aw>uk}Oq}}bY8%tJ z@6lS>bmq0<4aoZoBBCl^a)VliLKxP-vs8|6H@GJCmlT&=Y-&4T|6Y#f!zVQBY^XgQ8UC}PIg(AvXfQ4XA;|$(sq9PZG zE3V^OiiNK!)-dlP2opf~As@_}s*EQkWZtQ=v5*zk+Ie+Fl!^P6DM4S*&w35=GOGm% z+WYO$wIw(ArZ}H7<%8#4 zgvbf@4o5=Gz?3m=10@L!bD!e9khG9$ zz~<0Cx6uCh?kXA9=Zu;LC!Kl5^@~Ke&hqZPzTNF}2vMoc=YY1uKCn?8Hb8NyL4KMq zJS~c6msuo?4SmKL;#Cx}C?YIHUS9a3p*nKC9M*@S?Mhhi3?QR)rIqj)*RK)#L-JK= zj%^z9J40KWrLuG6l$V!#i>x8DAp$1U+q&^66(o=PJ%ICxO_-&;nNjI3Q(6I$yJOx$ zfnU|9D0xtLzL^r5%=NE%YpgobdPD6|Zw__MvmZ6Bf9IS~(>_$rGR_p(US>3dKeD17 zsxG}a)-U|8g(n^V13A10tg(2ZwKdd%Y2pPS-BlzSJ+4qIp+D8Q(m}ClbUgc!D{MO$ z!0nhNm!dSEVBD4|w<(Y=pbwquRI72^EzpLJuB@E8=p3OuU4DmZ`T{;zpH+eDp@m+6 zju8m*3r`7y>za;4mnF3#(BsAy@A;>k7=W=Gfj&rSn|&0q9tsPiS@OH%=R=mvdK1Cd z!|^7*3s(ve)~IBMF~{qX#YogCaBGNOu<`?BP}gQ)V~JM%8*{_tRX2aIU0$4XT56@! zZ1*MS05$Z^ayFEXt%3Kb1v6Ocr+KG^)IEL!!;(XyzIgZ&{k6+x!CqHD(j??sV{CDM zfB%zqS@MY&ZR-uiTUPfWXVgaorW%QIm!{<}m->kPw)$($N81fc4cDX2lHaONOdzKX zB1@H$q<6vuBt2Zw*pkU*)0LNB&jAVY1QhPN?Kj}CIXKBy-Mf5it`_NN1BW~B z!thQD=pVJa`8)k8Ve~Q&gkCroCYaynUtsp3ky?Cd5<>XX+$Nl{*|IHVx+}N~q_H>4Jg}!Ibg*!j@AFsZ(yO#X3)?~v9`@?aAN9eDna`{62 zMb>=rSFsSnus(seCYc)H{B5JB9<38mGJ|C#R}q zDz>~^c!b9VH_Lage9oE{P<9hoo+MpY*zCQZzuG&H_ve!KM*-h`q8-e2hs$S~VJUEM z_A8sM#>imj-&gVJ?;UQ(jEDXszI2WS7wgj2ezWiW3-6|f#Q_?JL-GZ72ANgIM)&kP zUO@JbA{K?{bB&Pgy*>Zko4Wq>G-1Rz29G;Fwp0B}US95tp_3{sxfK%+@#Q_i#47~( z%+FZi@r}JRw*f`}zi-qZp@4Zg-G{G;zAXaRKR9>3pURBYTqkBtiQ^{m#Sa@tJf$yw z_PRXxlu{^m&qNzE9U=v&nbbhj-&=-clOjw6jlD(qzL*SSRAaqVEHwMr4N5bZsY+La zX``mrAcd(yKqWtjQ+Zt_s;^G8K8P@>#7-MNeR`6}bJql|8Hg#G&0WPlN21~wxq0{T zoosIwA;KOgbbhD+U5X9$M>+vJ;nS|p){h|e>F-Zw2`z&fs*08Kub_Yo!*m zn*=_h>*q*&o~zaeUyS1K{Tj)|?&)Pz(?(hDW*pm}QyFiq2Zx38MxO?>-pN@v97N`2 z`_FqX?S8z;Y_`tSIeAMGuc~Q*Ac66x6I+7c`}ogHK_t7zXfKE@nxCxVX7o0&YBFD+ zMFi_G6jjJn6QcifcwQtCY!)OxT&b0Bp}52=-oWwnuV2b`Gyf~G-1X8reF zYwKtCE+R4e=;WVd7W|_1NTmFyJciV_zv$a5PCVHzO&?OORd#oKPZ|gs4Uip{AN31y zP&Fp+n138EF-BCXRhGBIkR7lM*Dw+~tZM(wU>~v#JP*g8gp9u!YM;zuYVu#3yhwMH zL|gcGenW9Un(?{lKwaJ60|9|I=@E4h&Ux!0&Js&4>(N@f+qbJ`%cjB~`^Z1iKL$r) zxZY*f?Ku3#_pfPJX~u$T#Tt*YUybn8uHEbf>RFNK7A}7vYUnE)!*#v8Pd|102un;{ zvac7T{X>419xK4+pdWuB8a&>)`jX-6vaR3L&MN&v5Oe09dKp&!>Fy#kcNm5OdHG z{tSgN=f8EB(^zOFGz0RtJ@r>m1(4(Gl%w&DnYF9#?_&vbs|_PA0Db0*_!g~W`PUpp zcA5Cv`Unu8GAa5Abt59QF<{CzY!;4Cv|?IYf{RZjQ*IiG=Db^e50g9q!evW1I+?=l|C|XR5DTsXJr=5oeK#x$l=oRWr126fxm5#Jdb`WLXG1O+AQc z+&%@Jw62A>TySzTf$rb2IQxW6BHaK%drg`5+LlI7Uh3;ollK-stJ&+yGz9g=2-6dj zG}(8tYKcm=&r#BU-*qFGHL^y$cTrlOVVQija(@)F1S=h9d&x}?ag(s^ITh)1CX@wr zHnO}4CP_S(D>|~azbK?jqBk(%e22>}Vdz-8b(@58)WlRG!J9smb|zg8eioOXO;Tv+ zfp`%=eoiWJE_sgHZwP`Kl1%95!)g}H_!R4*6j;cGSmUMe4!g04|7{2^6ejj{zhcUX z5z%ze{_y?&=_smR(p_{sE1uK<&+uEDQ^hMi_iDaV)wRw<{7n=-%U7D03DSNC2iM{( zQ|!hzg0Qg`0HcFr6)UrtH~+5}K$Cy0W|3rn{^-@kQL-VHN}9et<@S6Ac(+){(~|8H z=2OSE#5Ete2w6c2nzNW7YqhCteyf>iyyq61h^IeDKA|IA8t4+j$j6}WOI0^lF?dqt z;O$biwMXCv3Ym?oCMwV8qSl1>zJLPf{x0>o$(9>I+KPB=arHDZjXB#^;O!aPNVrmU zo=cUjyZgP5D>f0%V?(cigdw>bE&_#wkncu9x6z?E6)$FApgC9QYd)f&LFhNo=PHYQ z;Qn96RHsJ0i-9Ia<@-9RuT5!+rM8rn9T}4uX1DlqPSwS9L=gWs3|O9h}-LW--DoALz# z&1g!?e%R?0&QZYT)@m5-RseNy-9i>P&@eF6>>Ij|DyH@th#Jh}jTD{N%=^B@RSENx zlRMLccQ>p9LtZp>_cN@(`I(HXFCeBOPJlvVTrlN|mtpUCIO_(-~-ZoxL+qTCJ z0}wTNME#r$@qaWUs~oIuL!XyT*m!;YFHZtAls_C{%C-I|D>Nu`vT6JfydUt=noJMi zg2Mf+ZmP*GaZ{~iUhH@JR#y{$_AY!UR__6HWN_WA7*dADzrUfhiE<%F@_btR zb(eIP2-#2ag2>Y8tWmth+^tmwb*O2(5yKc{SkY4<#s7;DL-E#r@Rke70>wP5ymslf z1p!2`Mx-~CY?*8;j8mf!9oIQz>G30c7lu8A&)40cFxR5d_*KQ#h$qrKOWlIIF`b)U zgl-VE^&5L*B+Fa|zpt7-|KeOH?D=LvTzb+UJi{C%_5@9Coh}!xs$J9iIF}|Fzj#?L zR~tbNr}L_dO&2Nor;H*!WZwp2GoBMp)mY=)Z##u7d3T3yxqR1X%#rdj`n3G}N{XE} zF_FtmF9XkAE?q&;xJp!qr{bFx^|sx)L)^fom6cVO^zTmZ;7yCka|r^{*(F*usc&|+ z0s9T@ZTl!|aYJZq#<73!_!k-byGU7%;=kX7-qWDc$+D*$`-YpCBlN2g<@#))g&Pdy zGJ8(ADlv7@-|MYS(^||z#@cm_ePr;0&&kA=zdMXE8Ok+uY*+cqHb|V51x43awl!^T zjhgm(98?bs35xyInIo|8Noy%vsLgkFQa*9WuYV$5Uex=m zleaRFF?3%RXHH#Aas<5^yZ!CI+@8Zd=n43u&QwOPne_m5(9Rg2;?wn)ZAG1dgXpoD z@i6J^T)o=iOc)J$$4_1&Q>-CkY&Q zt0nyBKPutjqu@h3D*U61gn?WV{^L|vx>gJBRDXQJt5-^l0q{_e+LB%Ru7EA6tGvL0)<#{2V4Wh(!=!u+8oi;0$8uW8ZOYa{iyBlg_M zghUJ?!5a;HUs`YfHd9dvXg8bQ*%xZjpmhNN;pKkV+%c|3&US?S85Dnoq0iSU}tOemKI>x7NL0sqzIIvr?nK zVa!JMy?0x^zv=ovLGWJZ+tt1!zdw7?#;B2Uev)nUUfG}d9sQ5D&JF91nAu-^O>NKo zb+&RLZhY|s;mz!gu*YGx zV7^qbFl;e({1Zh&_r(2f0*Bu>FZp&?r_L6A?z9(IAJrO~gqj`3TK@DVJNTpv|ny>6(2iozM$|nzis!*y0<%ky?p80 zfBG-C?AqGIleTRnl*-?0N%Y?I_I=jQnz!{v@}ZAsmiX-a$voukB^{8QoX&_@*3Mk( z`CYO@b7->o#pI&@zk|lsoALyz_*TYX?$A%DkT1BKEh+hYI~;SFY0~ z?B;&U!zbZFeAi{|{(@2L-(`fmqkqS#uj*kOIBYU>+A`L+>T`uBC#j$`u;)e3(zHQJHi<-(51JF><3 zt-m6F#uLcIuTDm=sW1XHAaj2v%N@}J$LEe(E*xX}>OcK>6G(kF??dIeJ7B{*E6(Y8 zV{$*>Y;;1PYE$<0=I$;yzup8dSZ~#H$5f}48qKioQ2%~ZP7<%I3|IW(mw_bSs`pNQ zRJMKF?U(yARK!5)<(vAx!)P%{Jouv4<+&yU`cgt^<4`HRPhdBc?mjK(xQYV*G^3fe z%B)R{$g)u`N9x7roBU#^(YT@`9J5F|y0ZvNa<%ILhPY ze)Z~pFcZGn)>3uZHH1S(jn5_-AJc2NGToCU7JA& z2q;K*iFAXEl6G_>F_3P?$T7zDyZC*6&mYep&)MDUwR?Btob&#iPuZ3q)1(KE)xrn z=}*jB4=8thMSglS4tLsu&JZA$A4uZf+G;>bLS}n5&3%ypp0hKTGfqP9Wr^uYK;dCgS&I{tAUne~Dm{?tJmK@t*Uaq;E|x8O6AqOXi^_^3Dr z)J^BbfsLbIeUKSo)TP6c`!9W@Vvn$$Nx4`L2rFanx)FTlLj|z2D7kHU3+*c|m)2XCe(D##zf-mB;ClN%fBpQw$ z^zsfDF!dcG5ke_;dhIuIi%*lY;)wfeQ=X5p%KtvtYF>}M-v_bkLj)z8leeoIy)ye< zv*%w~@frlA@rBo?b(cC9NYaJWTx8T5mFV}c;p0Wf^goI@)(zNBY;4$HNcJ>18q?hJ zW@;CNRsPPHou~xtvT)bjn9Uuv*tOG|=5t!~@ZD0~UH}6nu^&sAqqM^4_SV8QjAzlR zl<4?G;llq?jn;xFPoj&&dFx5PDVtFt=2Oa#|7CW%VAVo|lxWkF#8^akXu=oF2Bqz0 zY6~>J{YhUii!P(0o<8H_b&4ssj zm+PP}9(mTsF>Sc9@1<=JmWY=u;L}gei~RKr(mlxj&Ki$7>s#1P zw8igQa35%GgkOye@R($_jI4FZfn1jAA!mb*Z1YpkLhs!(C#_|}e(25CFEJFc~{b^v-bnV@T@a?MB_GLriZmfBI1dP(2S z5`(>;h?~Q%rCYo^w6_JSs}#5kj{(+7RAl`6=OrWeG8=$$C|82zfp^P&TfQZ;{5{Ep|0A{(qMnbK*B@y&O1lG~lydUKWbZFCBQsOn zq4Ad8UmFGwuhG>Fz7?xq$-=qNbScY9BJQ~T0Tq`kInw7=0qUF?a$3Q~iv00MTxpL; zTlWNPW`KX@A_14dbtbRO6=t`A_P+eqrBSeb@5uwkoZN_Ry3=K4%M2g%gG61v$(_{+ zO;f-b@{agbgFn{5$RZ6>z+uF>ySv-IT1iAky2fM9Z<(7DagYhRMHcti4a9obd6*$N z!oYYanVs!MdguKns=&a^vlB0K>ox1ig1U2M6Z(>255h`L*Ph+swIFkViyqhy*=d@w z8_AfSbqNZA2Z88YE&Ps8XPD?>`&Q?xopD?um{-K1{=F)Ufg`u$o-@7x!B6@u>2LP9 zfqRYzZ1__(&gLyGE{}GpfR*ln;Lx3#v(I1pq{bpq8ZW0wZlY0C2m|c^ZwBOn1 z-tP^lPN22tS8=_#kO?|S;%K%_-hCm=Iu;G3T#C%h$Sv|}lCnM!*f%nAvZgE32q$@< zl&kVq7B_@Px5`i6{-g!kaPUW>zq+Ue8Y@&E>nRtzGz`DrxqJx3$Jzar5*>STiXf7f z*({q_S&FQz3_^sBChqonmSA+LfIL;qoJuCVu-6 zbFnPH^PGWJpT4&CrAzzp-0a}9sg0zwsH5>^IyuS{oa0V`By@j8 z$eP1(F-KDWx@RryrG??btZk;0GrHApQM9gct*f}$*}YlH4}R`|S?sdbZpB0_VNcqc zv4Z*zX`j*I)w-G!c zz#mQ%<7%64scL zPxP;fR9k>ux@^g^&zpC_{B?4AUZ(O{i)}ZXTM@8Lix^8W2xM*6)D6AgLzd-*4BIRi zOmN=`r_(uN&(xCe#=)+`S$&Wk8D9nf74vGVmtpx@ZF<}QM80~W`x8{-2WwNa)!%k*6*GZx>+ z;WF@)%fVk$iQ_1qL{wp7i__r1>kKW-j+*G%lXhrtadDH&WyO^Ub~zb|)7%Ym*JUZW zxNl^^o&W@)rd)1>$4HJ4$>>mzuxx6ewDj3i6(4TIg7Y3Pnt9B+`yeH8ooOOGW+A?| ziolzlNUrkChZ{rV+k&9n#G)+kvSOdQk3JDqrO#w4XG33Wp(6{EDoPCL6juDy5SOc-EZ5XG`am8b? z*yi17nO>Z!&qfqSnrTAR;fj$`k!TwhzZB?GEUQgotpaxO&16ASOoAL zv6;l38O?NCmgUBlPp}Wn%{AZ400OJuUJi$_aG8H1esw%I53~i>o!FKY{e4TK`nU(G|jPtU`X zI8CAM$4Qx>Tp*eMsOIqs%HqN)G2ZryyYW8#q{kfM{rk=e0;c=-!2%fnD`!+vRL|_wx_21(g z)|eoH?r-j&_794Ucnt#|=InsrVK3sS*jBOM4KkUQ9A1f-eCKc8Gb-nx{3v=OgpM64 zEiy1Exw5Eefb|)iaU?(>1dQ$onx6}MxNwh%k~d(5{GwbJlT*-4WgpG%Zhi-DSYKqa=$nlM@V)eaJp2C0A9%@#jZ)R;J8~K=0Iy`SxidhFR6m>cuNmBk2u%x1x_W_;u~v<-DT? zeak|GOiUk9Pl|>&+Br4URAZuAFGfB_ocZ2{l2b9mRi)0A6&8<^4{FT}z9o9VP~B_v zA6@>u_0?8C_9A;;X|`EpYZC|-(=*phl6zWk`CV5zH|+SgdJ8JL2kM$46BVXD5jJ-j)@cd($ZJl2Nsd zla-x|t9A$8H8{A2n5^@HC@i*w_+dotAA0Ha3NJ}y6hHZCCIzd}1jt9^K%AQ(ex!sJe7htP z$X4oM1~$U_#;J)ZiqXor@Nj6-cO_ecQ{=CzwQrYRcG`UWYme`|amYbHFoQ8E3K6*< z4`WF-TQ6sJcGCW!=5?wg6B7+W0!`C=gxWHLWiXia7BZgAk<5zkXkqvlx@^IP4lNUt zru5WEi0to}lcv#>HNoP70?zgvmB3DE8143CaRTOJNhR5$7M9A=Z5-|bZ;bo;b+1$fy(hG7 z23yD+bQ$Mj1g+>@6&~<>**ZQu4f24gGO;(re1Dl6$+B#e4$=tHNM9 zf$jsEPBcy{j!$#4E&XvwLdUR`t7}+M!6I67z`qXVOtk$5EM^q6k?@v)z-N2=83l_R z+9|mfnbZRH%x)D8KnEjtb%UY!1Sb+y6u)tdJ6jG@55xLCcII2VomKHt3G_!+YhGwZ zMK&{eiL1b9zaA*qGBH7oIk3~Wa3%zr_hBXFWCD4<@r-nvBxm(|!52sC*%0i-GT^LU zA8M+`tD_MY7Y{+7m^AyAmzHu2yV_&W?^widUOOx69&Kws2u!0=<*}cdjAUF|y*bx6 zdsmx39=@>fswympDKsohGgCbA8R)|^@(%HCAgLNCE^;s4Uj}tmhz^+pt{+uoTgc_B zs(_rZz4=DO{{DSkulukJHPF9P>mDKC8E9Wuxv1woHg{0urjh^3LBEa4!Hriion!1%Ar z-ZjKATqt#zv`$SdYkFQ@3+WaPt%4@@-okNMUN8+NQ zI$t32m0~FQtnMi4=oM)da?Jht^Y_J{1{W$tous6s;o)HtMFKi$YBFP}H=Cl48Mo0_ zyTMd}&9QuCA0MCD*;(}@&fH|k>6B3%tyD>Qxu&*uwvaQa#qZ5y9&_j#0%57ACt%%+ z4>i`*)O2#%IoY1r-XSC;jEsx~up7yeny+(wl0KvaTK0uDHNjhh8UeOBU2d8ka+dm` zXkcN%O!>O>0Y5s}Q=ZTA^Rg3NH-1!!x9HaQ9-IE7r~ zX5@^7!m~Ji*(?1k)gs?TajuJHPS| zH8e$O1;?Ur^WXUL<&X+Oj-q#;tZ6XJhUt^jaX;i1t>ImroojDh=IR_LzH8<$ogtQF zq@=EZs4hC=V8MP`yIJT6Z0q8 z`H?)Rb=cI|q^{z5+@6z1-kN%Ho}>D}1b^77Fs@5+r{w41K#7v?$mX%%!Gdc05DeDA zbGA3Ty1gB6vZVuo-~cuf^6RFso`%LCfQ0M9&qp*gG-PCCl$7iw4**gI$ml6C@wx0WTVi6E z<=Q4-NPGMEtlvKvVt~&O7vCQ3tT2xg78I<6vjM zM@TJd+yCt=gK~v&^@qOI7#ayuqPHT@M`o{a*sJ(+`1IuDUjqP0Z`ru1=@mD5O)azP z>S{g_kvN-{!HGm)E-XFhfGdAx&rCq2<{#uGL>W5p*&EB}GNM%hD5FF83^G zANyi8em9MekJG}r3^^_N{|p-C>L~bR|kMh#8!f@(2foc&qA>mo7n*2+uPf( zuA6bsba#hlt=1IZx_#TDDt77UBA7OAW{Xp5D5Z@?cew)+v9`%4gIjMLn6Z-vTfy7i zG&ReYuuI&^W{M#5i`{VGx5D$U6Yddv84FK2W@JLr%2C|<1_p$vi^B%Y=wySf?IyJp z?YFeF>B%UdKg91*RJ-MS*eEC{^hZl}+o@NsJicfUj!q(+_Z(VXw{5Q%l~Evk`0$}N z9w3JOmjTgu4iN3?YC?Rx=hi6wHhF7K&adfd->DJ<@2DmXU~pAhv>qXmsWOnZxH#>6 zk%94WLK;d6itYVnA$0U>z-?Am9+Q)AZEW~%45k8{Z=mJw^vul6 z)YR!{?u!H#?X%NU0zACx`g%nWji|eFcMd=J;b`TPm*bHUa;w-|!$p|Byyk)F&i|VFeEtR~ON<%hMd(ALN9LUuu=( z0AWYE2q@PQa!e=bz4i$AYi#v<7NMBB+ZsS#P$<-V(exZ~EarW{Eq<#06hhBS%=yAX0%yusws=W)8d*s>iHGD;|N^J5DJzE zemj*G1Ij)59Fg^~m0E^Q#CjS-rQ_EAYpEqs(ta^-nV~I3a%i=aF4+{*4R9q?Xv)p% z4`b;%x2r?!hXuGo`g4ptHoT-WtGFXtTd(l&yfy|qRGBL++ZSu?i4=7>j4JACYcDs_ z-N>H;vI29y1VPNz4~&iJ44*kWJ4;DQ?(FOk(n&AW+K&L*4u_{Vs&_)jdD`FK->k{g zcCjUZO8BiP7$Yjbg+i`IlX6iCzcqgO@=Hw2&_a`!+fo~sIecjevOQkNpd5=&M3gNZ z0!>aPqXlWJt5XTseU6G!d--w{5XZM~-+r2rktN6P$HdFaD|B59kQ7L&9fwbFx%*yX zE0wgQ8!y7~)zsQ{o6m2^Z+(Kie(C-L7}&10MSb1OZ*j0>ZfZ*K;@BGpzi7XS5^N?~ zR#B0OL&9&3d`9e;wD9|P0$RzcHj9*m%Q9uZV^_QHAbK);me7|>y>~B6CAr0ayFX=&+ig*Q?_}11wG@Y>P6VRQ3cJqb8=;}BG*1I?y(2yP4Q;1&c zesNvq(9|~?YfWF1Ur!E8>=uw$NVKD(FfbW_+#}94pWtgpwA z^U2%!D9QV3XlMZaxYY;-gFjnI(h_Zc64+a6hX4$Ad?1bnkp1KW0tRS`3guX8G0(M6 z-lr&(|27X*u(V~(Y{$RCA4k~ikF+u~%g7MD>?g|f`PZ$u=tsT1O3i*Q44}NSGR#ULhpnv}i`A=|Ee^lN?f9vI{{FB|G%D0IUAUqZ z%)l(YY$*Hs@UvqDh@Oj!%S=gK{RzFkiNVkxAw?Y-q%bA9dqM)jLv$}wqJe~zv`OpK zA1i4IT^puJ*VKScPEIOVG-V}RYHU=KQ@Uq{6Ez2N&H2hg$n1-1H@OWB4P9niT#pKn z6&0&2(Bat6Ee-zF_93lb6p4XK&I{vYtMIrqhvNLMO}ILKt>gHtkdTn8t}arNwHYd^ zWu`Kbr>SQ$%A%YzBe0iHV(GPp0x(9U9Q3Akb||q{BuG~>xheE zV8-HG9rN}h2KxHXL-Bv|A9NcT87YIa8K)G_a@9&)~mXws_9pV9Fee`=P zm4};dT6emLTT)XH=4asPK%gNr(>PhAQ2asW15ggD+EJuRPK>i|3L&4AgI`Up*CTnr zUb=`5CXC20Dk?26FRb|9(09%f`bCA6BuW7=LJ15IQv*k~a`eOI9kYi!J5Fh7l<+}~ zS})J+bt#0M9p!+wEXc&<6#Z$)&`=l9c>?s_6SIS_(yEgRSVOLhtLp z2zY3QN_L#6sCK{nwSM|Eu}CWdkWsy150gnlYX34c5C9QD98Pv6_~20@xA}&+Ir33v z*>{BEpXXKCOaq!9Jha5S<7SqTDM~#|GJ_}Aky|tpn(iwk23dZrs`H49Dp)1sa&H^+ zvpYt{m5$HK|0ol92Q{O*`bhqGvl(%?*le@S?z{^Yabxlj%?R*HsZ|dFJ&bmxCfwYq z-_oLvwTTy}O=+h_CVSZD>u_h&i3dw!7P5g3LM9aPRpXT!aZ^dytrkeH@ty~>P!f` z_VnVdUNt`jF8S4WviM0tEA)#->J1tqc>Cx8aPY>B{ZF6uDS#?%RGH@UoWegZ!YH)FIqX9erMZhws&guypy+4oYU6=cASeA;Hu~u3sFPurU}%z1 zr2N+P?dziE#NWtO|0<|;eQ_5AlZ_e9c?PmtDNw~K-$t9v%MNSY&jF-`y}jSj8Z7b& zi<*op-gBSpE8k7)@{l}acLJ7P*m(NQM|gCjimGMin}LbBvJQz>0uTa^x+rE;eGn%9 zRYf7*CN-y~1lmwx!AKHGEKj03zP_|!^j8Mab@$oj%BqtCr7|hD3w2A07)1X;vC5e9 zgC;R25Cbcm-nHFLZ+xf2uGaXIX4UqC@p(7aoCw)}fq#Fk-_+vSGR3Av>As-g7qt5e z#ILJ9?mMumHfDUh{E{}AUiGo6!hZZs=pZ@Gt@Ai_yKYV|3t!UcFk{X@_sk*So}7dc zAD=923;GGC5B<62#qdDnpPh6gSl4Yc?M=1uwdyPv�A{%Nliskd;awB8^l)38}_^ z{*_5luTI$eF>c>{6axs(vTj#0C3#hU^q=MA`hag3l3I^;^D|M{lE{A!y8 z?!mVY&H2mh74|(Xeg{94e)-~N;~<&$UhMrj3K%bc#5{e@e^07iR8M?^0jy8aPxgan zL*$ljtQ|BfD59d*j9gcOOt3dTN>#%@@t)>+{R7eWz1Rvj#s0EB1+2`^?A?%^`n}!H z^Z~GPb(ZD2-*P@0{LBeog{~f2XDKU9Y7x~9v}Iq91%Pl2sJ9hG-{nUvdi>U^j1SgS z-Z}A1?V!^jxS*$`A#-DWqr@+w6sW2$^k0x>Fg1?IP3lbtzyHQR!c$e$QmBxB{o#KA D@%x!w literal 31060 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%0DD!ehlX44l z#=rer=I=^s;n9L&0nW=2LTy1G91cee@X^8hPWLFkrUQ1Grli7kc8 zmW11G>F)L#z^rOj*N0=`;AG!(Mds(z-U@t7lQ3byZ{LC5nGt+){omd({hEC>zOZDK zTu`{vRdZmXTUHr>TlxE&4<%L)fCCTnrKhLYDl8Z=JB)tB9bx+Smp-q0u;+0uNRf*f#9abuT3f6k_0EdcITDv2by5QBbVjT*4jdy$%+d#H)dC zbaQi)#Ab>$u;_CQ8y_DBShiokew~N9u8LZ1g5DBAqWX@Gj-a|gSlEwD^835?W!{ia zrZ!2Or~eN65x=EVi@o|#TS04UtGb80?fwGufX(~l`EPY5=~Yj5WMG{?kX=YqKcnke z{fx`DyExS62-Goo6VC; z3c#EJ=-;I}P;DKZ@bGYO@q$6Z&uuzLWTgctNla9F$0%m)f;zz1Te8+A6}7h(XA?cd|WJ z@|u8%NDkcvyNvA6= zpKJI+VWr)@)b=(fxyt=A3oHSh{%IOafq{c#;t|G{$?;kbQUzCTwl4!^na0viT0b-sRmAtfbcYPzWg!$EpFTVsul^mGmF_QOfz=Wy*( zp%lLNUjMD$PyWk?yRL7pxw(0H8ELw1o}ULgn2o+8swaMAHw^vdMZ9}**iJ4-(z8HtnhsUGS2j*u{cff%jf?^#!Hb?nj;GJpr(4fJ6!Wr zTCKa5+D?_xJfhKmO}^XNYaDQ&CZU5}BNscpKkalcp;B zu|i>ojE~QA_@~JA`N8?o5oitq!jxwzd@3urKjtae3QFpVdw1LHSu)5TMQ{@iiPG#0w(X^u>9v4VxS_x@n2i3vR~~4 zT}g&_xBBVCL}+oygBHBt14BahbKmqHApw~X5Ev*Gflrp$m&mNw?0bI)r1JUxyjIr8 z$<72yUbd5i1F!qBk%|iFg5e`$lM)k?F=7V7t{4IHTiGW*)9JO@I0fWrUr7s1t5mIO%Rbe-Cj9U$7*P4 zUAJKf0sZ*&>C>%~*?|lEN#DNNfrdE{KGzi_qM(mfR(t*k&p{&t7r=Aa zH1hm8GB%6zF?VaXi1LV`PXE&f?D^Yo&?p52bWC|#L_jwpXzh=oXYC^W27%G`+vSUm_fjET}V*@D(<8+v*V@v))ZOIK2p4 zPFg`CJ{Kz|r>gL9SvR+f-~I?=qodRxl7ld3psok%dfvcp0<+*W9ZWqwKK}Xh&B}0` zkswa2rsyFvB2#UxLe@V@do=V)(!oTZ)YY>@t!Tu|&f-;$Qh`#zNgjJxXy`?Ko_Amo zO1<5C#Y@qlKXii}8fl4g7n&)5IA=mqQnbv?3&=zcYiepZI5@0f={-hQ7Z-C-*JuYM z>ey`<3=$tdQCM?!b~ZRTn434{JC+Rs-Pnuxo!QRl*ca4r_db)OPS|fpfACix3 z6tf!flHnt|;SC=Q2>T-V$yZc3D%|)SPYSsL#bhFnK`dm$&eURe)Jy7{#>C{#&3D-l;xI{r3P>$tZu+zEe}pe|y5Ip$&h3jGsQ z_D5AR)%hl>pDxzvr`-4}ug@K8Y-ZhWI~j{-YOU{C`J@0`wEOLsrPcUdQb7i;MlD&{ zaA!;PV$E_;xHVUgeGW=R)A@YsOV9vM`XwSve#cNdDj{vU!xqZ?dbyEen^tT6n~jWt zA)>?JWpvJpunTzuglJX%PF7g&M@WvxPn7TR@s;OL(rmQRt*yGOuKQxViIda)NK;Qa zt3Tz~zPgQ0C8ed!uFTAcf%eNQ@p``3#AL8#Jq3`htboBa*MlKMBqJxU)3`M+pl9Rj z{jH^{+`n)A>hcUj3kq5-oGn6L?g}9T|Kn}JHeI~M#V@kKjpR*Nvw^ent=5p!+r1y@iR-o`q1{Jgd&Cd9~ilRT)nq@-=q z%FHS*(u3Y?vcCY(gR1HTQbvaVV>xQWc0#e}^b0S>~yOgcyc!4>8F_WZU_l&jg8;ETZ2(+jDc^Pnmo}+NoY&s z-vqtRMpK<2Pm-%KSijmM(vKz?ti7vu-02V2BX2p_*gCwcPz4k47el;1+T7MdCxyE0 zV|aS*c(Q<%`@M>r)DwKsX!H%c``bu;vkj76%X24uBUm2a`YAj`x2SNk%GU-&tNw5ax%T+lj3$Cy=W6USgbcJlB0&Y z2*@y$mJ}A&l-FoB?=^J?F7E$rmM&0nPUU-Gi_QL3T-S=50II+0kB@0rts&9*e;kW` zhxh&T_rb&4z{6{@DlTcS{+^k+va+HSG#oLF62^-`g0mD^+tqArVj^P`rDZ+)nuLhm zYi7L4n6$Xrh4BG;@Kbn^3LR&Pj-p~1Ca`@oNSnY^U0iCA$dr|prMhhDeko4P5B?^1-~ia+7KKyXSdjB9jI_5x@4E(6rjm1fpg)bt7V5 zP;J879u9~JjgYx@h3n~Z@F(h6^Cdn$|5rE$9mIHj{)s7nG7W;h$x*k7P)9|f1A=Bv z+Us5>jo>CS7ek2cIk9tX@R(9HQ&oke zT>qYhPR&ElUyAPUmzKQF+H}a8BLt#4=%c$km1ut58d(!X(6_)q0a3G!6W4_#tjrNJ zO6OCr<`T`4g_G?W0_8lMM1FqvoxPmCsZ>ZqON*ONO6r5(?4*%KM@)H`i6FcEyKmt3 zn#Xd=nu(rX3JL9ScWB*Vk%(vIPX~PnIw>*t@AKcSdYGcz$r3b`Ci0OA?-%N}E00z? zwVOzSF<%q#KOs9w=V5DJfZE<=u4gU0X!a5F!%P-%w0NEj+ngosS`R6iwoAw1SzTK4 z!))*n=xuBB9u^h~8m`_|bn$|w5-pz+1{lk}iX;$Vb((>mo!zXgBUlLo)hhJi=yU8?&Bmi3t1fgWufi zefQreJ4&#sVXDuR^Nd@&(;tAzs{PFZq=Bdb1MCvMsRwm|xu-mLVgYWQpu-vxDB@=o z#TqI!Xo|Y;h(ERZ_^1TKiQ{Q)rjSO9ap%d~^kNON*dDnL=}5ZjMH4TAN88(n*Tb$n z3W9@qaz2)*sjI5;0Y3)UH^h$ue;dNZ)i-U0hn^>b#KF!E8u73uDQE|tDitIZycM{3 zFu2_8dvFqj>ff9k(1CuWs3<6b66X&aPl$&nd8hL%F_!C%6y@Quh$4(Tb>40w3Ny3F zWiBksu+}ttrrc<1nkUgxF5jh*UqKOuM26z%_z?yk%1j!qHrG?8t5h@r0%0X;dAYg! zfVhEw31aO-v+_#?OAhsIAs84aD1 zI+5h7lUGRH&h@3kpnTejh)}G(2UCRg&40a)KsFHfLqw~hcj-Mcb!@?e1@LI(mq2!l z-BW&oiXXW*vX2TOq9OTO5Xi@Le?yi~EQVg>9QopkShDltuJ<1||C`pMp_iO5iNY%D z4F^JAE%jvJv{&%*bnxj^xQ^3Z%Ti2gWr~TjWDGh>7GY-+p}6u#tp&RXboxpD&&=gD zs|Fy!<&lw}Dok?1-lZ^1b&KG9Dp=(vIHu?9A>JOJzUnxaWgbZXQp4mqCT7;%qukTYonwj>f4m?dsqEg{MTcr@GnJD@qs!Waup{C?h!&a>ak6Cb+r<4wzss zzYD6P@gS4x0q^0FS9rdaq67kpF;5bgAeq8y2H zHT4yd-T(Py41hf*ivbE@FK(fY7d?7PN4~AupX+uk^FTSKMEYvY>=BFZ-7U=$Jb@WW zBc7 { this.log.debug(`getActionWebElement: "${text}"`); const menu = await this.testSubjects.find('multipleActionsContextMenu'); @@ -370,28 +385,23 @@ export class DashboardPanelActionsService extends FtrService { throw new Error(`No action matching text "${text}"`); } - async canConvertToLens(parent?: WebElementWrapper) { + async canConvertToLens(wrapper?: WebElementWrapper) { this.log.debug('canConvertToLens'); - await this.openContextMenu(parent); - const isActionVisible = await this.testSubjects.exists(CONVERT_TO_LENS_TEST_SUBJ); - if (!isActionVisible) await this.clickContextMenuMoreItem(); - return await this.testSubjects.exists(CONVERT_TO_LENS_TEST_SUBJ, { timeout: 1000 }); + await this.openContextMenu(wrapper); + return await this.testSubjects.exists(CONVERT_TO_LENS_TEST_SUBJ, { timeout: 500 }); } async canConvertToLensByTitle(title = '') { this.log.debug(`canConvertToLens(${title})`); - const header = await this.getPanelHeading(title); - await this.openContextMenu(header); - const isActionVisible = await this.testSubjects.exists(CONVERT_TO_LENS_TEST_SUBJ); - if (!isActionVisible) await this.clickContextMenuMoreItem(); - return await this.testSubjects.exists(CONVERT_TO_LENS_TEST_SUBJ, { timeout: 1000 }); + const wrapper = await this.getPanelWrapper(title); + return await this.canConvertToLens(wrapper); } - async convertToLens(parent?: WebElementWrapper) { + async convertToLens(wrapper?: WebElementWrapper) { this.log.debug('convertToLens'); await this.retry.try(async () => { - if (!(await this.canConvertToLens(parent))) { + if (!(await this.canConvertToLens(wrapper))) { throw new Error('Convert to Lens option not found'); } @@ -401,29 +411,31 @@ export class DashboardPanelActionsService extends FtrService { async convertToLensByTitle(title = '') { this.log.debug(`convertToLens(${title})`); - const header = await this.getPanelHeading(title); - return await this.convertToLens(header); + const wrapper = await this.getPanelWrapper(title); + return await this.convertToLens(wrapper); } - public async expectLinkedToLibrary(title = '', legacy?: boolean) { + async expectLinkedToLibrary(title = '', legacy?: boolean) { this.log.debug(`expectLinkedToLibrary(${title})`); + const isViewMode = await this.dashboard.getIsInViewMode(); + if (isViewMode) await this.dashboard.switchToEditMode(); if (legacy) { await this.expectExistsPanelAction(LEGACY_UNLINK_FROM_LIBRARY_TEST_SUBJ, title); } else { await this.expectExistsPanelAction(UNLINK_FROM_LIBRARY_TEST_SUBJ, title); } - await this.expectMissingPanelAction(LEGACY_SAVE_TO_LIBRARY_TEST_SUBJ, title); - await this.expectMissingPanelAction(SAVE_TO_LIBRARY_TEST_SUBJ, title); + if (isViewMode) await this.dashboard.clickCancelOutOfEditMode(); } - public async expectNotLinkedToLibrary(title = '', legacy?: boolean) { + async expectNotLinkedToLibrary(title = '', legacy?: boolean) { this.log.debug(`expectNotLinkedToLibrary(${title})`); + const isViewMode = await this.dashboard.getIsInViewMode(); + if (isViewMode) await this.dashboard.switchToEditMode(); if (legacy) { await this.expectExistsPanelAction(LEGACY_SAVE_TO_LIBRARY_TEST_SUBJ, title); } else { await this.expectExistsPanelAction(SAVE_TO_LIBRARY_TEST_SUBJ, title); } - await this.expectMissingPanelAction(LEGACY_UNLINK_FROM_LIBRARY_TEST_SUBJ, title); - await this.expectMissingPanelAction(UNLINK_FROM_LIBRARY_TEST_SUBJ, title); + if (isViewMode) await this.dashboard.clickCancelOutOfEditMode(); } } diff --git a/test/functional/services/dashboard/panel_drilldown_actions.ts b/test/functional/services/dashboard/panel_drilldown_actions.ts index 7c2e0278bc8e9..8dad803a114a2 100644 --- a/test/functional/services/dashboard/panel_drilldown_actions.ts +++ b/test/functional/services/dashboard/panel_drilldown_actions.ts @@ -37,7 +37,7 @@ export function DashboardDrilldownPanelActionsProvider({ async clickCreateDrilldown() { log.debug('clickCreateDrilldown'); await this.expectExistsCreateDrilldownAction(); - await dashboardPanelActions.clickContextMenuItem(CREATE_DRILLDOWN_DATA_TEST_SUBJ); + await dashboardPanelActions.clickPanelAction(CREATE_DRILLDOWN_DATA_TEST_SUBJ); } async expectExistsManageDrilldownsAction() { @@ -52,7 +52,7 @@ export function DashboardDrilldownPanelActionsProvider({ async clickManageDrilldowns() { log.debug('clickManageDrilldowns'); - await dashboardPanelActions.clickContextMenuItem(MANAGE_DRILLDOWNS_DATA_TEST_SUBJ); + await dashboardPanelActions.clickPanelAction(MANAGE_DRILLDOWNS_DATA_TEST_SUBJ); } async expectMultipleActionsMenuOpened() { @@ -93,14 +93,13 @@ export function DashboardDrilldownPanelActionsProvider({ async getPanelDrilldownCount(panelIndex = 0): Promise { log.debug('getPanelDrilldownCount'); const panel = (await dashboard.getDashboardPanels())[panelIndex]; - await dashboardPanelActions.openContextMenu(panel); try { const exists = await testSubjects.exists(MANAGE_DRILLDOWNS_DATA_TEST_SUBJ, { timeout: 500, }); if (!exists) { - await dashboardPanelActions.clickContextMenuMoreItem(); + await dashboardPanelActions.openContextMenu(panel); if (!(await testSubjects.exists(MANAGE_DRILLDOWNS_DATA_TEST_SUBJ, { timeout: 500 }))) { return 0; } diff --git a/test/plugin_functional/test_suites/panel_actions/panel_actions.ts b/test/plugin_functional/test_suites/panel_actions/panel_actions.ts index 8db65c13b57b6..186f91ba26944 100644 --- a/test/plugin_functional/test_suites/panel_actions/panel_actions.ts +++ b/test/plugin_functional/test_suites/panel_actions/panel_actions.ts @@ -23,10 +23,6 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide it('allows to register links into the context menu', async () => { await dashboardPanelActions.openContextMenu(); - const actionExists = await testSubjects.exists('embeddablePanelAction-samplePanelLink'); - if (!actionExists) { - await dashboardPanelActions.clickContextMenuMoreItem(); - } const actionElement = await testSubjects.find('embeddablePanelAction-samplePanelLink'); const actionElementTag = await actionElement.getTagName(); expect(actionElementTag).to.be('a'); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts index e54cfd503e197..92376abbc7246 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/containerStyle.ts @@ -66,7 +66,7 @@ export function containerStyle(): ExpressionFunctionDefinition< types: ['string'], help: argHelp.overflow, options: Object.values(Overflow), - default: 'hidden', + default: 'visible', }, padding: { types: ['string'], diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/container_style.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/container_style.test.js index 223b8532d8a56..7b1884215a20a 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/container_style.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/container_style.test.js @@ -140,9 +140,9 @@ describe('containerStyle', () => { result = fn(null, { overflow: 'hidden' }); expect(result).toHaveProperty('overflow', 'hidden'); }); - it(`defaults to 'hidden'`, () => { + it(`defaults to 'visible'`, () => { const result = fn(null); - expect(result).toHaveProperty('overflow', 'hidden'); + expect(result).toHaveProperty('overflow', 'visible'); }); }); }); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.scss b/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.scss index 29888d862db7c..793cc423d7904 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.scss +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/embeddable/embeddable.scss @@ -3,6 +3,7 @@ outline: none !important; background: none; border-radius: 0 !important; + box-shadow: none; .embPanel__title { margin-bottom: $euiSizeXS; @@ -24,6 +25,15 @@ } } + .embPanel__hoverActionsLeft, .embPanel__hoverActions > .embPanel--dragHandle { + visibility: hidden; + } + + .embPanel--dragHandle:hover { + background-color: transparentize($euiColorWarning, lightOrDarkTheme(.9, .7)); + cursor: move; + } + .euiTable { background: none; } diff --git a/x-pack/plugins/canvas/public/components/element_content/element_content.scss b/x-pack/plugins/canvas/public/components/element_content/element_content.scss index d27e759c63ea1..a0bc78749c519 100644 --- a/x-pack/plugins/canvas/public/components/element_content/element_content.scss +++ b/x-pack/plugins/canvas/public/components/element_content/element_content.scss @@ -1,10 +1,32 @@ .canvasElement { height: 100%; width: 100%; - overflow: hidden; + + .embPanel { + .embPanel__content { + overflow: visible; + } + + .embPanel__hoverActionsLeft, .embPanel__dragHandle { + visibility: hidden; + } + } } .canvasElement__content { height: 100%; width: 100%; } + +.canvas__element--selected { + .embPanel__hoverActionsAnchor { + .embPanel__hoverActionsWrapper { + z-index: $euiZLevel9; + top: -$euiSizeXL; + + .embPanel__hoverActions { + opacity: 1; + } + } + } +} \ No newline at end of file diff --git a/x-pack/plugins/canvas/public/components/element_content/element_content.tsx b/x-pack/plugins/canvas/public/components/element_content/element_content.tsx index 1c65c8f9cfa4e..a6fb2e1af58f1 100644 --- a/x-pack/plugins/canvas/public/components/element_content/element_content.tsx +++ b/x-pack/plugins/canvas/public/components/element_content/element_content.tsx @@ -7,6 +7,7 @@ import React from 'react'; import { omitBy, isNil } from 'lodash'; +import classNames from 'classnames'; import { css } from '@emotion/react'; import { ExpressionRenderer } from '@kbn/expressions-plugin/common'; @@ -29,6 +30,8 @@ export interface Props { backgroundColor: string; selectElement: () => void; state: string; + selectedElementId: string | null; + id: string; } export const ElementContent = (props: Props) => { @@ -59,7 +62,9 @@ export const ElementContent = (props: Props) => {

diff --git a/x-pack/plugins/canvas/public/components/element_content/index.tsx b/x-pack/plugins/canvas/public/components/element_content/index.tsx index 72ff04cbf2055..e753be8cbc527 100644 --- a/x-pack/plugins/canvas/public/components/element_content/index.tsx +++ b/x-pack/plugins/canvas/public/components/element_content/index.tsx @@ -7,7 +7,7 @@ import React, { useMemo } from 'react'; import { useSelector } from 'react-redux'; -import { getSelectedPage, getPageById } from '../../state/selectors/workpad'; +import { getSelectedPage, getPageById, getSelectedElementId } from '../../state/selectors/workpad'; import { ElementContent as Component, Props as ComponentProps } from './element_content'; import { State } from '../../../types'; import { getCanvasExpressionService } from '../../services/canvas_expressions_service'; @@ -16,6 +16,7 @@ export type Props = Omit; export const ElementContent = (props: Props) => { const selectedPageId = useSelector(getSelectedPage); + const selectedElementId = useSelector(getSelectedElementId); const backgroundColor = useSelector((state: State) => getPageById(state, selectedPageId)?.style.background) || ''; const { renderable } = props; @@ -24,5 +25,5 @@ export const ElementContent = (props: Props) => { return renderable ? getCanvasExpressionService().getRenderer(renderable.as) : null; }, [renderable]); - return ; + return ; }; diff --git a/x-pack/plugins/canvas/public/components/element_wrapper/element_wrapper.js b/x-pack/plugins/canvas/public/components/element_wrapper/element_wrapper.js index 80b2f0497e89e..c1a40839530fd 100644 --- a/x-pack/plugins/canvas/public/components/element_wrapper/element_wrapper.js +++ b/x-pack/plugins/canvas/public/components/element_wrapper/element_wrapper.js @@ -11,11 +11,12 @@ import { Positionable } from '../positionable'; import { ElementContent } from '../element_content'; export const ElementWrapper = (props) => { - const { renderable, transformMatrix, width, height, state, handlers } = props; + const { renderable, transformMatrix, width, height, state, handlers, id } = props; return ( ({ id: ACTION_ID, type: 'actionButton', + order: 10, + grouping: [{ id: 'cases', order: 6 }], getIconType: () => 'casesApp', getDisplayName: () => ADD_TO_EXISTING_CASE_DISPLAYNAME, isCompatible: async ({ embeddable }) => { diff --git a/x-pack/plugins/cases/public/components/visualizations/actions/mocks.ts b/x-pack/plugins/cases/public/components/visualizations/actions/mocks.ts index 5db66cce872b1..dea0c1ace09a7 100644 --- a/x-pack/plugins/cases/public/components/visualizations/actions/mocks.ts +++ b/x-pack/plugins/cases/public/components/visualizations/actions/mocks.ts @@ -42,13 +42,13 @@ export const getMockLensApi = ( ({ type: 'lens', getSavedVis: () => {}, - canViewUnderlyingData: () => {}, + canViewUnderlyingData$: new BehaviorSubject(true), getViewUnderlyingDataArgs: () => {}, getFullAttributes: () => { return mockLensAttributes; }, panelTitle: new BehaviorSubject('myPanel'), - hidePanelTitle: new BehaviorSubject('false'), + hidePanelTitle: new BehaviorSubject(false), timeslice$: new BehaviorSubject<[number, number] | undefined>(undefined), timeRange$: new BehaviorSubject({ from, diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/drilldown_shared.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/drilldown_shared.ts index 3fa6586dbb83a..7d4458d02b556 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/drilldown_shared.ts +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/drilldown_shared.ts @@ -77,3 +77,5 @@ export const createDrilldownTemplatesFromSiblings = ( }; export const DRILLDOWN_MAX_WIDTH = 500; + +export const DRILLDOWN_ACTION_GROUP = { id: 'drilldown', order: 3 } as const; diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx index b4d1455290c1a..36c157470a2f2 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx @@ -36,6 +36,7 @@ import React from 'react'; import { StartDependencies } from '../../../../plugin'; import { createDrilldownTemplatesFromSiblings, + DRILLDOWN_ACTION_GROUP, DRILLDOWN_MAX_WIDTH, ensureNestedTriggers, } from '../drilldown_shared'; @@ -62,6 +63,7 @@ export class FlyoutCreateDrilldownAction implements Action public readonly type = OPEN_FLYOUT_ADD_DRILLDOWN; public readonly id = OPEN_FLYOUT_ADD_DRILLDOWN; public order = 12; + public grouping = [DRILLDOWN_ACTION_GROUP]; constructor(protected readonly params: OpenFlyoutAddDrilldownParams) {} diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx index ca184c23c9603..26f5311d5b325 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx @@ -34,6 +34,7 @@ import { MenuItem } from './menu_item'; import { StartDependencies } from '../../../../plugin'; import { createDrilldownTemplatesFromSiblings, + DRILLDOWN_ACTION_GROUP, DRILLDOWN_MAX_WIDTH, ensureNestedTriggers, } from '../drilldown_shared'; @@ -57,6 +58,7 @@ export class FlyoutEditDrilldownAction implements Action { public readonly type = OPEN_FLYOUT_EDIT_DRILLDOWN; public readonly id = OPEN_FLYOUT_EDIT_DRILLDOWN; public order = 10; + public grouping = [DRILLDOWN_ACTION_GROUP]; constructor(protected readonly params: FlyoutEditDrilldownParams) {} diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 5ef2a8d202984..ce86b896d5fa0 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -7,7 +7,7 @@ import { partition, uniqBy } from 'lodash'; import React from 'react'; -import type { Observable } from 'rxjs'; +import { BehaviorSubject, Observable } from 'rxjs'; import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; import { render, unmountComponentAtNode } from 'react-dom'; @@ -1034,6 +1034,8 @@ export class Embeddable this.activeData = newActiveData; this.renderUserMessages(); + + this.loadViewUnderlyingDataArgs(); }; private onRender: ExpressionWrapperProps['onRender$'] = () => { @@ -1480,7 +1482,7 @@ export class Embeddable } } - private async loadViewUnderlyingDataArgs(): Promise { + private async loadViewUnderlyingDataArgs(): Promise { if ( !this.savedVis || !this.activeData || @@ -1489,13 +1491,15 @@ export class Embeddable !this.activeVisualization || !this.activeVisualizationState ) { - return false; + this.canViewUnderlyingData$.next(false); + return; } const mergedSearchContext = this.getMergedSearchContext(); if (!mergedSearchContext.timeRange) { - return false; + this.canViewUnderlyingData$.next(false); + return; } const viewUnderlyingDataArgs = getViewUnderlyingDataArgs({ @@ -1517,7 +1521,8 @@ export class Embeddable if (loaded) { this.viewUnderlyingDataArgs = viewUnderlyingDataArgs; } - return loaded; + + this.canViewUnderlyingData$.next(loaded); } /** @@ -1529,9 +1534,7 @@ export class Embeddable return this.viewUnderlyingDataArgs; } - public canViewUnderlyingData() { - return this.loadViewUnderlyingDataArgs(); - } + public canViewUnderlyingData$ = new BehaviorSubject(false); async initializeOutput() { if (!this.savedVis) { diff --git a/x-pack/plugins/lens/public/embeddable/interfaces/lens_api.ts b/x-pack/plugins/lens/public/embeddable/interfaces/lens_api.ts index 3a03e63ded311..11b70cd6e7763 100644 --- a/x-pack/plugins/lens/public/embeddable/interfaces/lens_api.ts +++ b/x-pack/plugins/lens/public/embeddable/interfaces/lens_api.ts @@ -10,6 +10,7 @@ import type { HasType, PublishesUnifiedSearch, PublishesPanelTitle, + PublishingSubject, } from '@kbn/presentation-publishing'; import { apiIsOfType, @@ -20,7 +21,7 @@ import { LensSavedObjectAttributes, ViewUnderlyingDataArgs } from '../embeddable export type HasLensConfig = HasType<'lens'> & { getSavedVis: () => Readonly; - canViewUnderlyingData: () => Promise; + canViewUnderlyingData$: PublishingSubject; getViewUnderlyingDataArgs: () => ViewUnderlyingDataArgs; getFullAttributes: () => LensSavedObjectAttributes | undefined; }; @@ -35,7 +36,7 @@ export const isLensApi = (api: unknown): api is LensApi => { api && apiIsOfType(api, 'lens') && typeof (api as HasLensConfig).getSavedVis === 'function' && - typeof (api as HasLensConfig).canViewUnderlyingData === 'function' && + (api as HasLensConfig).canViewUnderlyingData$ && typeof (api as HasLensConfig).getViewUnderlyingDataArgs === 'function' && typeof (api as HasLensConfig).getFullAttributes === 'function' && apiPublishesPanelTitle(api) && diff --git a/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.test.ts b/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.test.ts index 45dc8cbe32898..fd1ef4f746c41 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.test.ts +++ b/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.test.ts @@ -22,7 +22,7 @@ describe('open in discover action', () => { query$: new BehaviorSubject({ query: 'test', language: 'kuery' }), timeRange$: new BehaviorSubject({ from: 'now-15m', to: 'now' }), getSavedVis: jest.fn(() => undefined), - canViewUnderlyingData: () => Promise.resolve(true), + canViewUnderlyingData$: new BehaviorSubject(true), getFullAttributes: jest.fn(() => undefined), getViewUnderlyingDataArgs: jest.fn(() => ({ dataViewSpec: { id: 'index-pattern-id' }, @@ -78,8 +78,7 @@ describe('open in discover action', () => { // setup const embeddable = { ...compatibleEmbeddableApi, - canViewUnderlyingData: jest.fn(() => Promise.resolve(false)), - getViewUnderlyingDataArgs: jest.fn(() => undefined), + canViewUnderlyingData$: { getValue: jest.fn(() => false) }, }; // test false @@ -93,10 +92,11 @@ describe('open in discover action', () => { } as ActionExecutionContext) ).toBeFalsy(); - expect(embeddable.canViewUnderlyingData).toHaveBeenCalledTimes(1); + expect(embeddable.canViewUnderlyingData$.getValue).toHaveBeenCalledTimes(1); // test true - embeddable.canViewUnderlyingData = jest.fn(() => Promise.resolve(true)); + embeddable.canViewUnderlyingData$.getValue = jest.fn(() => true); + expect( await createOpenInDiscoverAction( {} as DiscoverAppLocator, @@ -107,7 +107,7 @@ describe('open in discover action', () => { } as ActionExecutionContext) ).toBeTruthy(); - expect(embeddable.canViewUnderlyingData).toHaveBeenCalledTimes(1); + expect(embeddable.canViewUnderlyingData$.getValue).toHaveBeenCalledTimes(1); }); }); diff --git a/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.ts b/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.ts index 9b48c41e41856..d9dccab616d5b 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.ts +++ b/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.ts @@ -6,10 +6,11 @@ */ import { i18n } from '@kbn/i18n'; -import { createAction } from '@kbn/ui-actions-plugin/public'; +import { Action, createAction, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; import { EmbeddableApiContext } from '@kbn/presentation-publishing'; import type { DataViewsService } from '@kbn/data-views-plugin/public'; import type { DiscoverAppLocator } from './open_in_discover_helpers'; +import { LensApi } from '../embeddable'; const ACTION_OPEN_IN_DISCOVER = 'ACTION_OPEN_IN_DISCOVER'; @@ -19,12 +20,12 @@ export const createOpenInDiscoverAction = ( locator: DiscoverAppLocator, dataViews: Pick, hasDiscoverAccess: boolean -) => - createAction({ +) => { + const actionDefinition = { type: ACTION_OPEN_IN_DISCOVER, id: ACTION_OPEN_IN_DISCOVER, - order: 19, // right after Inspect which is 20 - getIconType: () => 'popout', + order: 20, // right before Inspect which is 19 + getIconType: () => 'discoverApp', getDisplayName: () => i18n.translate('xpack.lens.action.exploreInDiscover', { defaultMessage: 'Explore in Discover', @@ -47,8 +48,26 @@ export const createOpenInDiscoverAction = ( embeddable: context.embeddable, }); }, + couldBecomeCompatible: ({ embeddable }: EmbeddableApiContext) => { + if (!typeof (embeddable as LensApi).canViewUnderlyingData$) + throw new IncompatibleActionError(); + return hasDiscoverAccess && Boolean((embeddable as LensApi).canViewUnderlyingData$); + }, + subscribeToCompatibilityChanges: ( + { embeddable }: EmbeddableApiContext, + onChange: (isCompatible: boolean, action: Action) => void + ) => { + if (!typeof (embeddable as LensApi).canViewUnderlyingData$) + throw new IncompatibleActionError(); + return (embeddable as LensApi).canViewUnderlyingData$.subscribe((canViewUnderlyingData) => { + onChange(canViewUnderlyingData, actionDefinition); + }); + }, execute: async (context: EmbeddableApiContext) => { const { execute } = await getDiscoverHelpersAsync(); return execute({ ...context, locator, dataViews, hasDiscoverAccess }); }, - }); + }; + + return createAction(actionDefinition); +}; diff --git a/x-pack/plugins/lens/public/trigger_actions/open_in_discover_helpers.ts b/x-pack/plugins/lens/public/trigger_actions/open_in_discover_helpers.ts index 0276674767120..0a52ea6b4711f 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_in_discover_helpers.ts +++ b/x-pack/plugins/lens/public/trigger_actions/open_in_discover_helpers.ts @@ -31,10 +31,10 @@ type Context = EmbeddableApiContext & { timeFieldName?: string; }; -export async function isCompatible({ hasDiscoverAccess, embeddable }: Context) { +export function isCompatible({ hasDiscoverAccess, embeddable }: Context) { if (!hasDiscoverAccess) return false; try { - return isLensApi(embeddable) && (await embeddable.canViewUnderlyingData()); + return isLensApi(embeddable) && embeddable.canViewUnderlyingData$.getValue(); } catch (e) { // Fetching underlying data failed, log the error and behave as if the action is not compatible // eslint-disable-next-line no-console diff --git a/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx b/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx index 84f053aafcaf5..6091eccbe28ad 100644 --- a/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx +++ b/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx @@ -23,6 +23,8 @@ export function createVisToADJobAction( return { id: 'create-ml-ad-job-action', type: CREATE_LENS_VIS_TO_ML_AD_JOB_ACTION, + order: 8, + grouping: [{ id: 'ml', order: 3 }], getIconType(context): string { return 'machineLearningApp'; }, diff --git a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/use_actions.ts b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/use_actions.ts index cf24d50473467..21feb23a9ca9a 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/use_actions.ts +++ b/x-pack/plugins/observability_solution/exploratory_view/public/components/shared/exploratory_view/embeddable/use_actions.ts @@ -190,5 +190,6 @@ const getAddToCaseAction = ({ callback }: { callback: () => void }): Action => { return; }, order: 48, + grouping: [{ id: 'observability', order: 5 }], }; }; diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index e5fe67cbdf02f..ba2bbe3363512 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -5983,7 +5983,6 @@ "presentationPanel.contextMenu.ariaLabel": "Options de panneau", "presentationPanel.contextMenu.ariaLabelWithIndex": "Options pour le panneau {index}", "presentationPanel.contextMenu.ariaLabelWithTitle": "Options de panneau pour {title}", - "presentationPanel.contextMenu.loadingTitle": "Options", "presentationPanel.contextMenuTrigger.description": "Une nouvelle action sera ajoutée au menu contextuel du panneau", "presentationPanel.contextMenuTrigger.title": "Menu contextuel", "presentationPanel.emptyErrorMessage": "Erreur", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 0bd410f31c0b3..d930949694495 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -5737,7 +5737,6 @@ "presentationPanel.contextMenu.ariaLabel": "パネルオプション", "presentationPanel.contextMenu.ariaLabelWithIndex": "パネル{index}のオプション", "presentationPanel.contextMenu.ariaLabelWithTitle": "{title} のパネルオプション", - "presentationPanel.contextMenu.loadingTitle": "オプション", "presentationPanel.contextMenuTrigger.description": "新しいアクションがパネルのコンテキストメニューに追加されます", "presentationPanel.contextMenuTrigger.title": "コンテキストメニュー", "presentationPanel.emptyErrorMessage": "エラー", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 80e113dd341de..bdff2381e6fa9 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -5750,7 +5750,6 @@ "presentationPanel.contextMenu.ariaLabel": "面板选项", "presentationPanel.contextMenu.ariaLabelWithIndex": "面板 {index} 的选项", "presentationPanel.contextMenu.ariaLabelWithTitle": "{title} 的面板选项", - "presentationPanel.contextMenu.loadingTitle": "选项", "presentationPanel.contextMenuTrigger.description": "会将一个新操作添加到该面板的上下文菜单", "presentationPanel.contextMenuTrigger.title": "上下文菜单", "presentationPanel.emptyErrorMessage": "错误", diff --git a/x-pack/test/accessibility/apps/group1/dashboard_panel_options.ts b/x-pack/test/accessibility/apps/group1/dashboard_panel_options.ts index 92c558f17dadc..9ef299ca1cf2d 100644 --- a/x-pack/test/accessibility/apps/group1/dashboard_panel_options.ts +++ b/x-pack/test/accessibility/apps/group1/dashboard_panel_options.ts @@ -5,7 +5,6 @@ * 2.0. */ -import type { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { @@ -18,7 +17,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Failing: See https://github.com/elastic/kibana/issues/147667 describe.skip('Dashboard panel options a11y tests', () => { - let header: WebElementWrapper; + const title = '[Flights] Flight count'; before(async () => { await PageObjects.common.navigateToUrl('home', '/tutorial_directory/sampleData', { useActualUrl: true, @@ -28,7 +27,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.common.navigateToApp('dashboard'); await testSubjects.click('dashboardListingTitleLink-[Flights]-Global-Flight-Dashboard'); - header = await dashboardPanelActions.getPanelHeading('[Flights] Flight count'); }); after(async () => { @@ -40,13 +38,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // dashboard panel options in view mode it('dashboard panel - open menu', async () => { - await dashboardPanelActions.toggleContextMenu(header); + await dashboardPanelActions.toggleContextMenuByTitle(title); await a11y.testAppSnapshot(); - await dashboardPanelActions.toggleContextMenu(header); + await dashboardPanelActions.toggleContextMenuByTitle(title); }); it('dashboard panel - customize time range', async () => { - await dashboardPanelActions.toggleContextMenu(header); + await dashboardPanelActions.toggleContextMenuByTitle(title); await testSubjects.click('embeddablePanelAction-CUSTOM_TIME_RANGE'); await a11y.testAppSnapshot(); await testSubjects.click('cancelPerPanelTimeRangeButton'); @@ -79,21 +77,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await inspector.close(); }); - it('dashboard panel- more options in view mode', async () => { - await dashboardPanelActions.openContextMenuMorePanel(header); - await a11y.testAppSnapshot(); - }); - it('dashboard panel - maximize', async () => { - await dashboardPanelActions.openContextMenuMorePanel(header); await dashboardPanelActions.clickExpandPanelToggle(); await a11y.testAppSnapshot(); - await dashboardPanelActions.openContextMenuMorePanel(header); await dashboardPanelActions.clickExpandPanelToggle(); }); it('dashboard panel - copy to dashboard', async () => { - await dashboardPanelActions.openContextMenuMorePanel(header); + await dashboardPanelActions.openContextMenuByTitle(title); await testSubjects.click('embeddablePanelAction-copyToDashboard'); await a11y.testAppSnapshot(); await testSubjects.click('cancelCopyToButton'); @@ -103,14 +94,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('dashboard panel - clone panel', async () => { await testSubjects.click('dashboardEditMode'); - await dashboardPanelActions.toggleContextMenu(header); + await dashboardPanelActions.openContextMenuByTitle(title); await testSubjects.click('embeddablePanelAction-clonePanel'); await toasts.dismissAll(); await a11y.testAppSnapshot(); }); it('dashboard panel - edit panel title', async () => { - await dashboardPanelActions.toggleContextMenu(header); await dashboardPanelActions.customizePanel(); await a11y.testAppSnapshot(); await testSubjects.click('customEmbeddablePanelHideTitleSwitch'); @@ -120,8 +110,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('dashboard panel - Create drilldown panel', async () => { - await dashboardPanelActions.toggleContextMenu(header); - await testSubjects.click('embeddablePanelMore-mainMenu'); + await dashboardPanelActions.openContextMenuByTitle(title); await testSubjects.click('embeddablePanelAction-OPEN_FLYOUT_ADD_DRILLDOWN'); await a11y.testAppSnapshot(); await testSubjects.click('actionFactoryItem-DASHBOARD_TO_DASHBOARD_DRILLDOWN'); @@ -136,30 +125,16 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('dashboard panel - manage drilldown', async () => { - await dashboardPanelActions.toggleContextMenu(header); - await testSubjects.click('embeddablePanelMore-mainMenu'); + await dashboardPanelActions.openContextMenuByTitle(title); await testSubjects.click('embeddablePanelAction-OPEN_FLYOUT_EDIT_DRILLDOWN'); await a11y.testAppSnapshot(); await testSubjects.click('euiFlyoutCloseButton'); }); - it('dashboard panel - more options in edit view', async () => { - await dashboardPanelActions.openContextMenuMorePanel(header); - await a11y.testAppSnapshot(); - }); - it('dashboard panel - save to library', async () => { - await dashboardPanelActions.openContextMenuMorePanel(header); - await testSubjects.click('embeddablePanelAction-saveToLibrary'); + await dashboardPanelActions.legacySaveToLibrary('', title); await a11y.testAppSnapshot(); await testSubjects.click('saveCancelButton'); }); - - it('dashboard panel - replace panel', async () => { - await dashboardPanelActions.openContextMenuMorePanel(header); - await testSubjects.click('embeddablePanelAction-replacePanel'); - await a11y.testAppSnapshot(); - await testSubjects.click('euiFlyoutCloseButton'); - }); }); } diff --git a/x-pack/test/functional/apps/canvas/embeddables/lens.ts b/x-pack/test/functional/apps/canvas/embeddables/lens.ts index 2bd2ec820b6f3..ebd85a0ab2720 100644 --- a/x-pack/test/functional/apps/canvas/embeddables/lens.ts +++ b/x-pack/test/functional/apps/canvas/embeddables/lens.ts @@ -34,32 +34,8 @@ export default function canvasLensTest({ getService, getPageObjects }: FtrProvid await kibanaServer.savedObjects.cleanStandardList(); }); - describe('by-reference', () => { - it('adds existing lens embeddable from the visualize library', async () => { - await canvas.clickAddFromLibrary(); - await dashboardAddPanel.addEmbeddable('Artistpreviouslyknownaslens', 'lens'); - await testSubjects.existOrFail('embeddablePanelHeading-Artistpreviouslyknownaslens'); - }); - - it('edits lens by-reference embeddable', async () => { - await dashboardPanelActions.editPanelByTitle('Artistpreviouslyknownaslens'); - await lens.save('Artistpreviouslyknownaslens v2', false, true); - await testSubjects.existOrFail('embeddablePanelHeading-Artistpreviouslyknownaslensv2'); - }); - - it('renders lens visualization using savedLens expression', async () => { - // load test workpad - await canvas.goToListingPage(); - await canvas.loadFirstWorkpad('Test Workpad'); - await header.waitUntilLoadingHasFinished(); - - await lens.assertLegacyMetric('Maximum of bytes', '16,788'); - }); - }); - describe('by-value', () => { it('creates new lens embeddable', async () => { - await canvas.addNewPage(); await canvas.createNewVis('lens'); await lens.goToTimeRange(); await lens.configureDimension({ @@ -79,8 +55,6 @@ export default function canvasLensTest({ getService, getPageObjects }: FtrProvid it('edits lens by-value embeddable', async () => { await header.waitUntilLoadingHasFinished(); - const panelHeader = await testSubjects.find('embeddablePanelHeading-'); - await dashboardPanelActions.openContextMenu(panelHeader); await dashboardPanelActions.clickEdit(); await lens.saveAndReturn(); await header.waitUntilLoadingHasFinished(); @@ -88,8 +62,34 @@ export default function canvasLensTest({ getService, getPageObjects }: FtrProvid }); }); + describe('by-reference', () => { + it('adds existing lens embeddable from the visualize library', async () => { + await canvas.goToListingPageViaBreadcrumbs(); + await canvas.createNewWorkpad(); + await canvas.clickAddFromLibrary(); + await dashboardAddPanel.addEmbeddable('Artistpreviouslyknownaslens', 'lens'); + await testSubjects.existOrFail('embeddablePanelHeading-Artistpreviouslyknownaslens'); + }); + + it('edits lens by-reference embeddable', async () => { + await dashboardPanelActions.editPanelByTitle('Artistpreviouslyknownaslens'); + await lens.save('Artistpreviouslyknownaslens v2', false, true); + await testSubjects.existOrFail('embeddablePanelHeading-Artistpreviouslyknownaslensv2'); + }); + + it('renders lens visualization using savedLens expression', async () => { + // load test workpad + await canvas.goToListingPage(); + await canvas.loadFirstWorkpad('Test Workpad'); + await header.waitUntilLoadingHasFinished(); + + await lens.assertLegacyMetric('Maximum of bytes', '16,788'); + }); + }); + describe('switch page smoke test', () => { it('loads embeddables on page change', async () => { + await canvas.addNewPage(); await canvas.goToPreviousPage(); await header.waitUntilLoadingHasFinished(); await lens.assertLegacyMetric('Maximum of bytes', '16,788'); diff --git a/x-pack/test/functional/apps/canvas/embeddables/maps.ts b/x-pack/test/functional/apps/canvas/embeddables/maps.ts index 2a63c4f64b57a..ac6a861e9796e 100644 --- a/x-pack/test/functional/apps/canvas/embeddables/maps.ts +++ b/x-pack/test/functional/apps/canvas/embeddables/maps.ts @@ -36,7 +36,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('edits map by-value embeddable', async () => { const originalEmbeddableCount = await canvas.getEmbeddableCount(); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickEdit(); await maps.saveMap('canvas test map'); const embeddableCount = await canvas.getEmbeddableCount(); diff --git a/x-pack/test/functional/apps/canvas/embeddables/visualization.ts b/x-pack/test/functional/apps/canvas/embeddables/visualization.ts index 9cb0d55371f72..7de1ef28a43a1 100644 --- a/x-pack/test/functional/apps/canvas/embeddables/visualization.ts +++ b/x-pack/test/functional/apps/canvas/embeddables/visualization.ts @@ -71,7 +71,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('edits tsvb by-value embeddable', async () => { const originalEmbeddableCount = await canvas.getEmbeddableCount(); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickEdit(); await visualize.saveVisualizationAndReturn(); await retry.try(async () => { @@ -93,7 +92,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('edits vega by-value embeddable', async () => { const originalEmbeddableCount = await canvas.getEmbeddableCount(); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickEdit(); await visualize.saveVisualizationAndReturn(); await retry.try(async () => { diff --git a/x-pack/test/functional/apps/dashboard/group2/dashboard_lens_by_value.ts b/x-pack/test/functional/apps/dashboard/group2/dashboard_lens_by_value.ts index 3e648f5000945..a974eb8c1284b 100644 --- a/x-pack/test/functional/apps/dashboard/group2/dashboard_lens_by_value.ts +++ b/x-pack/test/functional/apps/dashboard/group2/dashboard_lens_by_value.ts @@ -47,7 +47,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('edits to a by value lens panel are properly applied', async () => { await dashboard.waitForRenderComplete(); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickEdit(); await lens.switchToVisualization('pie'); await lens.saveAndReturn(); @@ -60,7 +59,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('editing and saving a lens by value panel retains number of panels', async () => { const originalPanelCount = await dashboard.getPanelCount(); await dashboard.waitForRenderComplete(); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickEdit(); await lens.switchToVisualization('treemap'); await lens.saveAndReturn(); @@ -73,7 +71,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const newTitle = 'look out library, here I come!'; const originalPanelCount = await dashboard.getPanelCount(); await dashboard.waitForRenderComplete(); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickEdit(); await lens.save(newTitle, false, true); await dashboard.waitForRenderComplete(); diff --git a/x-pack/test/functional/apps/dashboard/group2/dashboard_maps_by_value.ts b/x-pack/test/functional/apps/dashboard/group2/dashboard_maps_by_value.ts index a55c3c3c0433c..4c890b41e0612 100644 --- a/x-pack/test/functional/apps/dashboard/group2/dashboard_maps_by_value.ts +++ b/x-pack/test/functional/apps/dashboard/group2/dashboard_maps_by_value.ts @@ -42,7 +42,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await dashboard.switchToEditMode(); } - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickEdit(); await maps.clickAddLayer(); await maps.selectLayerGroupCard(); diff --git a/x-pack/test/functional/apps/dashboard/group2/panel_titles.ts b/x-pack/test/functional/apps/dashboard/group2/panel_titles.ts index c3d5bfce6e621..7d8456a9e81a8 100644 --- a/x-pack/test/functional/apps/dashboard/group2/panel_titles.ts +++ b/x-pack/test/functional/apps/dashboard/group2/panel_titles.ts @@ -17,7 +17,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const { dashboard, lens } = getPageObjects(['dashboard', 'lens']); - const EMPTY_TITLE = '[No Title]'; + const EMPTY_TITLE = undefined; describe('panel titles', () => { before(async () => { @@ -112,7 +112,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('resetting description on a by reference panel sets it to the library title', async () => { - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.navigateToEditorFromFlyout(); // legacySaveToLibrary UI cannot set description await lens.save( diff --git a/x-pack/test/functional/apps/dashboard/group3/drilldowns/explore_data_panel_action.ts b/x-pack/test/functional/apps/dashboard/group3/drilldowns/explore_data_panel_action.ts index ca6f23d09e375..050483c98ac7b 100644 --- a/x-pack/test/functional/apps/dashboard/group3/drilldowns/explore_data_panel_action.ts +++ b/x-pack/test/functional/apps/dashboard/group3/drilldowns/explore_data_panel_action.ts @@ -50,11 +50,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('action exists in panel context menu', async () => { await dashboard.loadSavedDashboard(drilldowns.DASHBOARD_WITH_PIE_CHART_NAME); - await panelActions.openContextMenu(); - await testSubjects.existOrFail(ACTION_TEST_SUBJ); + await panelActions.expectExistsPanelAction(ACTION_TEST_SUBJ); }); it('is a link element', async () => { + await panelActions.openContextMenuByTitle('Visualization PieChart'); const actionElement = await testSubjects.find(ACTION_TEST_SUBJ); const tag = await actionElement.getTagName(); @@ -87,8 +87,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { exitFromEditMode: true, }); - await panelActions.openContextMenu(); - await testSubjects.clickWhenNotDisabledWithoutRetry(ACTION_TEST_SUBJ); + await panelActions.clickPanelAction(ACTION_TEST_SUBJ); await discover.waitForDiscoverAppOnScreen(); const text = await timePicker.getShowDatesButtonText(); diff --git a/x-pack/test/functional/apps/dashboard/group3/reporting/download_csv.ts b/x-pack/test/functional/apps/dashboard/group3/reporting/download_csv.ts index 2cf3f91c6a38e..ea2a66028ada5 100644 --- a/x-pack/test/functional/apps/dashboard/group3/reporting/download_csv.ts +++ b/x-pack/test/functional/apps/dashboard/group3/reporting/download_csv.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import { WebElementWrapper } from '@kbn/ftr-common-functional-ui-services'; import { FtrProviderContext } from '../../../../ftr_provider_context'; export default function ({ getService, getPageObjects }: FtrProviderContext) { @@ -17,7 +18,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const reportingService = getService('reporting'); const dashboardAddPanel = getService('dashboardAddPanel'); const filterBar = getService('filterBar'); - const find = getService('find'); const retry = getService('retry'); const toasts = getService('toasts'); const { reporting, common, dashboard, timePicker } = getPageObjects([ @@ -45,14 +45,21 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return res.text; }; - const clickActionsMenu = async (headingTestSubj: string) => { - const savedSearchPanel = await testSubjects.find('embeddablePanelHeading-' + headingTestSubj); - await dashboardPanelActions.toggleContextMenu(savedSearchPanel); + const clickDownloadCsv = async (wrapper?: WebElementWrapper) => { + log.debug('click "Generate CSV"'); + await dashboardPanelActions.clickPanelAction( + 'embeddablePanelAction-generateCsvReport', + wrapper + ); + await testSubjects.existOrFail('csvReportStarted'); // validate toast panel }; - const clickDownloadCsv = async () => { - log.debug('click "Generate CSV"'); - await dashboardPanelActions.clickContextMenuItem('embeddablePanelAction-generateCsvReport'); + const clickDownloadCsvByTitle = async (title?: string) => { + log.debug(`click "Generate CSV" on "${title}"`); + await dashboardPanelActions.clickPanelActionByTitle( + 'embeddablePanelAction-generateCsvReport', + title + ); await testSubjects.existOrFail('csvReportStarted'); // validate toast panel }; @@ -82,8 +89,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('Generate CSV export of a saved search panel', async function () { await dashboard.loadSavedDashboard('Ecom Dashboard - 3 Day Period'); - await clickActionsMenu('EcommerceData'); - await clickDownloadCsv(); + await clickDownloadCsvByTitle('EcommerceData'); const csvFile = await getCsvReportData(); expect(csvFile.length).to.be(76137); @@ -95,9 +101,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // add a filter await filterBar.addFilter({ field: 'category', operation: 'is', value: `Men's Shoes` }); - - await clickActionsMenu('EcommerceData'); - await clickDownloadCsv(); + await clickDownloadCsvByTitle('EcommerceData'); const csvFile = await getCsvReportData(); expect(csvFile.length).to.be(17106); @@ -106,9 +110,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('Downloads a saved search panel with a custom time range that does not intersect with dashboard time range', async function () { await dashboard.loadSavedDashboard('Ecom Dashboard - 3 Day Period - custom time range'); - - await clickActionsMenu('EcommerceData'); - await clickDownloadCsv(); + await clickDownloadCsvByTitle('EcommerceData'); const csvFile = await getCsvReportData(); expect(csvFile.length).to.be(23277); @@ -117,12 +119,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('Gets the correct filename if panel titles are hidden', async () => { await dashboard.loadSavedDashboard('Ecom Dashboard Hidden Panel Titles'); - const savedSearchPanel = await find.byCssSelector( - '[data-test-embeddable-id="94eab06f-60ac-4a85-b771-3a8ed475c9bb"]' + const savedSearchPanel = await dashboardPanelActions.getPanelWrapperById( + '94eab06f-60ac-4a85-b771-3a8ed475c9bb' ); // panel title is hidden - await dashboardPanelActions.toggleContextMenu(savedSearchPanel); - await clickDownloadCsv(); + await clickDownloadCsv(savedSearchPanel); await testSubjects.existOrFail('csvReportStarted'); const csvFile = await getCsvReportData(); @@ -158,8 +159,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('Downloads filtered Discover saved search report', async () => { - await clickActionsMenu(TEST_SEARCH_TITLE.replace(/ /g, '')); - await clickDownloadCsv(); + await clickDownloadCsvByTitle(TEST_SEARCH_TITLE); const csvFile = await getCsvReportData(); expect(csvFile.length).to.be(2446); @@ -196,8 +196,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('Generate CSV export of a saved search panel', async () => { - await clickActionsMenu('namessearch'); - await clickDownloadCsv(); + await clickDownloadCsvByTitle('namessearch'); const csvFile = await getCsvReportData(); expect(csvFile.length).to.be(166); diff --git a/x-pack/test/functional/apps/dashboard/group3/reporting/reports/baseline/sample_data_ecommerce_76.png b/x-pack/test/functional/apps/dashboard/group3/reporting/reports/baseline/sample_data_ecommerce_76.png index 1ce272bd4a86fab78b3a7c093ab16a7a074e7288..e188f1c6f4c1cbb1a09e70c27dbf55f6b13936ed 100644 GIT binary patch literal 1209040 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 ?VuPdt7S{ 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 - } - description={ -

- {i18n.translate( - 'xpack.observabilityAiAssistantManagement.settingsPage.showAIAssistantDescriptionLabel', - { - defaultMessage: - 'Toggle the AI Assistant button and Contextual Insights on or off in Observability apps by checking or unchecking the AI Assistant feature in Spaces > > Features.', - ignoreTag: true, - } - )} -

- } - > - - - {i18n.translate( - 'xpack.observabilityAiAssistantManagement.settingsPage.goToFeatureControlsButtonLabel', - { defaultMessage: 'Go to Spaces' } - )} - - - + {config.spacesEnabled && ( + + {i18n.translate( + 'xpack.observabilityAiAssistantManagement.settingsPage.showAIAssistantButtonLabel', + { + defaultMessage: + 'Show AI Assistant button and Contextual Insights in Observability apps', + } + )} +
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 z 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 z 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%0AvjwlLR4Sa$di;3Db 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%0AWGFoPM~+B{$*vVpwc=TV!^ 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%0Dw zsuD15!GuNgDq!Dj-N$@OGk9|GzM(gVR((*atT`mOPeg(%&ORnYw;;c4YjRSz(_q+- z2-e3t1*vQog)?kvh~~{-G7kUzz4g3v3PqZA9D2O7J09R~5ESh%u{l!Lm^54bl}ACr zVl$o>45}qj|Cv}gbB_%JC};kd_ zN%!AOlU^ge=gN)zzgfNOA}+I25Jq~h&O7WG`s1sgwe?@RWuz`@eB8PA&>Gpr>TUHy z`|sy@Ib#VeHE5iqKAF|8rzAR*I1QezXRzRgpb9$}V2lRGiK9v556&sQ6b1jc`t~s* z4YLyfe?=xbjvyvvz`hsd-ZOgpv2G9`?Bu3sU(Gp^VQOhR#{2hZ-?MCk$SqwM{5B8JxCMYb?)=7(^vg)C}xnl z`7k8!m*oW+hYn%}(oW&@?|Z0mC5%SNg$t&h#}5Q3DUd>}`Q=}DbDvDu0&xETe^%9? zj7dp{yCP=3=WxBlk{UFH6%rH?vC;Lh3G82mv@}cA2o8pS_)f@sF<2WCj}}(xD&Z2? zkIE~6Nj3@=YKQ0DsU7O?j&^Y?Bt2!VdIEx_GV{@q;?a1~8l!cHwH?eNlS1StDYB~s z!xi*&4H&S7Y)1rcDf;cM3x>@&*pzkxS;vF0{$QG1AZd>0_U3Mqmw~-76-5;C>GO}U z>4eoo?9+H8KhK81C4_41~lasOGz%L-qBE$)InZl4KNAkq>XWa^m z`P!=_WOxnM=2NAJhvsY7X7IoVJbV`%oJA$~{&@wp46pn>*O5Imt5AoHbpl{AU;|lhK!-_ry^xu~G=-TxEa{=HUxKVPgxrDub3*|DoH(T9D+!1Yh5}( zfXOKhi2(y!TPmtSE|JnXr3wk*Z73>2$jFrQ&g z#8!G>xG}NP%#StIKUG`#XdzW3d`ANHD9`Sot3#!AU10&)-7Ph>0K)->hur2Su5>)S7!ENZ3uH)I2+xcdhaID~WI}e&es9JTC7n9W zb06Z<4z`kb0e|sIFl?5nkutT~HHT}y0m*Cjm<@63#QN*b_}H4!b}?dc1_yVHZOvo}yX(lLsG~0wOHUHhNN4tjkuts}#NY5> z>1KS|8@}kl0=v%d4|74Qx0V@h1&wb^bPf2|%a?V0C02~Y@`HO|#xZncMrRt=i5g&l z=W65#j(Nh&(I8TNJ4nI*q*q`PH3g1uvpemN2e;tQFbbsH3K~nOluD=QLw#e3*SYtc zpPtEha76gAz7Ig!6l_gp;-Ruk_ zNN8nNBLH2g4C_40CT8klco;g$^mAP0Txn=%G4mg=j=J(35XQ>LISD50wjC`0cLQ(8 zXrzcCnrhHh+7YA6G z_mT%+jEAz|7Xb;#VFjoZCl9n_WVJ*Fn1k#%Im9Tu620SFlcOdk6?P-mNU&=}4UdhD z_R=5XC!6HlD~buyv!kDn5JW7NEy%}hSNb#_YnJB@ueuiS?#EqowF!4F*t!KCV)9s# ztv%S;6U?2+{d8fs>wW>jKK33k!t(;61^F;{Lvp!H_6(3Wp z$QtRjCC!QLgy3C^cyCp0jTIZcnt5cSa2T8|&}i{wv52PQx3c8U_GD=3b}4u@IZU){ zcekK|oj&Fnt-waGLKqY_-;}eQu`RoZG2owS^4Y|~J_27q8-N$8#lNMu_}#V<0OZYy zIlg0x-7Uzy6J~>2;!(O`);EFtZ%w29K{qzw3H}9fD29*4?taw)1l6gAyeXjkNj`iC8G!)byJQ{o<)-;F)8294Ol_|Nf(%9d-Y!RIJ{!&=oa)4TP81oFK)4{G6HduX9( zp{%@s45-OJQLvxHiG&+6NrnO zBwX}oVM(gQ)Ajb_#s$4j$Gszj^*7&S>Al35o(^W(swLfYnx?r<(=8*NBPN=9@85VPT^WX#{AEIZiGcSs#Dbvv(9q zVaPye*jLCsTgHxg4-tbfd~2S6kSI8ZvT5O8EDU?;tZ1FZbqM4v&)3I$2!ZsRdmLG!6qapjuF76t1dv_G1_jtxpzEe5J?cpQZ&l=e-Y`;n=w%yjy!rC%vZ=UT7Uio!@H7`7OVBo zm1uTrHGcfkxTlgRP%N7pZqw~$pSyeboRq}n-LZ$0+O1$>-s_X%^5qMKf9;r=>R_3B zV8j3>N2W{Jk&$+Mydf%l?^ccA#76CEuKjD9;hI$HNV zSS$J%r-%%_dA8Q}_ALL##lt~0LP|18sfPK$H`g0bi5u|cp$t<={P*oC)Kv58!r7tK-S2zhg(_oigxt}}0Ih5W=d@^Ow8%a>v|fqgw$rnq`!SFRt8d9BrcKhFRg4Lt#ncM)fks=DZ!w!1?iL$& zScVj@liAHKymHIYm)%R1oqJxtrnF99Yx&suf05A&GeA8~{`4`M{*?iY+^S<4(@fuQT~64-H~=>$nUuhR=1H=)T84bW z?uD@|3pl0Wc5V2K8PRg!z4M_SRtO6l`Pz1IP6fZnSm!Ay1mT^htd+LB-Nxejm$_8N zwWa3j;ytA>9l6sL_^Buc29WrICAN34A~9fo#E>FL zYJd93P8HAPc^%$wr0I!?2@3_m|31)pwRVp7Jz9f)KSoAeSXkIO4VLHa=$`4-*gw`< z--e~Vw}~h`6f(n<4jh><_fwn}(mS;!R-w;P-PzPOPPK!2;hNA~Is5& zxhy+E=Ce@=9oa?tSw$DB$7+B0bG*=o{^xtvV$qzf<_CQM58r_&+g3>&2bWg~uVYE4 zW!~d)RxeSix%k`ec}QHOU*CMZvGxOfBEOxdpg_#l8;85rrx6k>?w6?_1N?f=dXgKqoJNPU zgfw$27ceoQ>8Wo;=RFex&7S1Yh@Sei^QymYx-QzQom1vAZ>Y+O`qkwZ0zl-5lOuSLb-M&JmJU_h>k_2M-9=xAk!tT-5)y>Bud#eW;i;sI1*|0i=m~<>|fk(d|5cU z3R8ZXcPs@5e^{ac3d=I{&ld=bMA@`tElmpIpZ3z-|B$_ z70Le$oP1x0*DwJ4(B$6SreOS~O^*P1DD8DyC1e5*Ire=hlA zvHYrpCys1b1Y0XSMH7!U?U{9GvV2#B=qkP_j3t%YWYmR-M632`JT~+}sW3CK0cVzs zatscc%B{?$jAlOAK;&JB<;S8FNqmQsrRUCfohXZq*XpxP>Eh0G(v4ccDL_~UB-e4Vl1 z{@dL#cyG!)_x?q^nqFw*v{J$xT8ix{V$WBi)mrh~a03temg`e{hr!G^GN3?HdUl2} zSg{*w@#{EW2aX`oyY*>~ta+;Ri)*379z2t7M`E^(I3hLXD2S38JR_1h-)NcZ*}A@U z{gN)4JZ3+1&paj_2E+uF(V+bWQFmF~Temx)c=|63PdJWOWDdPfx2l!|>^~ z5DhB`;v^5^OzW~7b?JYx#CTb0 zX=zaY2}Tl{79DaW#P|-NW}n2e>fo6ygW!{9iqG{dXz$>oOADmQJiZ1v6eyNUcH58> z$#AdLYVds;QPQfL>Wca0d>6fMq8%+xVx9wHHWA9 zkSko`FD{W*o-8~(o;Sl%Ad*&mlxCJpn{{TZItc zuKjL0t`ZfenytrGRN1toEoGBs@ikirY6+TAICf*j@D?LM+hS*`2M&3Mq0+mCRVX_( zez=mEo!B?RnM~}!+xOa%d^R>$u$`Vqsyc)Xzf*B}dPsxSd2%CAI(LoOTY?N6IjIVx zm$(AMd_LmXC_C0&NV@LCTc4x)9B+@txMc^qd2gQ?6%M?Oy*0nwbuQD$XLd*!QAW5E z$loK{Y2)lf>aiZ088P3-2>eb*%S`|g?`fj_1TE!$IaW95J2!XEUt@EOoha5l{d7Jj zd|5B)0_6p}yLLWhw-fw-77Ej>yl33m+730w&Bo-6xZnR?g#w00E_)1@4JOZ)bg?7G z7cjALmo~UpG7`lQYLJ1WdIbnt0Y9lT{>0e`;2$xhIbN51e9FUpI6lZsmz321<3QM$ zF4@TQkJruenva*2`)w>bSXvb;)f|cBIge#gCQqrP{MTGT;~Q~*$mY_|J!4msADUiCU_erdXmFPsNaAol;AUel#_5?yr?5b3^2b zG2G>PY)WJ^mOQ@B3wz~6w#`iF(e#PDc<+{#sqbp&pUzt5KMVw~?L!A3j*xfrrq*6q z0E_i)R04K-;>sG|j*m&+hmgYu;Q%z!;)+tXcwoE$>>jw{OLZ_6Y#rlVVoU!-rJGu+2MCxYedQMT4n#UGb-p3QX{BNo6 zRy2LD$ru<{p7c&|8%c^`BJ^kU{_-uK@r|3Lhe>dGht_SJ~A=V zq!rWNUJw$((Jm*VShv>p^S7S7pxHs_=|spBr4fGuX{baom#GMZ;3JV!I>Tc`#L~~< z9xyVL60Kd22r;-NTu=YaT`}J#{pK53${ky+tRkDg&qD#vpBE3(^o``gHd~SdXaQhw zZYSM7fn#Ea9~Nj4cMK`3{J#m5S9XY{JHS=HjXTeNN=wHee(}xu+n6H)@GtvKZyuqO zo?`1;%d5_YPb7j{c*JK7izWv@ZI`5nMZ0q3qjvMom~9ND%1(Yv+u;R;P#K^m>zNR^ zmYZ<^(R5S*6wCl=4@>%WWcf{cwCE@9Bi{Ert_3;?yw=be(S$%+o7*;qqCS~S?00!5 z2KfDfZz>R}P~muuu6q6!7~o`7h{D&1L%0T!Suj7{89q+DHYVlQcHrkp)X`vc^QCQO z#8&1iWUaa^Ipvr{VIdD6A@J&zG5S%eG7PmF_I@74wxqFLy)2HC9r+vM{{FMCp8{hE zP6HZYTLv9A@M*2LS$_$x+F9-~3~lEmC>^;lx%`xuKtEVd@^T(sBgSC7#l|X>=K=o$%UhxGj&f zxEBs=_&8M^hkEU#yl>VvtLi*my(`r%w2(%OQ`<5goH!`RTM=!6F}iSjJsNLqMC)g# zlBi`Y5ll_29vfQFa#RUCWB({nQ?Bcai~c*oT0Vnh;$`tox&0d8ztq`^Y0mx-G!iwF zA}o6eO+3nk@^)DFjlx?ng{&P zKfY{%cUQ7>{@l;wBk3`!7h%~^XgxaxV|B1O-NGnQBBPetHnWmgt|g1;&#GmJCu@(6wKiW=8ck`oq#hxV5wOu`}@{c8J0`oHJp#kxt6{tGm*ep)Q0 zq>|b2poRo>6x+w!M4vZR>>14H@Qmb2R{na%hfX98&oim8k;fVh!n%jSwTH zAR9LdiMD_IAou1CTiEquQwLvkiU$w`ADma+2doWAa#Ep2?_Ehc5YQ?(PAl2x)NtRw zleb`_D-g0`KEiTD2F%Rc)ym7};K~rZSlRk?OkPdeIFP)Eeocl$Z4N^spd3-(uPC7# z=6zuPC=QTP|9>>SV|1MD_clC9)3~v18%@&Kwr$(CZQG5l#3Q{N$A6`?8*ZP=ao{k-&XEo!c8@D!Fcn&?h%p-Z{#v43Ip6)*UX0nv3OIlK;lIlJY|L6C@?)cwHem<6_-1^Il;qGa2i)qXQZ?>cm z>eM9vR-{R-PZ<)mi|W?Q=_^_Ored==EuAUkg}>vzi=wK;h<;s-+K4xv{mcL8ugdW1 zHc7SD_R;=e?{@_IX{|l`ORF>uL;Jsm01Bw4Q`XkjmuwI&SLS~|=+E0yOqBwtZAc0* z5M-B0g{R-Lw=4L=Avoyga?}~eh}#mz<72$KIy(7g^|IB1mFm$<8*a>c)W`&FatZIE z%ZJZvgK=!#1MSRGkdUD3AMENHhKUIl%FTgbA=|%uy8Ywcf&K3Yk~jZX6kwn}l8pA% zK_U9^^7It3ZJP@_zApQdo#SbxkK!fgRG)-G8?aglNm^O%@0_HZI&$5@LknmyMx=QUiZCPnv z%okiYs2ftiSvz*<{wY!BRH$D4q}Ti&cIH?=*&24AEhl-L0?~G8$Qa}CoYII$1%t6i z*FFer>Y-t(+8Ls`N;CsA99!8txnAFc$PtAYEewj4<9uc?>jEX@n(ks3FIEWe9$V3b z7%;K0p7Ac_DCPD)J+T3?eGKW`4&KC)d+V{a#^N}htpZ6V%EqEZNSE!b?fGq71??(o zXbwQ)$yTBPRbyubjpbHFlXYWwW5C=oYL4 z3jl-#8*Q(T=e2Redv7FweTvD36Ya1IJC2as?Z!x2U;lGDy9Urx&s#LpNF%TR|5||h zf`a;bB+gC!Mk*~iHv~}o=4E6g3=zN^$pWMDlIOklJGGlv?V2&~vyP!@v1zc_pCBQK z6d^wCIpKkem}*BoOF?tAB<`t^*1|viYCm5`Ipl5b>5@omI|s|gjmky`BZg0y8sbB+ zK2o;61N)vjo_=-Pgh*~#Y32E37f6kBp}3(j*7>0!|CqYw=pUz->~R+?963nnV_xGd z<^}rzORKis)D4A7O{-k9u35A8{d;=|CSUzujaats|2xmBJS`s`%w7G%{a{|^TqgN@ zM*aQ{`EJCRtrJ1FjL5FMFI4(^Revb6i*AWFP`I>k>rs2yo1no~r-q!00#!r-frYh! zUd^%M_E|ik={mXsy;G6c-hx%0-y9T_HbhPZz?zqXK3lE3;&1z|5 zkwAqGPrg~YPr2A-COS3RKVxxRXD1e*L#sveYO=kwoynf2Z4h#I16S@K zll{5}5J*K819l{yK<9xw;b7?hVU8}PlUw?nXwj4)&~R~oD@P9hQ}Mk2lR?HKq zFf46>YAj?G8{bNIyE-Yz$Z#I_QtEo2iGg8L|LhRAW4obsuN9m%vzW32b}IeH?!r*m zC34z#pEWI{Fh#~JSR!{UY7;;bL_nLn%1c?w2L}c!cU36ClhAx2m(ZtdKfy)>nV8>> z<3~lGTP;@#I<#nIo{jBU3N@gGAc2nW#krr-Y$eYH#p9_t&as;Q^%xD1Ack=_Q%H_$!i=wxt=`{R#Z-}$C=wG zXtvCRtU`^J9p@_u7zuz0exA*DcOZ09ogsU=43#o2nQYv-f4kE?Ua0W;^*uM&eb_G@ z;2tVazOiEZ@iB19*sJ+`)Zu*WgqEFdV&l%P!akJ9n^sW$zV|dTfU7;AMTS3?mxumj zk)jjT;fL(U@j}kbl#%{7!bPWGYR6=6-7#q6g#ZVFcYpQFQ?>lL+>;liztO-K81n&{ ziS{DXbeqgL^A)Zvyz?n;e8dpNqC|YB9?pt|02&_S@DjCE-oN9LP>=gTzqi#|_MIA{ zDG!BYPgcJ4o4-9EgJ&b&2k4nnmh(R2xZbzwe~a~V zbV4hiHrXWG+V4O*_j>(3h^7W_4;oZZ^1D{@si<~7upb6nGN*HnVQXXE?cA9t8v&P$ z9RM5v$iW*cDFB>x+%&Yw^&nO9-vrqji(JpbH$Ugn$wLZsE8qS7(*ejnT-Xib9|ydj zzK^*2@w4z1hb0$&#LqGT{aBEn&x>&J?ckBO@BO>wJ#8);4wA3DGwZ}YkLO}$Ehw&z zsGx%^^iH_u4zp03MS8sLUIcwEqv!aa_8CQhQo)DhgjPHu?cL~i%+=Jf-PtzD)~rw-u?GChIGnA10aP%Nls>3YwE=#2P~lWGO_7s z9YqBNaLE^xRZ4jJyTk8&^u@?kwQ9+(X{M2e<1}lz^32d3OQ66&8se4i z=R^d?4NE2sK^w-jXxTbDH|a3&`|k!#vfH+8;Ns${ueKS2em5A41A{9wH1_2f=3xEO|6@=su5K`Ig>Z`CY9)_AES) zJVMsJn^pD>avwz%naCc3h?J>*Z7$NtZM26&6_T3@EtPp>Q@bOv;c5^DX>tUcYD1YX zstn*3Yks(WIpm(MDlIz?1((wIBOV^XzQSzxsc|!8Hm`ib#fZ88iqepBrLhucEhEsI z+7zX*-yfQktlG))-w@mL@NzTC-|$D0nfe`nOGPGzOvF%bEX>dsT8ajaHumKA6$?`I zY&Q!9=lOg*hVP!dm1y%f=w}WZcOpp=?)WRKo!rvm-R9qnx=+tf>U`e!+Wu~@%l>D* zPwOI&(;X)b4qA*cpaO+)z8i8w`K8v|MSxioX2#4v zs)pW%UPHKd_~y`Xm@&tbytMxZ_IHgcGHCM3J|!YUSvmjA!NUcC#6ol=Y1pY+X9Q-C z;btBD(R^-9M*y`pLh?XIN%~d@Bj0ZHV1<22yWm$*lM`wXbR@ld#`C!Tv0KjEa_$mN zlQe7Uuv+ONq5BIev0`x=%B05pf>9Nv3qKrotRrFL$vB%z6WkyX^k@TP6qo>MxDe`6 z4S9LfMo+7nopcS|!lUDq!wP~X#@guvvR8MR=Vx5r*8FLu&}E_q9auoIOOB}qpu?h7 zo?7vyNWMJY4O4j$`E9HApWHA}q8@Ngb8pFSTLG|;u*v`YL zB_);}oz1iNzgx1TVPaKb1fDGHRt<%ESA+{41Ce;#UD!(|RAvWFYvh z8+z{vD|PcDt9U=6-dfLj@z$Rs%|^J7j-95E#9hRj$Ah6eg%QzN$r%LOJe}u}{R)fB zHyqr2Lt#bRD>kyy0qQRmaL&>5IpuM&RSb_ zJuR@#;Fiu?qIxv_Fi}AcDaRt)CsM!creJXB&$%pL`>s+V+m(m*VmkpbvuCiUSB^Z< zAs!4m9DUJB|MIp>?A?>PUyxT538lPtC;#o8xH?(DaDh+x;q{_tP@Wb4(`#*1E=I8E zFFqRrM2AzYI(1A;?q9#edGbI8W6iZMp_&@?W8=fU!Q(w+&hx{=(;kh>5;0)Q-O%!A zDq(cmvaVV^tQ)A3Xa9HiZvaV)KWGkKZKtbiS$qjF*uX{oe9_z<#sm_zHHcn2dO@HG z8z_*QaSJ#XBo|2JrMAAm*B)GKDW@ zk+FTQxjP=-RL>bTT1{V#qRXp9W52Vm6GrVSGUD79MdmTc4)~X0%q$HkqgyZjs7}33 z!i@sIvERbnRY3?!6-Gs64K&EO6}o;2q7x!5W{9U`Vmr^tyea!V0uG{}Fvkj0wN{}y ztgLvs%$pDWK&t>0fJ*i-!GhWO>AG53ldf36e}_dMPESc%w8l-hrKRz%{7)0KO4+bn zG&RqVt)AWs*EAVHiV68map~m)H5>0b%EKN(nc27UT$^-4bkXg1TL)gVDpXV*L5*6g3YISKV(zu1i#Az^FXrZ%rYzXxq%B%C{qqtIXio}OGs#{lS= zm5m6TEp&Q&x@75-vSrW7d8T_<1wB0<@x6DYVPTLrTeU#H#)*JH4N5y7%^RPkMde~% z*1kv>FR#x$5BHUE;g$zFDahkSO~EzmVpN=2M_rb zH^PPx0-a_r%{vaZv|7YuCrY{Yg)g1Ei4`Mg=m$T(&Q<`O5bJ;$@V^DX|TE_7^s6BTq#L5Sh4^(uSXBp zoa%|e!iy_Xd&^#=9dO!T}qV`MEA`Hf_)ZzI49qAhtmf;vAf&*we{vncJPoC z!I*&y723RoO0VD9%lLlhfs>V!)5?XMpP92kz&nDAX_5#QQ(vZ*N5w54$IjRGJV#rG zMrNpCz%`(MH=ry%C9Vm7-d)NWoMcTwpk^m8tp)XeWPm3u-2})PT9-nVVu^p}xf+g_E!>D5S9++^-K7zj}10A%LMP}uW|^cls1H}!(IWTI~MhNDv3 zeu=2GX7f_+__2=HpHniO{^6MY@jbFHt?_)Wi$1*A5YCCuxt1)AFpo?E@4wp2R(C6q z^pOH(hs>_Fh9XR1q{JoyN)FIO=Nlimq~sKxI%0~bI&zYfS)}B~sWWxt6w%1jCncP6 z31gS7zysE}2!$+KVw+nY4P(m7yU`E70?TPxo3;kSacCxP!3x^P_;~iiopksCIO+`xYyjc1SS0k+Zl9$d@)z&PSt zV@H-J(`fd%KgPwXt7T}|xRB?)CrdVHY&zmch|!2KVaYt7aweP^tIv@AyS}ak5}<3^ zk=XVz=v~fI)YD@qr-BdA2s79tE48q)qNAqH%kgI1B$Jk~!S$#{#^C%Y1b1|o63^&d z{ko7q{mTb)HLJF3e6{h{{dx1T*0=thS1IoBi4k}|>%BN>*01Q6)U5=+&R$Qi^t7M0 z|DgDm2^+Umu-aHjw@xILHkwqmK+gYCiwx2sRyZVlh^E+#n6EaVghmEbSRQ4T(yh?G zi^P5ZUDNv+6uMZGzJoYZ!wd3)uJkIBR|BxbxmklOny41&jYWMZh zvvcl9!xJF_ng(y9!c#L+cA~+|OVf(Ks6&&CV{8HX-S@Z)YtkHqFkcao3C;hLPJlx8 zcMwSV@h4f8Q)2G)o@V>*)jdYeaJS95KCm;TFfDv}hjp1ghQ|gVZ--e0DWqqCydmXV z@xOkz)3LTO@lSUN<}cem03TQ7zXWgu9cCS5?h;TR$9vd{*{MEL11zqBF9L~u5$nb# zOVM;VLZp;x_BHht0Ij#ZwHW)iu+V}hZwCjvIvBh-;15_69d0x@2<&!O8q$C*)Ctfd zh>e?$lOb2}kdz;!0LVa#lqHkJm%wXAJ$q_;$0e0?x-3NU0W!NZU6qP=mI|h=zK@0UHRuGAa=e)XF!+ECBPyA%MRZm+E^08McG{!Ws z-{S3Ql&_Tuk~9Q4T0=~X29PzLp8k#J5rQVg*nd{TESJmu;d;6>U=0e89bz6~kuqe- zq&R{I3Ij&#lRj=#Aj>MZeA+3(hG)xNy1kEgSZJe&CQ!h05*Jn8w@l?vH9@a~puJi( zkCExU*@t@f`~H0LEP7?jUbuETJ8dQwJi}z)VcPNMsC%n=xo)VGLFsWmDyO}2IpsIi z-Zwy4PF*Ygu*^aE47J2j*Z8t6*PNg42Z+x|?CP)5()DLjwTskm{Pv^N?OppFpVgBI zU*2J3^?X_sCeOfyV%L4u@&;~vh%Zvy(=KgqRW2qpt{~J8U$h74kJ?IFCLGc~?fLyv z&HHkznn)(_Id6&mI)WosnPCLI>}Hk;(Qc(YcG&~{AcmJuTpV=|ZTvONpBT?@2K581a1)-Q9vUsS7NFp#0d*)8@?qzqU+>E|# zN-pe7cyM<7blUvNR-66ROO?$7_uM^ok}kO*>Q{E~@*h*kC}z!w3Z366%i;gLyi33=A%G zdfK^DgAl-`s3jw25K^)6%%-d=XwI*SA20IzQhEd3nS)6qJZ|LNvZ^S)JLC)0h-f-@ zdl@gV#iwx;U;`_XJB=G$HumxbG&>;lr_=cx?m50cfj3n2B)fI?|Zybn@ zFB5VZ{gUtFCI=LqC=!$Q78L1_4&l7^ecQTHV~bQ{J9Fokc@ns2l2m`fr3EY^|J`F8 zk@poj=xO6~KR>N|{=*0|I7+ltf2mu5exqt15i+`{x_E2W$d*cst^?v&eG)bHMl3RR zIXD~Emw9v%TMGbw-}uqwz-Afbx@9> z`uz)1XfzE=9Zj`gN_Bi}gA1buCnIS9uYPH8-15N ze(XOqE_=2=-^YiErf|!|hd!%=gA^K#0rO#P1Jfs{O7bajz+j^Df!5=unr=!%f1G! zIzr|Msu<|8uOP)0&v$qTh7Gt}d#)mWl7({oB4)~lZtgL&`jDvA+>Mp6r5iT1+|q4H zyMGN@36$R5&ZFqSWljRgLtv{OXbCs(l4rgQcyoMsLY@~#Du9Cw#4$L73)B+}A@0h0 zC+tcAR)5LrQ0UTs^Spr+bev1N53RyN)l`ti96=#K3vieb9R8bXN_$j{w6fhngv2iL zDE(wu-xD=xk~9j_G>DUSzLON2uq3&3{AJKR`K_pI#AE>ooi8sFg`rmGx{80!jf{T< z!YtKRe23*pi)SLou|W!B)OjP=fGP6CkwIf-XQyP?hAGpl|K^N^&TvQhwOR$vWQNK- zg!K4fe*+$ZJULY4aMh*%f@Y4;Pg0Q#_={JNU|@$Fe}|0Gmx=v)$Mh#wXwUH?h)zL% zmEU+??7n(45fSMayl;b8`XcGOjz9eCoaaJm|1P!brn_)Z{s_kGWpxNpTnjkJ>^~%P zAIkC*lfmTdT6 zaDeBZ_ftAQL;Y-4S!}@jSb?weH8)tj!E@Z`e>>0i4KlWRgiW!&@}HVvbhqF=!+A3Z zY{y;$oCeQzPS*E0iL_54$c|p$*iqE7*K;cN6rVcEi}o-Q;q(evhTY_nb_}oM?CTdP z)gCkR{hHGK`wA(YIclWQ{3ifQh$B8XnBL3irAk->JUCKMn=Mb)G^0D`J^PfT*87$|54GAULE^H8jAY5;<> z2>}I^(}F-@zV(e{c9wd?mew&)iNu7&mVmbcc(#Ix;OVkH+i;|>oI8ZrbF*NdzOdwy z@6R(<!5GbA!-$m1#|?8s=I zQ)!)61}b0wA!R|Ya00c1QN8}&HKzce-z9V1>RunASx{i7$l9J_$o^i8t_b>m-&;BI zzBq1BayVX1dyZhey`%scs15dz7Y^fVLW4Nt!<8S&UI});@8OaNFwXSueJJcsuMjA@ zDJBNGnUKhFb#Di<1o{3wZeKj{+ctg$Y(J|@H34LjrAoDnm9iARWy>aQnzy%3Qc?J+ zhhJOR$+>YS9?vWJ>itI(g}LPkwtZigdMF9`pQaYY`LFL1H)WSQI@ZMF*|6c)5qVro zo&~yvh~0l|_Ikc*z1HxhThG|(H`SDmqB{I$#l+ELg5TKScp1q~w{LZuG$8{4QpK+4 z?5aS4B!P14b>~B?BP%IrM?paK)cxCu8!IX%R(|qOMbK~N_~)73>h-SheK^9(=&=Wx zOnTY@1&WQYuBG3{KN&BA&T4!T2_Xib;6Dcbv%!o|cn})< z21?sQQ%T!|{<770sY6ZT_Ao!GJ;O~MB?6Dzg{OlAB|C`w0>> z;jU#93a-ELUXCBMUSa>~Do#g}RaN9o^Ae1C35&4dOEQk`#Qx+RWd1h7|IxT0qW=SL?m@!^gQ@09yI8WA~-0o3J6StDU2lQx5Na%v&~GhWMbe4 zVTTR_PG_Z|U{94kbV0~6JeVr!^rMS9RO^3E9u#faoKOS!c(3`Nn9s!$uLM#DD>eN7FXyp z+SxRzE9);L1|2wmta$er?ywcC70a#+{kaZ`0~`b?KtNoNsZe3<;*ggBCE1UK2ruK+ z6*%yQXB~F4G~TVF9aSujb9?IyGH|dcDz|6D)60&975Z(lRH1T<9nte~v+B3zRPM}# zQ)tSfNz#vo$t6SKOD6RC7EO#E)3C^Xly|G&JFly+PV?X`8#ir+kDEU}(~5?^PD2Yz zC8eg2u;^nDK3om(4L}lwg*Bf-xyr=tzecr()Ez3?Y2}KPoc`blXJ@$%Yb%il8ht6A zew|-F<^BddtBIMZrhGm>EpCSac=i8w1Qh=I1#O&@YPr>2B}L&eFCR9TmzkdJdZ=|Y zK|uk0hloEQn*^i*3qN#gs9di4M~!~{Lpmw4JbQeqz8zH+szv+9V4ZtplCIx-XYkvX zhn!|?wFa4O-vx@}GQW4*qi6Nu#I<3|2X7&4eGun$&xMC!I;}*NE)lx#WopB>%fmfJ zil@o#Me#XY%&B(h0kXNrPqiJ=@8*>d`1ft-pD%~ntf;uU3BAvI_0A#%o8vc#WhpUq z73}D6?2f%Ramm|YB(C6FPmdvd${@~<>g$74tIPtmL0)v>T<~5r{#P@78jSaf01cnWw%jNwVVL#b5)qRc`a6`LUGwW<1sn`N zlWDgt$LZ0Jo5@LnCg_pQH+h$Pj;KG%?11bAxq3lniZkt}X2J z*_h8p=YFtNnhPV^Db}yXz!MYC!2C2EB<6u3UcimUyFr%5M^1ws=P*(!Q=;Z^1`AP2 zbp#q<=tdQ53zF=VG3rw%c%+>xQ@(VVe`6%PUfF`fJUcoqI+y+ZU$cs}r7T+T~4p&RL*rD}v_ z9%!69B&BHb zGZ*%hoAC|ngY0&jtvxjs&$jtaYXIE-R+d?lUd$wu+8vuZ0Uwmh)G|NQmScIosYcau zv%9>ls3+g*!oXE8W4q6T&PLyk2uXj2?8{>L!|{E#%3w;eEitrFX|mv!*18fM7LQJ^ zW7}jxMFq+T{YP^Bn$uB>3S9V;WiQkFrM$Q@o=o_vLaX;bu0X=I0*((rtt-39OhS#H zZvIvITzsq7YF4Ww$md{iAUcrH56E&#GuK7!iYN5#)@HIVUr>O`N4mb+rhH!O zekc(VM#JL${HmlG_20|y7EU{PQGTCQ;J*S<3F&s!H6x|P;$BEUA8D8y$z61^HphYl zNzfN)-5qM}(CaTnaVCrA8%`D${;*^JJWUT-tI6{0)CD<&M(XUpxk2(c*h%Ivi358k zk~nfrM&UILD9VLIIKlLA)Lsay>6*@RNk_qN2en2Dgr|NKHP4;q_``*Yz12G_`!GBk(_+BvFg`E!C7wJ-qZ7^`)enVXxD@z3+U zM5wsJVuthGyCeV8eX%eeOn?VxB;sp8<%CeI)QV##E+{3ACP)eBU#0+lDf-vvK-8`k zOdzJe#yD}ML848X2=n5Xx>c`=&-h?HcNh~WfW)}xE!vP76mfY80#V`Qe2nKq*#S~$ zDc00fu1Z;pY{~|Tbsg&5?^s`=4VI#zK~WGbcr(}E`PYsFNFFN1Jmy198G@wf`zr9{ zs`XUtzn^J_!2Vk`sLLWDkXNWkv6n-Iii`T^6KtqzC>S>UyQ|mkDo+b^e2OEb3x@y_ z5OALzi_O+;<9-1vXe~Q9-W>tr?}EtMF;H~!!9$JsJpUqw08uo4daW{I3_R^zW7L^K z4fD#C)ogXmWSAf?FYztFRCWXHu>c#yoR{;&f8Oox^XI|$^Ai#weDI>X<1r7Xq|9_J z?a-Do?xLjjqJ6DXGJ7QQ?0b`Kl3DY3+kKs6a;xMYHtx8#u4Zb*y{&AXtu0)4ke`1* z5mlTv&q7MxZ)>Slc(T($NCPA~9 zQKRD?Inhi9J09AFj57I-x6xPdjB@3csdC?Bnf>2xhI)M~C~wn6nqXvX*UMF{B9|t0 z{1!j%l)JfbHD_a<{I5CEl^Bib5>q(JXch?DS&Nmn+xR_+YqEV|u^{~(@18P`l-V(w z{ycxcCX)FBL4rw=f{(BHXL*FPhbwO{_D4PUk+nGwwE1sORqsc7W2FIt%2V>a%n1*q zE0|H-ak~D2+i=PK`98)(9K(ad>bCOy%h_%X+S}?`&#Y#*e!5z9$e<^{_zF2|o>kDD z7C`wi9q(?s5c2+%EXzYz+^uc_@oF#cKkfO~d(hI?T1kLBGvCK|XL`H5t+Zo*{$DdT zURA=FvMQQR^n7z5GA;7tlO-u6@Pg34CBKZLbTA+P+uJsxm@;Fs5bkJ0>Dy@fs~Bs- z-)eFUIls@kPRiHCv2!*G!^IxkSR|J8(!?2$+y?XSxgAZM_%AO|v!%YTw2`7L-7&Om zLB4?3UA6C?iGoE+!&!Pj-&3o^u9Ifh!OdGD}(cEUJC2vT(M6_+dV<~0+go9!{ zBRt5;5@S*OgLA>IU>^-d5~QuA0FC@W7)X4CkpTt;&uPF6eVA#*Z0KdCNJi3_dp93h zx3x8q0s@7yj9>~&;OwEH(I!9)izFkF^rM4C391Mwpco*M!r-8=T`NK-!~1`cMG6Xt z5nw_qf}v6>f)gam3L%P|dQN1$l_5fyfsXMmaFfpR|2KG!?l>ZZgbbI)SFFkJWaf9m znsqH;4t6{gLmy*f_p`76zo$VN=_V1W!$rLbqHu40UP9J2QJ@bIf~4`=ONMaau{5K* zB3sQel>?tV-O#v(i;oWl8vG)gFf*yx0!*MAGb=x`%=A2Nd>j+~iZdWV36n$0i_zm`swx&^Z@P%^a!Do&7E9M27NVYl z7wD6)HDZNI6R>c1qM&Ln#K^1(1M?aNe4FGjiZTP(nnCi; z!^u5ZpzN&ch{v5$$gsL(P??lkA)>TcD@Ad9@g}YeZ_lgDsMCjgcJs^Da*syr7w@Yb zYk8dFc0@t?TN~qjj-=&TH%0}@Y>C2XP(g%{w2l|A>}-NB0}nUK&+V%I$a53(ck^8S zw}Hdvzew@?YbDZ|!*OsPLd^a@X?W*tkRki9qAf8%}BU(5XNipOdxo4M7g?`1}D ztK>T?8LkqDxjM$$>nbiZp6_Q|KpPBs82FDkE$>?1Hx5~#&@o!l%_PJ#&l3L{e>E(Ii z>V0A7x=z%p`uk{L`&FmSmO(aS{U&@;3!yBFx@jgvSsZiorAMiUs1unYi0JTJ)T)2> z-(M**b8(^9dD$@)nEM)`gQyb@VTRVjz2CHOKr|^Xp(ttlC>jp%QE10G@sJ>SG(UET zD>*_(a1c>y#CKNK7L=9!!i}((eFY+MQ;6Tf&GZo9e0vc@paQah7%&jTegJU{Kcth< zJ1$mKfJ%VG*Re`{hGa*L-S5mt;u1K-)DjByFG^DaL6AvCI);#<0x`j2(B5@CIhWrT z%-cBQGlBe(;9z5KjWwooU3({ufLqalQUum4v!MQZogTJdjas@w$c}@%t&_a!#w^1| zhOUPT&7veY0-ji~RfO?t2sVKgI3OD}aVD(VpLED+EpU_TV11}^4~%9wRXH7VhM6D3 z7A<)S(ah2D2e(Mn{iGMlg@vn4y7FNWG>=wxuV~hEhBuBQC)}Z-0yy`l)sLs1+3Sup>ELU$`cl_%o-jE%>j;vur32+fWlz^cTx;I#T{l#fT!{$$G-*S6p- zvFAB?UOIBRXdCKJpR+RtPG7du}r!R-fP_6ulj6-pSH$UT^fxO zBr-T&kbc*>U+U`A;pHm3q(W1%U5qVL&gK2y=6s~5({h zP`dK~KR(sI+>mcnEARR8`j5rVCSjGF?>+z!o5_7R?wW7UP`w@3j?zxx{!{j!%4zia zN<6UOhwA?l3x+28@W*CK%Jo1aqU*Zpq&c|C6~>G;wVXA2>$7wOxC8Ou8|j&!PsZnQ zJ!~y(5HOGqozO0^4d-|}-jshP=)sgT!`OSb)7|3FkdB~?Z~80Vynafc4lcQ`dtQbP z$7$E`FP5DJ)wsHAjCY{3|AU5+#KHK|tQB%h_ERWg40;I1L~aJ`jC`)X;ls?tX66X) zwAr$8n`M;D5Fal=5JTGk zv`}>G_wx_7vy`*n5Q-29OoVbhol*>WABu+6KC0o=ypqM7U^hbLl7hp<+ziTr-2vWz zk3DJ{?jhI;p&$G=`PrE@SFO;&-HQ`^MtWuvXci_;QKWXcDibU!ngx3kyIH0)6?an> zWMVX^FM_?RlfoAK5tN%QL1xf=I5CRv(etj!?Ek)s29supAcquTR|JS(E9Qw{=busL zvSN4ruqKn`fRkBn6);*DUu!uG_dpp?r;~IsqMEi8p+oH(7#Zx~0amwT1dRzHtyya| z`oM8xC=i4ht@0=a57V{l1#TE)+DQOuYF9&`Uxzq0SSq53p_i`aUAk?iOT@7LCF(M2k9u|W z1*ibapvK;#M3c%tO`dl#8Qpu$X0I&>yQ+4c^1Im=UowRw>Z9w*tcpz}DUKT^^DzDS zzQJERri2r71~yR2k;nn(M-yq_(Wm$6sQwA=iQAFece~uqFVT}Yz89;`i3Un!{b)G- z>x+B@#a>%3Kz?EI?E9(;1#LRbjl8cnW>4|~on{AjJsIlVb2^6imdmxHiawRznaBVW z6YqidNoFRYZ^x|Zw8YEjd|exc+5wB-Pdn9E9Vc)6ljUZhJ`V^ns#y&|3MUb+_~2Ms znFRlOAF?|LeM|j|X0vzsd@l7LO6Wi9MD?lU5?m-S?o47%{Wker`en(nL$&G^splJz zxPXKE^JTQ(nUSIFKGwkVE;4MQOoyPcYv$>YV^KqVh-5s_xpvi$^>J^uT>tI)uBtbS z_x^kUn8~QZmM*o9GE3XVKD;1bl1zdKfIe`44o*Cx@`G6JTIo-m&dM=vZ}#Vn`s?B) z{p-EY0bDGP++~7#qm#QqWxXKAkrWJl$fCSV0ebl}AHUZ!BXiU`mVQiE* z-*!Tc<>=o{d<8TZukn+@JJQ*_V6{izG1mm1xzkoAA%$aFjN{H0k{C93xcB_pe1wS1@a^ z5&aT@uGBSZ(*B3g2?Po0X5Nf(nT!ho9v%1arXltUB1qVm1OgoiiW3`s)8&me zMuS!VL6nahzCp99uj*}mpV{=@)0I^b^<0lfK{d9M(2V=th4We*TR(K_g~^dQ#f)+axI&eQt z@cw}W(mBP>&eBVn94d5RLjydq>iG@2c7*xyvGKF4@Lxb=nV^86pz|UH2fQzRLWRe3 zb1vrMS;0)bJME8`!XO1r#Xb-dTd<+#EM@`K4|Y>aE4tZ-P)nHbVqgogDJ4Y#)v3?w z^%idnpMHH|&s2drSimgdCTOI9Z~}{MIxu#ttf4 zMRF6+&ep43PcWM6KOdg=cfz`uC5})jVMC|J2`CI*MS15k*RlR}9TI2kY?5-{g3jlz zT|&uZWF+z+d~>>0C*V#VA8}cp?>|xbWBIQVzM#l-13H>54mVf=*SXh^#jukGw zKs?`Kj7MIO?9l(on*P6Q4SYIb=egkpM^vRrXevvG7LoE^B*aCt2;QyXqze_07FI;F z_9cI8xXdEklItgcE;FLNFmG{E(7fPdhvd4IST+|1{k3@8wrgpIWxS zFpihI^VY@2#RKn?MNC<`nx5B-4ksq`sC>Tqcypl;A_pD&O^>JzpFUbFi52S5C(vAb z#Qf{r=M%SS9!asA5mYi{%1<4`1@W3X;vsleW9?(x>Ex2%~&uTV6Qvi8ue}^I>m{Nn;W)oUXNn z`90JSw|?1BAX~{2wfYkHFF}J78-{{@vHyhFUoHRdJ7Lw|BedlH2K27y*JloYetWt^ ztmt8!WQjs_GRgI`7%uw6Kxa*=W&lnBz#{up%TZt?lKUJ_8ebm&f%>vKt4{;$LTRgD z6DwRNQo#*D;o?V;dC~drOK%v>NgE4AZH2FMrFPI-fV!*R>z7}Rdo*=1MD!Zx|M1w0 z=g%{+&vJ?tC_~!;XTy_$=sxhMbGM^|OC6bijjqyC!KQ0hHSoEcXJqr)7q%1&YmoTo z-@|^_;BT?9rIzImu|ej3%vQHSK9Vw)PH{i0rNC!@B0mc+Kx7KF(=#)oT>ffh9kqN) z*XXG6$^{rjFt8=ByN~`ooGfR8OS&Sn0ADu9okFrKsy$e zdJoKqIZXvsR#g3*`;m0-wL)JzIT6tj{(IusQ_?fn2;=bVVn@bU&0npn(w#0-VJoID zGqam8(NDk(th^Mf6rn?dT;aUo2X!v7?QN)<)_6igr9;Ia0y=*6J#-N>O*}7qfrBzc zcz)mRt=LkXxQD#xC$epss9lfZ=kyEv83@blN!EW&HyOe~{*xlBug@YGD?f#ZFfDOt zlq~oSWE)nszs`ND+4j|~q`Nw0Q(Y=2BT$5`nyf%f_DkQmCX@88!9yW>MeA=3KIRSu zZRModRPY^6eFn_OdwC3u)0AgaJ@bL5r!FOGdK#VW2@Mit$Y4VQtbE4f+pp?xdSu9O zwr-DicS@8Yf_1gkR3^TR%azsnC3tdIdqq{o_Fles^c)vv{(X);tGIYrIX^rKxHhI6 z#&PWAiLOHZ{fVZ2n48?w5X7%8Y0T{3*mYRW{$r$_m^R+OWoXkcO<7=TGH^^o!&R!K z_y#`+40SVcFZB1w)O2(AcX8HBPI8xh{WstD|3XP^J#G5@{hFQZKQ_GLfzHug&e>8m z1XRifiKbx39Z)`>w`Z193F<7Yd-A#8^3xuDTNyT%0+Ik%^=k*+{Fu{~8gM&7^lvex z9Mzx;Cc3_iSNq%-pE9UEzDJ%x>TDCvf;ICfA#}SZyixsc)NI{a{J* z6C-IQk{3gg;mpse_&(ud3(>B!P@#g9@8A8(mCuWiTAfsOb^?s}72{S+AQz%A-;?|F z_M3>h+G)bHKJJ>|BNSh1XL}_PB`rc48n^#}t|&12G^QSEnhUK-@vb<{LeV^K4J<3V z;bnh1@V~^Wwd~S+^Ci(-cM{Z%DGW7LTdg06P2!?c1;yB(%d@%=pH&eO4*=bG1sIHI zog0S#+Gly&vGlweSFi}Qg(qowQdCF+h?BW~{W)+*)V_O_*DJGGR1*Z{!sue~mKc2Y zjC6Q*uBLCHkqe))H%mITjP(f{tVqv3TiB;COYQbUdbn?@)&Q|5EDJcqI``W}mf{Jm zkd|(rS5>+TKhBY6wC0+un-QAyyfn|Q4TRma{y(n1GAgcR>$Z^)9D)aTcXxujySqCC zx8M%J-QC?Cg1fs1x8T9wKIgt~yzjpH(F_J-cW-)Et(rC0Tx))|&7S|s#rePM0id1e){YT?nb2{hFLn9gu@206JZM5oJk#swdb z#_DFs0r!2>+i^I`dJC6vmOOvdTLEuYhg~=A_N1MnBT#Q;@26FBZzo#enz(-G+M)(b zkWQS+(FJw>?BB9^AJrt$tL`f(wX<42NC{4B!BAloP_9uN7s1;E=+zZ#4=t>o-B}hw za3@Z}+s1}}`s`C_4UH;wQ9(h2tJh^iBUf$h4ke?##gKx&`cU_o@Mo>`4C+TWcD#x`E+Qk;fv% z!-yZ!Wr-+3gji$kR6%S+KkWqhvhN3a9Vhl-MDiWUjjL9Rvg;Hq?q8i8>%c^Rej|Ln z35O$1BOKkpv7mR2ecfGE4gzhTPN0PtngGsahy=iSjEA6^#&Mk;I8yf96->GLu}=QJ zIWE$%OUG+T=YNQ9)^Ve=-nySX6?Qw?V_I~qI8ol-YWn1r2pcW=caXrPJD4oZhN?mx z*F$|a*)Bg<=NVI;EzddtrCRxYudG;?!%phkQ}Q3E^8SSX(E{w&G$(S{8ScEjufy^G zeVoMdYshhu%{Y}7IGrF;G-7!j+-C1GpLeB&rMnLHyBeWWBsP!fs<~^}UT;u@l_xjw zZrs<1+53^35*55mpj$wB6IauWE!|A|M)#>jK*{%YH!GX??xDan#Zy}RQxLS*-pSPI zQp+4r2#L6@+-m1Jj^X&aTR-hbnKQF*#3IjzFCoy5M z@XHt`p!W-8+qFc85)}euKS&zk(jHyLXdDky;z-8i4!**D<6>Ol(WXMjM&T7o*K!L^@U#+ig~`%ms+w=m!9C6et*8*K2_(1j|Ruhu5NXQKR+u) zrAWV=j2u@k9zM9UuY-5MrWb?lY&`j^>-YTKxGnK}TVKxhxm@@wg6#u8z-YqzC9>)= z4P(bUNvc>uB9`E+w463GtAPxKiyD7zy}U__tV?Y>(HrS* zwlM~UhneOR1h&*QsDu>?sZBj{DWoAjOw%8%d;WYMHnXz%`cDM4_h58WE^XgDE%9v^ zsOXKER8S#%c}03Womkc+n1jeE9hFsxhmoSYzV@?P4^cKv%>kMPD<)7)h+fzNAGU{zubS^EhrmoTyylOa(B~9x0A@JFCJ27Wkg?L!t zElc;semf@HKq$!PoM7$pMFHJ@z6$QqyO#OLzSPHeV3@lMdLdz zXq|nyF249}ZPGeqNwkbC+r7P@)$B#CFuM2eacIw6Jwgd95Z&)DbRWHQ<3ouK>sizD zuD1}n2$XUeP=JUwjk%V~6iqlHZDD!Ye{oPYq#{@d$PNq&uRu;Eb~Z3-Q<7p7Z*p;4bgUvgVR{dzCo; z`QI^oNJLfpImIpp7Tj*a>Cno^Xg6fQb~x6h_JalmCSH;nB^)L=;2Y!K{U>vCTQt$D zP34wXlq4lHH}`?vWA?-*cA+_kg}c8nV*jbm zuWoKEoync2E>dD5IBJkj0k~ocy$*|}HV)6lz5KI~fhug-^r!T(h=8(_!Mt78horLr z!jb9+>@81636GLm1rFx;aXBXkhjZ_TEgSD+mL~1?@ZoF=@AJs$@urFe=T$)luDUu& zCo3td-}3KA{62=R*TQKes(U%_N4gnT^K3~{-G2$PwAYrW<{T&PRiv?1K05-okcAKQ>xyolr3#{a^T1T*iex)OgWUN4sw#18qYa;8a%?CD8v;e3bEB zMT7!0v-5Un`OTSc(G2wass3Xl!KxN!^jixiFAzoZD048GqGI2lj&OiU+|2@AQ&cGS z-XgHN+$f)s(nQrHG8JsK?#(%vb~z5<&wgH|EhA~L$I|rFcp_x@QAtnE|JZ* z2sc)g^U>1v-03UH0YNmxe=TpTZKbW$BYu03gIBuVWkO;|FOA9pFba$BO<#$DfB5bF z(k7w5evdDw^67Y4>*?U5Zj}U}cHl`?bMLkBgu8||-w#lq2Q=+h6l$41~AjX{^$ZfkzZnV0Q7N;1B z5g{HQbHtEPj|X?J>&D`Ib=FX+vydVZL-gaEpVnG3=<(oD6rDm zURhIxxHn@b`)w1T-`Cg;MaVUfFPJTD*2skFY6ti`1qp?_^lJ{;dCYcka&ke_|ke&jI3!4YXQ#W2yW~kelFhjv?U{}A%}Nyeom)Ir8w=!AJ0HNeFgFao3e{v6H(|`KgU_J zJb=^*WL!s;G|=QPwVv|#T>Ks{fkUv66}xq0WHe9?%BDI9)U_y;tsKEY1@1n1@I>TW zBax&@%(0SuF=utFQ5+W^K1`6LzWCgde3CXeDjBInhQ6bHzcERiB25giGQ|BiRn>nW zQ9-$Cg#z*`U!k(NA34ntW9Upv$Jy9Y&D&JE6tCO%@P_ z6w*6#Yyf(%a^QzS-g>XBf+CT8itd49M=c(ENe&lu0IRFT0@Us?nS3|@n81hkKo>#f zuTRq3VeV0$0OcBuami^0*f_Whx}T(dWp3V0kao!^FBes9(biR<$KyO28(-&ocUXPt zS)klpO?ICbe($@*Ic&Y^>H1bgLF(lFVSAXHl1VTf7^?!ns{N0ZrA|NT!($JuHQ!$f zS``|Zu%9|B@H*LHi2Cv0E1uU0=#FeffM*dxh7`l*_=J_JQ4H`@^I_BzwA{ zu2w1JdN%HSKRSvmKD}9Gp4A(y<~CI_k8H@Z^QlXgw&BC|mZE1>Z@zkK>+`W2?)3Z7 zZ!y2QbP*d;Dd67o6}eUpq#VPiG9SI`4|jX)kZs%do&b(VIjWU9BZ=)oQ$z(iXr+7q zP=k|;CG*JN!lPhsmIB+}uh6?_9hQDa7U?-F8NpUXXUSq5EK4U#`b%=x1cvJ9;ZVTt zw|8tE&|UCe&+Fx7GQ`O|ySiZ(3_vDJ*Y#Fi(Hy|BzeMS*R`T9$`%m&sV=dr?}C=le3&V_g7uakcx_Gm`e1> zusvd7Ra3(_vD(_M7P)vMc&BcmutBqz4Te{1{AJp0FM@=y`Dslt9n(T#|p!ox=C^io2bT(CG0c zF>xrs8&Iko7SIh}JZRhECrBn3eJvSJkx}49lT|_^>J{F#U`0WK>{lv-22n=nRrr2W zgcO~XnZvyiqC~?Z$Pw_aB}27!W5sA$+i3lvZ?M&0f*GyF&&i4hFUFo08JC<;;)RI; z#J@3%nGuuxDt>82G}RF@APm6&7(duI?9A`C?q=ib+NVzuph=TfjMF1UVT4ae`XWJz z3ltXG0o`q^tRbc}e={?M73mmLwQc|Sg*Ks|D3l3s^>Lm3YvOZ~4eiHoIFSQ!y6^U%pKwv5v{mRhO z(c${Y_NmY|88Gpx({MVj7V6>YW=wm*wEejFMDXTm4X7}>sz+%ZV~(ctPr>3N*lpj$>E93xVZiDqI0R06JuN~@7>U4m%_~u z-SL#fQ%jN)f@tfQl+p8+LKMKoftLGmBC5~jTP}L z^omLaC#;O<<4{~&iq3I6v|{UVmAi;OWvcEXj_1!O-YU)S*NZARMs<@wdt#ftLKUhJ zoy%Hf`uPF7@2ftK(VDepydr4fkbuYs{lEjdQVF`(ZIFD45Nv(Pv+pn(62Y8~G9-Zb zK*WL;>|th3qMy(o$H}RR-&&JTo8zpDn_F}0{g`pyI_3AyKV!ub84Ha@G2P#T-~xJp z1)^7cSJ&lh=M5}8gjz;NG56w6>#OYc>+q+Tu6s1m>uT8=V1pbuxj4%}TRtCsvo(p; z>|2(8l8L{|{QGg!aoBdnTYKa8B$e=q9a)2*mf)=-VN(*a~3#aIFCF2sM z2{EpS#u`T7YW0^6hJN|(>$UA?xq9ddFR2y;0oV?& z%ixBV&9$}@jzl(QU~L8TjmQpF42*2h4zm+u%NCTMv@_}e{c9F)Jv$?A+D?M?p#E z69@O(Qg=?5cKHHD3pOX6-V`a3T?ZMW6b$rJjg!%4f5I@e0xYnw!D=o)8+Hy!^2hV3 zXWXpR#>Axbzpu2}tsNcWlo2rrPggK{Daz*04=$|GkY_2#7U^Qhi5afD?i7KjJf=f7 z=xH3Vk%h0~-7^l$`{)!Otqyx1O0vI7a$Qr}^MuzuDkN#w9Vi0`9d@Py^gkR}2R%bN zHZ#6QU`RdzC!(7_UBO3s8s|Lwnb>y+weg1#?Z#JhboMJkETs4$=N*%sFXa10%eD|l zIzHx^T$t2rh-Ux>RA|xex~8}Gf z{Xi1ZJn($+U5%kE$?veEW7v~7W&8VGmSZc1v&RO#y-MS@!HQ3UV)Ni${F?4*&D&L9 z0|RaL--F8KG({Ob#{FcN;AHnd^G(3b?&*k z<~B6z=DEM$#3ZU(4~RzFC0z{G`o48T=>qu?+tB-zEr}u$upfQ&%l#s`wN6=z2;$9z zOw7t`lYgV|K-4VBeP*Au@i71VC^Q(7hWHVNG)u~>kaHM3Yw@~QGz;;9ZOr79P=+y% z?irZM)l<75s-731TRd6m!qaLZypQ7-1rOoeU9@U~5B^xfQ%H4OS1^l?+2zuNNR#$J z)cj}tG%o62%H;xb03=Dbn5_u8AjFyOLp8sT@Y7^2SAH>JicyAGa@RUSuMW%Oy8rt8=c*7$3XN)H_LhPc4YXN*BHCN)`N8$#4~khkw7p?BWfq?tWeccl0Ubx!Id$KGw_K0059Kzoo7&=F^mw_Rvhlj~dkp1> zmpo0*co;L$<~O!$@w%g8@JyQ*U>qH0Y|uQr|5SuByV0pj{AJ9<=t8a7$tGxci@Q@XTaU{{tj-pu*A*SKXpM@Gq!nF!;HRTFQV3?kCB651fB zvB^e~*MV1#9A!be=6hNcc9WK#rlV}F1uHg^xKW)2FIr5x>>65o!qz)Xl~&!Dq^UO( zI4Ftiq{DCJYe>kLtyJjlj(ccAm@)uzPl!H#{ct;XDwh)!3Oa!m0oWY2i_-|PK@8O} z4*3!JnD1UtQ(PrbZ@zB4gFMt_am$x#>P@9%r@w>TJ5*^|CnsV*i??qADZm$RQWuX{ zWWz<<@;Pn~$EMC!tz;pi8`pkroJ*dAW4?U{T9KtH>-wWYpcAjJ$o5R$X137H(WNh) zXxu%Z=~(z{7 z>prfRFQ61FNuC+{-1=6@B;{Dh3lJsQ*E4hQgl9)WpRKAGor%u-isCX!gbghINs@mX%q{=B?#uwU_>gI zM4?15MHq=F$&emY+zScUY3Ng`Svc_$0ES%)xqvKzhwrzv*HaR;W0PJfJM7tG>Di-| z^A_ds11bzTeV1X+-||Uz9KADDab@c;!Bmo)hv$c4!6ndUTXH)BsB^qY#Cdq_q1A3=570d#c z?LH-O`)m4#Ldmu2|LtS9iJ^$Myn65K)xnXSfk?JU-C(yIjv*O9jm6_}Nw<7BI?28? z&N{G4I#2Ug0XoV%c!2}DzfdIl6P&}tbHoxib+5_t!J(le1Sl6?IXhv|G*VOwy|eCJ zg)^zafvX(8G(yy2`%Mar0}rie!&GNo;ViGSD)z_T-i2A5b<}Xu5JO&o$K+5{)@`(K z!AxyRK#NU@Lg0bqKtC0r)n~Bvg&GCX{i;#!^^GXWf!dH_pgSf=y6S(rGG!S1+)OH zvf>4W8kyta?FNpXU426#tQ=V5`DaeksbX|B6*TCPkd-hq`HMx%Wpdf4RW&q=R<|E~ zJ|_p&!l7D5Ow4J8nR5E3qF}CM@uOErS!dYX-nGGm4x#g2hv&V~;%lbM)cEu|xIhJ9 zbBn!D-cLE12?Fkwy$8r-Q$GNu2O1v@Fe1m27Q~sbCPsxMTvHBW=Av-X$K4Jpy}M}n z$&w%c6!>zJK;##Y_cbn&0q7*k%um$sny!fOwV>Z$WJEp$0wx434+}MdNhk_ta3uyk z#Rf+u9_D!@mjnNf%mIvA9S+a~9r6`96LPc-NLfT&d+qtE^WsV%6U$Kci70i;gzJ~+ z*YTo6lD<{9ZljjON2!F5FM@|h#h&kglMZ~Njfa0hB@*}wL*{|i@0%<1gNx6;z6pA}apY&-rXUz%44`Tabik@bZ5CK-un+yCWoXEgRLGpR3qETh)PF;o0wd$Qd@q1lePX3K?aZCVEoPL z>`qBc;*J8wos%|Mz#@`{PH4$_D)4w#$lw#dL7qnpHeAzF-t}_ZzgJugKHF==np#4- ze})*}PHnAdr$B}82*^h;dy~RA(lL?BRqGd)5NWNFWQZ}=@btRmzQT&TaFa=rt7#z) zjRq~AE|netIJlXN%D{6-OU>%EopEDHt7(ITJ|SYm&W{mmDrEz}xZVDvL(lbqfOqqP z4P?MtsyW#Et5B30{prmxbbft9rB2NyF+Kg181OYJ1lmcOEomub9<^6aV`l0*v~KtV zR|yZWbhs@RHb+SMkLIT3v}oH_+y3M^Zj=h0@9=07R#p8%(7}y2ub`iP@j1~A@!X!v z&9`^|y2s#viamHkpXPN;c3aqGIyCbIH4oy$_xouHVn-b+( z{Cm>d3pNax9JB-I=jbn=H`MVfCOL8$F$BS#^Us?r3S!V|k@lV4J7@NKc9wu~3E7~i zXS@tOEnqi^Jiw?G4Zedn8#&SEs2fQ5Eeu!yR1MacYqJL4DtTXYFm3%f`vze2?EL5L zz1*>!y1Zj71wF!)q$yjvEPaoJ!x;0SJ7S1=kxe9%3z=+P?>gQbFf&b&(c;P=?c3a- zhm!+tw)i>X(15oq?=6a`iq2k@Q@{tf);T)F`Ca$*ftR@idDGU?VN57c6YEC;W-?)a zGvKA2%kn03DQ18rPfDuix9_Bwhd59_!<0rUlV@|H|5F47u+Y1P9r_xA^+^&No82~| zcJVu%UUVA3U9h#Xrs)+21wLi}S%|2fT1YXQu`c|=1ScpLH281HOM*c!fp&XV9`u6! zr5FL?@QT%)*14-ZC)#FH1;&0A3v=5F-vp@Or?gYIqS`5Bk(FRk4CBaOC!%Q#35AnN zR92MArEh;$^05bgnb99LpO7I#BBRY+@C%cXkWe`KaOJU&LVusl`5ZTV4?fWAG#pFv zi#9f&UFp$EB#I}ZmU{=~)5P=c7KA4JA-tyxEq2cgUld5Em6MjxA!Bl$gAuTlENU!q z(;+2}8d52XehSDhP0_oIAN>WG5l{x)J;+j`E5*xX@^KKNp!$E)C`&9;eHtB)8r)-P zU@sG)Oo&JkMJLV!2_k2yQKd*vW#a(LTCNesC0L4T@ShSGq}c6IQuJ7gc6xX~d_k{~ z`N>RIRy9sTCUtVn27*?N7z0jR%)DUMU9yge=K4_#65KGtOaV>z?4j(ZG{}GjXa!tc zf~koVnAG#@xqkP0jbe02!TGZmyx7rjklr~A zq{x3#mWLRlOlMUU^?HwPK?WCU(BL^4O$p&a1G`z7^$M(X)5=Ofdu<4oU zQKJO=Rwa?+JTb+1yfD|BW{!pB_Ylg(DZ8qwv~NJyKN5j|2Ydf6j49_p zEy)HR_k=pdA%Vo#$e-8|`Ixj*&COQ0(>}!U_jCqaO6f0CHWZju$4)f{yf9OL<~~vj zYlmOeE?1a2VXqAKt^WO(tk2+sV?|n1l_|bv1}DpHmh@Cs1L2I(VqYjw(L@RE zZ=6MED`kqrU(*Tog$>8E)?N+Gd<+>*BNQ+OW?Bw z!X4v@I-&BymHIel@;)x+M21}))k#TLuzV~*2_iZYtnE;ih&4D~kk;V9i`?OnR4PRM zJt>cB*uGosu1sG75*#dKD8arU4h*6}U8f1zBy0BElm}ZH9MoBYzd~EP(0E*fpSe!c zu#Sl)Dne{DU9A-tR$57`)7UN}CQB@BZU!k*n)BgGd|kkp6>$hux++d$^TUH}l|mI+OlLYNLanxMmDdWwSRu(F>7yw{a zRHB+`RFaB_q071IWo$PFl*CED`%*+JR5^9|>)cPE&?4iyd{ChR+j9+?4#leCVPL#1 z+=ni%X_A-?ui$A7t%+DkU<9)pC=@7#@Bwckwfe3K04*Xk6gt^zl4@reWrF$CfX77xvnZ(h?kO=4@{Tu%@mMv_VM}Q{ zN-TQuuzro5#w|?5NO^uKO1Ff&n)`saF* zs%h#&Ok5b|liN^0Sgb~0vs_`<<}oc+gAyKAJan__@zNhqQ2H$g@FbV?tOC&Re~*2- zU0X7@UPszAZwfKNhKo2UaI1y8TnG*Q(5wQNe*xOg%5IpWNEAtf9yX}hhw);(5pj}n z;`r~zrW?LY9XygK&DaEei(k)B>^p4BJ_my8rNn+Jel1GZ&nzY% z=)V5BjDi4_Kc*(MYGS3@a<)aeOzPfTOcX5LC;08U~^smrie+qnm9cIA&JUs3e-&G$QJu*D)YlRAVbp_q^laQG*M%(o) zmgP)EdIk-;)97obE;(vwzan!saO+}$YZup#5Aqw{-`$pj^Y(}X*HLR%`RFD!u?hj* z4ID$3Gq)T-iDQ8nNGk1Lula*|6|7NQH-^=jSKa&q2 zhaZ+sTRa)Iz`4~6{cRL8b`BNc`m%h8LjRqs#_Jj}EubF_7zSRC1El-mjDSW$FdTfX zhRFg1DHyZa$$>$koWeU0w^AOT@$JXDO*25N*DEQLVsniDy0ln&|NWL+Dmb+)#b`Nx zUARq8sZnl_2R$?U&HY?wgE_!DvVesTs4Om8z7v`=SH^v92qxekLLC);t08@Ra8bu! zUJfm{H+T0|JD54BbA37gLY*W=G&+ONd`M*6MxId8(3Et*7Pwl%|Xra(uswa!J~U z_Nr!Po%gX+sZmx_$Mo_MY_7^IDsGo3h?6eLkK8OcI5-Rs5AO0h#R9^unD~(hG5CHS zP$Vph+~u3aXdKXc)oJXhw8I;hW;!!kv+3 zndQE^IT($mgu}z=^ceJACPHwbpFDD@n z2r1hy-ys9PwCQxFp@ly*pNbFztX`Fx|2~#AcRUwnhxlcyZH^E<*pGgpw}b3D1IGMW zO6*hVFOZg&)h0EKpOIJ_zEHzqP>9Z-U-xXV9NvCfy{A;IPcB|$4&zKaKFg3GkN4~< zZ?D%VQ9gWS=MW-Cy|Sw5USLsEDNT`b9xa@)Leq*4czZgIb1fM!S)>NkSYSKN+C1$H z(Z$KktZd2R1&--v3an?h(bL0_PcO}YsO7)L??_<#A(A6kfD9Kga%wYiT~gD_KBC8s z>FgE8`oSx+|DOwNa45k!kqnIsP|)0$j~_DW_3gKR$#Psu)x`rcZ7uC`klOa=$VdbL z*wi2QGvbTRf;3aQH+D%yS+rotuR8snQea{SUxxfdDHv)$I+}g9{N6dfBEQKW0F0V zLKn(r@YGFr5*?`!z%)sRt`lKSGtvId;upS-+PcE$xgXcumv>UHl%PZ^wU`s1X z;IDZKh0SK8+BUjX5O5*ag-VLN*}!~2r?feYt|Y~mzeAG2=bov*+_kl!#KF!UU2aZp z`|j~w-yGNstJW-t({OP!<$O#vpayE&JYLKeU}%`I7v)miW>429U|rVkY2HkTVc-kY z#yRQ&fm#wrX2)vl5t})c#0*L1H0@mi&>Xkxi0R(eR(SJL`KL%@Co99JN4wbVBe+Yu z8g%_@YK>Y>&*vfISx%5m+>-yNgFG_Pq0H?YDaI&sow%hhF(!!-fY!@{H=F;3!~OUh z3#P%pjST+ZOC3bpCD0oaE+%r5#BIy5mjL>6KwPjW1%=y6T5Eph(!U$zKDY7ZD~`;f zl0vW|c&K#s)7eCni|5eVg2LtZ=f<@~)m>9aa9=_!jL7BD5uQZL3L9-ke4Z9rMJZ*i)~2XvNZqwZj)0DyS$XxC z)4-Xcu4tSdUc&<_tCo>I7?%odJ@A=KxVr zsLY&~KoebCNzt~|le;Y5#S*n~=FzWtl+Q+w4r-%lAi`v59Go$L@4J5vI41-ACTHO{ zeJmFaZnE4j@-=9GIl>>^9$}t?a%U;E{xP1koU*5*1IHcy%L~vWamA$OXik#0wxfT4 z1&Gn9Q*(I3d1hHzc`|)&3!JOZHHfUN|>2Ibns&Iq_YzPm_`!w+a+=!POT|8YMao$qpLb0?91 zUrR@+nCzNuPSy_wpTVI^jOUkDnY}><{h}MlSm1^{y9_@&1IyjMdM&VZVyV!QuGwZn zcG$A7rbneACnuNC`2;TO%Tb5$8`rq69#B8l59tF|v9Sqy_CR43AjqxnhW7AhvuFIu zhKdRYR3QM$9`@u0NifYgRl?wHg41r+dK^STtvS17WwCz^KSSE)Jf?l~|^0@jc&E{d8&abct= zij-(DPy;vT0#a%kwf6e^Vt#aVZ1nW)l^M>l2Gd^~G%M7`8C+vc>UkrGdGYP5HYL*4 ziJ%R53lxprT0enz*5`*M{n&6X?0T6Cn>-{RtpMX|YAU*KS`D`T4T>O!>asF$urivf zXV^x;P0tU8+?wan)7Qt2jNg@LY%d=f0-=q#SWQApRn#xLhO_{r}Fcj?gIoxZP23>Q1N{xmXh zFcQ}Wa=ZIi^5UVnpN7)P;o%;CvidlsVgK@p$)rRH1re8bl>}XX^yR#A+76M z1y<2Eb>c7FxLb`)WC2KVBB!G4A|!n)SdqB;fI&s~gLncn3+Q!>nL8OtIkZUu{&u2Y zB16cpq8p8Zk1~N!lpGBV5)4gH0a7ADQi(^4P?Jy`^OY6H;pRoLm1iF6oh)939w7N8 zNJ|YU+gE@+F}R!>4sK%2X8C72(BCIdflyrn;}Fl;`JrFP2XS&c?WY832R$Mgie#YR z{DMZ@qBUPOa4GV<5FJ79?NKsi>mioc* zUP$|g8GFAG_S$nUqz|mw@ocqOxG17^d9)4GKan3k}of?=$KDjZ=<%?;27v z-YLx_fe0_nxW%hU%am2htk%YrGD)dOi8?7_n{$-}K-N;S@DMP}*FbMh;2^DPx_j5? z(zi#+c;=+>^xDZ6TpIS@&pmLziWtc$6pGGgDImKk7et5w$eyO*Y0+W68?`z{@|g7R zQbrJtHw;-vA^EijZLlrQ#hlE#=OFy8#0y z(`U9?&R_ad)27|BX?8|ngd1)T%;n?mr|)tzWN;duhPkT)&MBKyQWk$?WF7ma&6Alr zw_y{WJe-ZTrgC?np<{mZ`elAc`hu?l3j(DFnBd6(>js1@C(AX1T5P>n2FS7T4hM%LFD1blJc-MNECD%7hq z1SPNcE6W0|l2_5tm`$q_s0mYLRO(9crcGTV)S;;&BaFjW-$8* zE)^pm_0&-S-(uQqTc$#30g{laCneK-e{M;TD`B9av3zk+ORn$^fDw7&?cCY@b&`gkeDi`FcU(ByTrhqTzx^ElS4 zRw%lCM|9eFMPEbC@@T9TI^s~#eYn)fAdquEa#msc ztK*$tFa}S&eE5ud$=pj!++Zt`sbrLFC+Cw&%9Nuj z^hSNypmi6xM@F{sH}5gB+{hgR!hqyRi(+JgcWUz~ z*Y7S!FW$fw4bvmQ%F0W11sg&<9K&I5N_KQqL^sbld|idPL_04lesMM= z#)AwE+$nG$NVvRsu%aT0tQiax8+w{`h@cR0a<3P$Wut|Z@cEO2e8BL&NUfr}JV7K8 zlQJT{36aTa2@|7IT3-9yrsii5WP(%^J2U40eeD1F5yWP)2p6w$f38I!7j!Dq3&M?s z$UKIJ1(U2g0}30S6ZPqxdZ2gsggT2&<1S$!=?zs!u%X;2(QeIYHx zs#YPOWwCXG_%T|jUXf%yw}U>n$XBUGQ-CYL%Z-2~jdiur&40+7H(v$^$4nAuA#GhF zRzOWZ)*ZzQev2#$1DYW3l56=b-2Z1JQLIWzf-yPeAhz>W_btCl5v|TE1#z2e^DCDVQH1Q3iTtTDaHO8@Y_~ z8__0A2%!y@k9jv~i7J*hk^-$_JM-#zxK;zmIQ_aS8cC1hn-RjpiM( zlRaqE`+IwT4Iwyt^9SUGNsZ$3Ewx$-mnoI)v|6Z&@{d!iP&ZdUFkc`~kiR{b_YW0U z7a!U+XxcaF6cnOgM@7j=$E#@Ten)uTD|n5$P{k5{4Ya&TI>_tAs;K^p^W%R974TiF zT0kQ^eG>787e^VQYUN@DDN$q)W#zdsj?`8_1vQkLFCzGd%O{fEs5X_#v)DSq%pzDx z4dxH-QFb=s3j}-xCaQg~`8CRP;Qgu^T(k&@^9d58dW*vLo`KGS@dGh)jo(4X!79ox?`i@5Ce5V+8GJQS zVrhd(RPskd+avp9NNP9%$0fH4aU5lp@eYW(^Rvrtm3Dl<&3J7HF z{|&Z+;)(}s({K<)u|iJIvFWKNbn-{h<4hV#Rn8Y0&;E`k+iFw){?2&4kYm@N6%FiP z%`yJbI8rDm7%m!(%|f@go-MIx-XY8$;@;zF)FDk`Qqie{D2fi zL7s|8z|~?aJ!p!9E>h4xgg|x+j{_J}2?<_pwh%s954HQ57QWR15LE7aV>FU zBe8#PEUP1$UAtUz)*2Iy75s<);m~9DhvN)~{&nus$@@WD&M{rGdlj%0c;62*Y$@br z5fMa5zC;vPjgFptIvZ=TtyphCqWdBchCsr`W@ywu>e#tW5PyJ}kRTU2z_Z^HZa818 zw7)1h6#+Edbdr^AW5q5SG-}1x{m&NO3Kf*U12etx+XO3@*iy7fMM|weQU6pgm`Qtr zN>U624Jnjo@M|9d4a4N7b7r0eFmo74PeZPh6viYgQ;8TPDZ>)(3C#F&Jqi^}%?On) z1IoPz5^V$v<}#xpYwJb~ZQ=Oas~p07C5NW^y=eP1K-bf)wDT5cqAn$uf%bYn53=wz z>6O9A`0u{nf1)3T=!c^ax&w+Ie6p&zJ?lY3Tsq2plwIfy{GDkIm@Chh3PSFU zuUAO|FG|DEbi9Oz%}V&9rz3KgYgm?Vk|Zd~u;C&}3J-yJ>HZNlqb68zcAExm#zrg4 zfK!#olOQ6vBNRC%XyO(+9yVXY6+pS=J)iuSZk&??3qh+ukS1a-DdX$$_tPqEYWYl? zG(DMXgBCB?B~zUnSFIwGd(6Sfiu@Y;^RXsG(9g6uNC&Pmb2SM|$(T$?im}^w&{C;t zMUq-AEgT3xHs>g~=ludrsMb-qY@47y^&W`Co?Sy0falNr$%0i=yy3CeWw&qeMaAM6 z5T~K@@Ya{THhf|BAuDG05h_XRB;aEr<<|MWo;0r{k4hfx%$WG8rLLUNB4_r*`=nRF*q!mQT$c7&2P0%-L-6k-$}j)5kibo}J^4X|s>R z{5N_NA1psWoC**3&=&LZ+}Y`CMv8rVQ2)33Z^6ByEWY0uhZg z*1~WPl@^1kwNL4#)lap55Ul=^v46|i%ff#(&4COG5$Yzt`W~@$_w9aZtr5NGEuYFt z*wZeC>pJB~fR~3mSG}BHyUo%~52mU9(>%0-pwOIv{g$&;tG$<8pD9B_vsIc(fzb%M zZY#~^gkClP)hQvrnl0t;>Jl+6jwBXSqDz?_aJZsPD!|j+Y;<1q834sq#6kRsmxx(e z!eE;qrK5$~f~yCN8F%Z=D!2k{`qw+IFBw{%50}-ENg`nZgJQ={pTPy` z85mreu_odO3^X8uu#%bjTKx!CJ>-Zq-2E~* zBv9kv>8V7BTx>bEdpA`~l=>n8D9FRkN%B?dSY&TPYb}^VKS192C>Doh=E2 z_AUt2gwE61zPgA7HdlD17MHng^C)X(>+5vRE%>8}hUcRld{Se&{kFEmq@kCbQM-pr zRuNoW_M0?vn*ct9Kj4*9Gfk4a%F1SfpYI|@zQ>&{HT8S58~o*pUXvO^j6A1QL_@+7 zw-?-hPucW;pn=T6!^O$jQgEQ)@UexqPZuS$Pc(uofwzLsI0aDal0!U%DaSxr+IiXj zm#$KYO8zrR#GX*zvfoW+rOV9M=tVDAb9D4ji1*77sG0%ACTC2Lfus&&km!u%;#62l zqyxNgY_u$9Wk#9=EEGv#AgVQun}yBgYG++#dpQUMm?8d-PC|b|3{^)^ADN9p`c=0`yu2MaMqH{nnL(l8Y z?m#FFHMNn`XRgw4tOz4C)?^#WW}q>jq;#ELOBD*})G9(QS`qZq&@B3tOLmkT>^cDS zDf%!e{0m|zSB$ZyT9w-LJhDRNTI)4^?~3y&o2DrBaeV%gH|X!ahI+o*$3Z(D`sfMV z`fpBpl<-m&>SWWSrnJ&Ufkwj=y)tS^na!jQ2_a8Kv;iS zR)S=Yt@B`bWJD-%c82}ryr*(jj6mi*MwI&%g9vtypA>L==Ma#tP#u^!Afkb0lyFK; zi6l@8LMBXoIbqhOLmLq5&lD^8g#`f)J6rn)HH>KpWeBU5lZ4{i59DCLM!|rTv^*dW zdZ2ut#y}DrKCBosHmQ_)**}GLW#zdilvp8_-I6H2xCk;`Wz;D zLVyKu5|BUU_HZNe8?n(rl$yb>uIFotUG7cepNLdcQa^!m+RvUHQk}WGXk-NP6d2Kh z5pgS*&saMNO-#wJ*6QA^^zi`J0)*@((K)11C04OG0+&y^TamufpS!%Ugki~g+vCE3 z6CA*VT@#^5{NGbP$vMp_w6lE7=W+A%|KaK_fTDcEe&HpQ6c8zCa7k(DZt0Zn?(RlX zTDli$k#1?}Zlyz7q@)|ZoBw;>GjqNjh8f1$eRkL9zTy|x1(`&?{Oi%7^Ek!_VVRlM z2_|Rw;x*kx*mf8;9uS+&HyXp5VwaN{OJc+CjRQF|KfR9=&~{QLsNP%gIe7D?VMGq{ zxd(TUWK#>8!_3Wl7@gDCh5SK=6DP9lSAimTmzg=VcM7Ft$^VC^?b6E#$GwwxV_9~q z)qeLGu4f%#Of-dR!j6MK*Z%9md`;1ts2~Guss!CBt|*X|z4wIA5;p9S4X2nT5FwCS zLi>Rh%@-6hoz#U;=4g9PF0RJLMw|KtVe&82qXsYHunON1TpV>^pt-0MES|}IbD9ws zPAIU*@w?~>MI($UYG}AXGq~zf*&rhz@O-?##3U2s=jJBB2-iv(9T=EvcH67aYoVuK zPk5%3)PB+M)r9t^9wy`=fe-Q-X??B9||Y)=Vo@; z?q+>8-UsN3Z-w<-*y+iF(0M_;;d~col_uJN_T17U??UU}Wg`V4xFOYTV9p`I;UTH= zH_h64fd1n%nzQXT+L!P<)p&U?xZTM4I5}O6a@p&P(+1KC)B3k`ei6gh6K4^%+%A7F zJgR~9BWQcXJb3XS6)Ih>Jm`$9$*|2ZOudN#8T$+e1_SJKcZYgO;_q@zO-6ML1PKTVcAD5G;5s4}>1uvLaN?H)Id zFQ?0w6Wt>|-7iuMtj+%ybAta^MVm_JA&gJ6sYzAJI$}Dfws)@m%+QKDAXL!a+hwhX ztWR@g&i^DyH`jdJUTY7miH8@Tc6D}dxWkt18tP9;Ow343BkcvzH zhWj!rZ>34U_^n{WIHa=U;l`umRxi984zk$j&~em$ixbK7QY88~S1kPDZbzu&@!__u zt<5-#^K2yjUBJzBPMP{%yWcI$b3Gz2@AclZNVUD$Rh&bI-)hv#ndC;kT|DkCM!gsN zL02gT0r%(l`kre)OH>7OnEh|b9AeezgXN# zwS0hoc)cEqfpI|mRuZuxBiJR%$hnoN3 zRIoz8LY1DOvt-&1R2^SghOJq@eb^sVEvM?8r%v>r?4r)Es3_W;JC-b7wBg*vS3@C( z2oG$XWbwOkVsAr)vBbqGVzkZVt2Vby7i=SNLjUzzyg(;lNg(^6%XE2t%BZL3M_L(Y zhWotDet71EMCdi@vp3QSU~DK@0ZxSg2@ZZU%4p}CG;8^j&)s&$lEYF`hP)#ta3Xq2 zWQLkp(AU@4Stj<6&Pb7t!*cirJ066EhsW>2_Eoz-mjUdA1>Uj9(JKOrpfj6Re4-*lIj9XjRbg4I4J;;dNC3GmWa(fVn7mpPcj9gQwB%n^+e{AMJfLNXes7$pw|&YdG`Ni9c`y{R7n5a+;w-j z1T2S;l;`%a1!7pGJ=|a$+r%`!G13|Anzdj!Ezd;}DGJf0WuIB4QGA2hgs__c5<}2{9TGAyZ6K0HHh7p_m`_e{&(M@ z(yFSe<>lqq*Vk57RzzI(OLbPNPEJm~3P_R0(BE+6BVsAZzp83&EEX3R4ZOB+@UI1dY-v@*SB+ORliVE!xr56WqQ|@H+y(1BP%N_EzOZPyW@8Gh!~@vIpBIY zIvTwxkF8!QS@|z(3Q+j(q$L<}nr-%a9RDq?eCT+*eAH!1RWBVK9hH}nk&%@}3l*K7 zo<=}G5EBzyeYj|(p`qz`yg%y4!DRirxA%B>^iYwXFP1-vgO87ogEME#3EOGYKRP>e z4G4Jr`ST|lb1Mr!|6QrU{g7$KD^4^-c>6}MGepL0q}7O`q@-kcKUu_bOw_A#_N@)c z)bw&9a*8L7Q{(LWphQd1Ua(+T@7V^IqDHHMb^6OPiMSsCr}XqgQ%rU#oIJZrb-9QX z1uE5$Dl3!S-xCF$Uv#X?J4VeLwB;3w0g7mweh2T~vT?m*0L!T9cPOypWu4SkS3e6y zI;5i=N$o{Jej_}$=GbMKO z2HjmLu9gFBTZCAGaIswGR~D_hbt@M}#5z9Gf+U!FKT08AnftBYV~XUBH2VbYXy zNN<=UEWF?UWT|q=K8|6c$>R4#rQgAk(^CEZ`HlWnr3N)kv9n99jZNuhW$3g8;lo~s zKT(Y24vD$DyQH4oFPOlrntF=9YXSuFgC)Od_khUG8i-`Ym3u?AdL`zgXnuYlnqXIJ zYo9RBbdvvf9mFnA=GiF7_qM6XTheLE{gy*pjbSAxF?$^|q+*Ml5l_sy#?5((hjndW zv}q<13oy%drp6m)Bviu)ewBJwd0PqD=b) znl*U+%2}`}M!m4c%oGCY%gf4C$9{&TVf42Oy;mZNp}iG5k9hT$fUzt)E*?~G_?h%$ z@LUq7#jpIVhpZ>?DkP4^Sr82Z5#E!1r$+CiU_HdP#hPIrKaZOH0RORXl-2@PmWsE%*<@R zkoIGpumO+80fZ@4_F<#__V6t;vw;kw@`n#~ET_m2`C5H*dJ%a)CwY(|UQN5;2$C7mYUeA<%kjPp#eOBn z&m0}IXvZll>8+x+)vTEgTT#wd7_Ethu4U~fb-y2TSXFPbEw#ZMN2@{V<2b~Jh)Y{H zO*AqI-CGw=4U9^^2>lMAHA3qG^yddLT(-_lzRLP$6E^Bf!T+6r$9dm_aJRMJ38z!i zuQzAGAiw{hDU%+vArgYnAS2ua@{`H0(8!H@1iNB|^3rcLX67pF!8?R^z;xU5nxtPb zcxbxb`E`c!kKUyQ8?E9Z~ZA z``eqFzW)Bx)6<>hXK=#BI?8E1ec?L>o@=4A`aYw^)xLjKb8djWo`cyTNKRRKl1AuS zx^njRY9nsd_jL5Q+C9Y#4Gpd1yxd{ewV4LyNlA?H_;A_rIF;I7XTK~rp`5ORmfdDz z)Dc)Xlq8n|Ya_ZluMAjTSQx6=f2tM}bMAT^S&h;~a|cF8{mv%e4-XBIdTqw9tgP(7 zd=A5i?B}YC#L5mQ^WS3D+wN+JLfoYc8=Zll9b3)v(oJ@VC&(#(lcI-oZ+4@?C01&2){Ch;!A=)J7 zvtwu_J%)+~)}3D6<(lQ~Dx@;=%oAd`tg%>B6STH}nfy|&W$;y{CLtu1&9jP+A5!HU zey6zPrK;|34kZ@!XusZ{r-uC5-{Sp#|n}!6!-ESv9##)igln=KZ_wCJ=594~S z^$flPox#WPot^K0Dh=+$q@_jNdZ&y2%_0@Y=BGV9h*r3$fM;(v$^)kDdh~qg9R<^b; zLc2)gjx2VSQz#66!t2gFCGgHzQxvdfx9aPT{0>RzrmsOCxacHb24%`4@9Z7(ygP-FaI84 zW7e)bT0>ikzy#&iSESbKIEy(|9!NRv(>cr4%MJLffr4|;X^;E1df2>;pdL_zuU}y z((fEPiTeVvN$jiApq*5G_LS_o7pD+q_cIx-XBDzRX zpjp5up0#EzbCi5|WO$L7B!Y5n9-%)aobf-oG0Y2S1RgSylZg$eiMP39Q=x;#tPsd6 zd}3UQuX0jQ{#%nE5SEWOH+~4(O|XX&AhCzEk!XdpseAx$M+WLPsat ztmM1>F2`#tStBDelZKia6qP2L3 z@3_A>JUn#p-5|d45Sz-U``wX(7^9X!2SgNQnr|^$#k)7ZQ$R)_pCY~2Z3;iCCZy^Klw%*1|DR0zmZ7e`fWLdF6K-y zK@C7vY8Xug&`UwlDu?ms#nXGo&zb5j73G@%6w3C_{D6v@I{TN}vs{*)(`T>4)Ju|B zwS=9V+>`Ldr4tmR#_`v^j{hLVJP6aidm~*rt?T9MIvZ;Z!|yV(4}H5F-1(2Kw3)*? zdGITr*I)SV2>{CKEqA|q6&r%6YNPWA0=jOU3^@VD^KNu89mc+7bO=SA*p5_u&$Qq_iUa823}QOUUQD`OJovay+ptZzJl&(B;D<4m{rM25&zv7njV%1A)~E zejc9eB->0c{fN?(co;9IAf5D7IN1ytkF)V=dp3aq?`VijVXM>QIdvi&M9}Yughl~& zzjEo%$zis`ec17Mdmv9_!>%2pT>=S#?{u`7#e$UOe!E3Y&vN$m13eQ%fZ`N;a%Ltf zq;aW^O1-GyDxbKV!DFIqWtn0KjWo^xhe{d88`xXTT*z|-=fBHj+VaXn!ZTPw537r3>ssCG~8j*t2$f8-69vTYytX~ytj>8OYumswR#)hyv{}})HrrFj=R7qBv z-C$@0&gdVxqRoBVot_X{WD~!((0Yzfc~;MW32L(D3{Ey-z=goToGC=8!>O!*I}?9q zN)2RPH4R)#_HPd#kHf+a1zK$U+P|1p)6v62KG4V(_tE-%`t(0Kvg+IS_yyiG(T`zdt z^9o=VplxAhcCfTWh71i4(?t#qJU!B8nNtcE-<^Y0!vJ+4S0OG zyYme*`Zp!`IBZD*A?M(zudAzTYD(X^1}AL})Ln32xPHS0ez@O9T?R;CY;-h4SXz3p zFD9zL816Sni(bdQ_#hOldhKK%A0LC}Z|?WjXMJ&>v1&t4HsVch7IUD$w7q#Rc4%C@Nw?_E*|&Wesko zP$j7%locXn`@^t+n1l+NmZfks@F&T(fO&d_H7z+^TscX*ypE4Q7t7;JbECbDC@so5 zZYa`MI^jR?1qDSCVq%;pU9NrtiaiPEn37U~EHCm9UHgC_HwhI4>8|o}KRQ{TjbUk4 z_d`u)8$s(*G`eqBqm6N^&ePk4#(BC>`hLISgG1bfTUBJy+)tAEGE!AZsknpANX65m zPFbRz;471tpWhN|IgKTH$EL!X0&+U!pu=eP7*mmq_l^R>&Z+;;+fOpzX=Ok&MFa!CQ?EPd$RRk8(dh)FU@i5fHIy-Ry7 z+dQr0ImK!6<*gZiv zII}^c?QWZ6a!=XP6dl8tp>sQMif;gAjR(>nGG*vKK7 z89qb9C!YFO1nram_bfi)C=ZI&&tF*eJwG}khLNHsY^4@viVE1_R5sw zm0xA|N36WpDdw7yMP^6f7oGVrN=b5+jfI=Kxib{o@3xX=y*RBBQMyaJoRH#!eoEtG zSPYFqJ&b3znws&^!OSH?Jh4~k>AF`}MoOa(f^Ktg5Fi68DJeb|73!N?J7Ym_1J4_oOD$oB6)LWMAi=7A}MZ4{6hX6>~z2@3-@V zE-bfRyPlX%PL73&M#s5E^*Ivty3LC?xzoG-&zoJy6xr%+BZlh8@~Tfw96s4Ue&6=M zl`56CPrg$S!_%TEvsT_RbrXMmUPzY1zHSNoYl@5_EO=#{1B}#Gd4Swsi<|B}gH&k) zAW*`y&rYmMGocWH1D}K>EDQ`dx=m>o1esF5c=v!LCWMEHUQVH@%ZP~pHRqcUje*Rs zUt3L0TJ`ns%Kfg^cGG2T?W3^!K-n^}TL+n#nK|#vL{j(Qi>|(VOeuF$FMSR1)aOms^J3=c zXu0~j3)1V~cY6-R_rJUQJTS6&0axK^ip|2Ac?Q&=&`c_x!Ho3yEP&JJ+tG4<$v0OPfjcBO|?X3iFCy6fNMqxt~V9-~Wgi|F^DuBHNHEyC+wt z7TgYX@A;1I4rV+0u%8ExzISAptG?wiC zIucxVzWZ)sYg<>m(-rZ`LE!Op?43nQ9G)(Au)fQouZ4F8BWvf+r755JgC3Wf2T|X@ z>*bllvVxp=HDo%R1v1n%C*e=^B^g5NOX5hhZZm?N9$H*f^SzW4J-(TD=-C+wpFbOZ zC^h&0k&syK<1uTus6zU7geBTHb^Y=-b%?hb%R?$j9A>U2r)&C98F0TB@URnb!r$R> zv{LE2^;SYcf?z|U9wUpzBA~PGyw)dQ>PBD&4FR|RG*^ih2X&Ahwa|Hx=w*r| zVTwv^Qe=7?7c4E!(#k5Amj3Nqo9QBX*cZ7#TEc zHHOQ+<8euwA+4=Exi*=jfEr}2)P!OSxVKteAD3Z8ist91ewx&0kWR)a=jB?W5+DL@ z0dRy^ut-T^y3)Z4;WpMotel+J{f`gB#~T)#F&rGp^z|wU1tld`Ub5QS&Z0rMrVdEa zMtvJ_H8s;_*P-Od)6=nLyrMWjt2tx&t3liaXq5|9Zv5JdiqM>SGb1AtEI$C3|Fks+ zWMX1sVRGI>c|XwDfR?!b*Dv*z?~mTsTL8sVFj)Ql4Q9QGAXP(UUND~K6^$Mzoe+Yx zo)^^l+_V0QXJ5kg;?ER2tSknLfH`-w|w1 zAf3@sQ`J#_F0`RSqNA$P{?G*m?^C6SLnPFt2Ul(dZ!g9Tu%6{!&sC$*D1JNl7Q|l5 zS1y!E*81RShJ=jztk%vZba<<@Y@nF-tg{-(#?@4Q;%dFH{ciW>MQ@vrwM?sugZdx^}4X=EPy*fHh`1@!OUspd~226uu| z?G=r}{(Nn?nO5vZiWN|4_6aB_hRLgrR(O*U65e!T`u{%m1g+Z>F36NKVYDzVi*1>l z6eQ{VRZv>Uq>ub&KiX>hE1>-t_zblgzI-89*TV{_t_m=!os25I+b}Ca{-|7-i-lb+ zo|_H_P-hV=2)X`@lA2n*&1?k%62{r(<>R0CLf&`B{W~c5W7&L9kmU*g_6|4X&v8ei=5Vp!+))mW{o#IJ0**$6I6>GXP?kX%lg-4!a+R_c;Iy^1 z0W74I0vHlNOKAIlIGM0~hK7vDMBI_QadjG#9YkIuBVj)#H{qR|+D;p(s>&2BLKFbc zZf&;u!&6J^Fzb1KYl4{(<8N-kw{N|kJu@<%Dw(wcBK(XqB1P|v(cLrN?Dp0r*`ywV zj;kq~4!`qrC0gQFZ_`GL^jaE*q*+CC)8AG8vNr7q*HT7*9xa@&KF!Y9l7<+Zic0zh z5(145rcfwW%MqAmuoxN`kz;0lt6nnq^XF!3>wZd#d*kBtPge>qE?Ew)gwaz`b@e_P zA+OVjL<`WV6&3AQ-XE8PD3@Eff`Tg3>bf1p80l#$8l;0EjCuZxOjfs9ob|f7O^z5>8|+0n>m!1&B}&_aAOvW;r=zuv_0v+?pSEG^vu*s%cA zIFs+mmTSz=M5VAo8dtpcbXITF0n^iIcr~QaeiEVROWEFO$^O?BOs@jYDnQg(*AtqI zobroG$Hv|6SKZ}q3!L6X5AR0r2LC-57w$YiNn#|`=#%Gd z6=YIy#v^-??`VQZ1nVPivef(4(lNH!Yyd ziK=5^eHBWyT`aC@5}nw3ABm4fhGl(jnfo0&4w@a)x(R@by;j;llf@vqd&2enW-CLR z!asnPaH~FJE5WsAU_fd;pTGauhI9cKfgrzKy);xjZEa&`C7hktcMcyvNO++bezBr2 z%8d}`jxOX;AUa8=jI5@KH(L@kwUy51v)mpK%fFj!(0tdEcJerPyS z`w0edy>H?>{QeS>&s|Fp%_=_)NaRO z3!x3|?GM$V&fyh@Myh&)+wz5I5(;l=SUc-H6qhIdLHm#MO)j$bal*9N1`#Lvp;5{6c#5CVgyU+9}*JWc}^!de!?uYW(Ol)knsK~Ms zx?|Lc;Ws>kdFs_C&UK0B_|7gWb`jh0lU9|?zb`{&WL=i*0aL0Vtv|)@MXGPWLeWX! z^E%d%UE=aAc3@WnMOLKje-MnxJR^&)@aMSj5Jkk6uJ6Ne5GBLVze%!N6 z_4VEPgXs^+YB=hp=dpZ;S4%sBsp&jKCPlb145$gv1rpc>O$Hn}Yp1TB-d6+LWp{KC zLKhY^ls?bT2(s|A)tlVj>{>O-4C3LADN^K4(!Q50?lxk2^JegiLB;6S@l6mKkpXIq z_Aa{16RW$d*VwSv%V>@uKiz4_jT33fRM;jZBlCe?i)y&2u=s;oa(N~FTROVWIj^uJ z(nsH2?o6w?$MsuOr@bT>w(R=~2TJU;9WSjPb}YJG$Z*Q+eRI~Vl&I&Im>gUNpBo zDlc_rI^+#;isSp8&y!!}6>A6S2z|WYCnhrVD>i_dueG(V?kBDn9x!iMnCpKu{6Fm6 z|2gAEjGFaJx!#xOQTF{Hj|S2HgAmAK_ZimAf3uZUATVMWe2nx(G)c*Ooh+$ZW2HK{ zgd0NuiOPeX$kx}28qa_^@gFeJqfMfRhn?ZRweH=YgvRN6Uub=Q@Y*HsFmC^jYr zD5Z27m)#fndxOKWUv1mk*!bM+76TBUjg74x@N?fjr0QEcOig%Gp+OE!m~Y2g;gDZ* z`F1IJy!TB9JoGNWEc0mXm%blQ=RCODw)}W6K&tp5Lpfgo>5g|;E^e{GZg^k-&`P#; zb^^Xv|FS(+nyPGII|0X02JGzYBX!isr|czME1vnZkw63k^kK#SqjHh;;*(IOqN0iu zxR`rFU;Yu886Y*$wSe7CgcO<5Sv)S=fCpcwHt837*brI)bX>I_-Sg08X3uVyo_aZ5 z7FZtb{Gpn>ZAWi3Ic^Von{2uFx>%N9CV0~wEbjnQox1nAncdro9mpm;YqD~P=uR|ARWe;T1l=I5=4CaDr&5U~PtrsD z#5CX3)B*xzjRhaWg`t#|c{u9e+#6xqy>XQ+1LiKT*a8VuX4!j-R-=y9y5qHWHh)Mm ztJdrAfi|smsSdUh-~O>WZ3&13(XOv|pVaQRSzp!PdK`U23Fj$PnOtGDWZnB^UARB< zMmD~=C46}J6t8^G`C6Ol%x+b^aMnhbDL}?qGzpjmSu)S9>reWKIIr(1>a}+ry z%UfAR%zQ`r0zT%m;I-I_-2IWwn|F4TUkzC-XSNF8fB$ncc(aP@O+oi0b#V!m>x<ZMcUfu)eTU=D{;i8j|ohXr_!D5NXzx(bp6=n z72-exnDApdQfoYz@2J(~{^q>ns+ajmbF#9cpE?Z6U_ZZmP(B2l<&%MEWOun55MX4q z*5%%{_7CV(mI1+$oP6H%N--(9+>#dW1p*`&HeEB*spQk*v?uT>BL)T{+8@5vYmD(z zAW3^XCVK?5Vdjg@BPXEQnR9U7=y9wtlZ-K{ode*lZ2tP@>L8;ROGl4qf1O&;z5)N?@FP*hap?6T8hq{Wb8 z0rT39;ad4~c&H#PEe-TD9Fz*hwY9Y_wzjs0hCkLE?+zRS_yQj8K=nG^a@cHBH8? z==S~sMx0)9aVpIicKL`rb~fJRc$n*;hkCK9!=j4QpfQ^aRq3y9x=cC1*kyz(-NlWH*$0hAL#*ji?tY6}DMMTJhDT8xDN z1F_4y?KuQN5}y%KN!~4V-qyKAAc(y6{Gz3>FjTwz`5WjWG)r*#UuU&5hMd?pC2o)^+ZfN!|51{syG|B`hWuIV1NHv;47N3C7&Y_`ef^m z*U$O_8yr?!UHZ4h!i7N3e|d;B%+TIXKxq_fmW(b2$n4V>qW~hYIjIN=T8fOsjy6)B zMNHPFGjL7ik2!YK{eVT40j%J8R^rM(wYR7ztbeJOPVT+vaow4X2Ek}Mg%m=|I4Cd2 z;^q7C?8Bnyfdu;yCVK2}0BE)Aw9k!WMrnw*Z6mfrABdZptOVMCl3tZZs|2(jxz%qe zI+N-Mkvi2VWQm7lT=;myEi<%Ja}Lj+0f7RDVbfbKysf*tE_kHe*(-fTu%ACevKMC& zggcwlR{^8xdlnqFkU@F<>C8K393MTLa?bd(5DLLY#bJDpc%pW1vu=A5PU$$lu~ukr z-l~#@F9$}<|8^ArH5Nu{W%`HYWdoLQve+r=G^#%mXl0^I+rNKE4{KRhd z4Ep#9ux*;#Wd%_NKb<#TxGd3~oKBep3~NVf3N8~}*h2yr9hUJ7STESPxNsr%EoM5t zHm8K+gD?&-Z?B%oANNb^3hnK>?gebm#%x3NdaK>6rQPWCyB-hlzxrpS#d2Jt=x2?Kfb9Lf8bf$M$)(h4vG^qi zUqV<|7&w&XzP|iaR9nE<;M|HI)bmVlBN&3(+pA==aW%mhnk-{pbR%@vEyT{rNy_6~ z(9!V-6t31Pw5`4Jg$7$v*%Rz^?r9c^=TLpmXqo<)rS2CKSZS$8!OF696Vi z$;fhGu!l9wfbU+X+i9|-7);qW?ra|0Ov+uhW> zuTR__dYFw(NG3HGuUjpJRa^v_8)!s3$Q9lHk;p|8N0hy3_w8)f(TEq+bvq~b&QCU za>wrNk)b{pgM5~$Hr5u8FHop_5uX3fj6(1@0&~@UaV1?CbNtky)#+bJaR(a2&o9`o zEjWhgFP;=7IW&HP?D|i3u|hUxSXZLLC4Ai96LW^)h5kOPVs7jR5<%zne`|^Mjqe9o zmw;TUP~{^QcF>xO`wun^=7g6KJzZ;>npY0oc(FYRgFmxaH(k#@LZwwolG3Ar+1G~M zdZ70WVN`Y6IgVR7T5F*N2@pNN85S*d5wkN^d>d)ViNYc{@ebzU@vhb4del!=(O1`I zVdwY%J5mS+T1A9Zl<0SjrIr^hc<=W-JBmO{#tn6=r|N$5s>P$e^`S2!i#S+HoC5Kq zu&3hynEJ1;XI5TL2diyTpl}J^-jVfL>W>~@#`EX>YV=wTm3G71 z&5qENV056}FTqKaDhLawaX+v<2KPd(eZ30X9523co)D4uRz`gZ1@aeU895b7QSp~h z`A7+5(>I91JdN7We7}YZ$QLUSIz!Ob7?0Gc(t%zcOxN7FI zWVftF-r>F1=Jv;}|M=mvz-iixo5<{xQvBYYm8f;ylMbYZtZOkekstlC4l`539W^0F z!x4O~<0EA!$DToA-Lc!-LnEX1qvp$;2Ad(!%i zB&`i5(&Tt;r-Py-Ha3>oZ&y|}L#6;ndpS1l6{U9VmVQvi{hz7D#aj^Gj{mK7Bj>jH zTnYls(yopK?`rh3*AuDqOb%@8m(f?n-{hy^WJ-VCWFPtN*cjX{ECSs%=%Luz&p;34 zWbTpx1qO~Lht>A6F@?31vjt3uBlvsV|DqNY5vZZ-hb>3`K=TEFc;o6h@Z@{Y(mXVF z+?V%nTmxz4DtH$F<_BudaW5rAk&!`OWF)}c#0lP5+Swh5VG6MG@Oa&v?LKvVM-PWb zA#h+R3{Qhp(1xdYA!D_HV_VAydOJJ2`^h+e(|YZv8jLkr<{rdyz~qL@%E*K?kccjc zd@A>S>iw91=9jm%-Gk_SqS0~lOPKuMf=%T;SZY2xQeDKK`{q3#oN%E^63))(s(UC7 zDxK)pfFBhqgA$a=oT@R%xgR3qEBbacLq&@q6C5R)DYAuWr`ZU&xS_H``p9{c-)D&+ zfp`3>c-dnj}RUlRk5+a;R$(a~gGmxH0QYx>#pI_2tP93)Jk;W2N zRc)L6dgW$cl^B43C7i*HoRcq2cM0Yf4r6f zS?{i>=&tM3oZUJ`vYc-3Pw*;PyQ3BKHi)XUYX@y~khd%ar@Q^+@1%~y3L(0L+d^n% z7dw|)Sl46;-Q!m~=ba1ckcoN}INN1id{l{F*1d8K{$eKAn+3C57ivlP7w3zNcx|E- zZrnxYg!%=t5Ql{gk zQ!s8fC*P%PlSvC&)4#6QU>yXf8~MuRlB$0YIUDmf-}d*J;U*TaMw%h`S}QyrvKEbv z_#?&lVFVHV1_BXGI9BcN(|tIDQY9)mr6_$y?#w&YQsh4l`9SZtoo<0a%AY1v2;@^u z;EZSUd7#=6KG|NRpepL>7eM3eR;1pE{W-~eFFc~IwHMH_pf~{j&eu)4{yW(o55paI zQIhW#ecrNq3wr*gsxf@~M>eL;mX;6_h&X&#a@ne8krYvcfW^qj$lQLl{t*F5-{+uy zZEekwn*lq*GGlCfe6`x-{rmUf;*{52`0eD_5t=E>poSTF5Fj1jh!Z+=Zz)&bGXYQv zKy78A*c8}Kd!X;|+=zKHC;+?%lrIke2=(83Yv6U*wBy?ROkIlEd>kh5WN&)n?Wq$7 zK>>o9bMv#fU@DYm)(bIMbc)Ys>K6f*&6~PXC5PWE$YPU zdwP@}oCjUpBFekY4@ceGUy2Q|w>k>!hDgrsVSh}g@^_vVVxK)$rx zsz3>;kVPqTH;#KoP~ISll5ec|*aL7YWLePfT8&!gii3e&a!W9| zwD2_Eg7w;WF(|f>ONHVmHYsSG43!4m7JagAVM1vV5FlJ&k|F+Z;qP}UR=C{WB$Shk zStYyhgjZb=h7xCHoG8j)GwZ$dn;?i;=*`0fqgi8axJ_Bu*CByZ33tCnc_BZp$3AWs z$zsi!`FSIJ9YVbc`u`?bk0;#zYXkq0g&~dpQfmcrBFFj}=X@xh`e!X}m ze)WAa*jHu|jIYA4>>mvi+fTf6ki(4ToPTq%f@8EFynWM8A_*_fEy14Q1>t^&0wdUG z4)$N&?@h=zVR1ki%CNL4Z_qpg8Mq6+*75b*WMgqk`g?4c4BgS;>vlYg+QZ~j+#chI z-oyH55fR80mP|We1^!nH5c!mqnbk>9AaoeiVt4V?y8&yB+o#O>L9163x89hc-n_s8 zsEjzGN9G?2aC@+%yQ`}Uc!D}wS{Cga0adXly0rEL9P0a>tEJ1OWM;}LC#@bS#!(~h zegs*a3L7Ovi2-kKcXz(ZD7Xs8$6U^PrqjIkz8ka*pdHzAzJ>|-JnZH?44P)>F^xah z`?%4uvq9nH$p-hCMl~qlrXta#J75OZQR%-SXD!B*3hGNc0JQ1=xd|dXdN-JW09eJJ zj6i<~+IvKiKd#L)Gc)O8K(;Id&LtOc9=sPk0R)AYse;I}YRx;~?8d>vdvXCaE*?Bh zYykB_6!>TH@2T%UwX(enf<~qkoQD}Z?zWi0G3$-OKXCUk+sd1@Z&g;OryRA8 zm-FrAM-rV@UE0lI1oIx;_vcvI*?Ug!0PGqaOCtH|EAFQ+(k+fP?DtZpsi+j79rpqL@BYXDx-;^qrU8RZzI+!QP7vFG_G;#nG5L(?O)MkSX$- zo9{|!I;Lj1Jg@#mJUkfX2!TKrEqOmvPQ+Euv9*~t>01AcJP-npih6R`w$otBMn@dG z* zkSZpnXfsz9-F!b?5rd*F{z}SvL0zGgF2DZ-PI7;V445 zV?n9{KD#<8XhtIDZ|RfeD_2M(@?;jp+b5{VjLs^;J_hV4a3q2giy%Ys%U;i1SzE~2z_G9p7cV!JwLq(s? z*%LB1Y{~{frrJ1)Jv&8q`sAQYpc#fT-SmkZmp#4orH$#d53p9eOP2$j40gnbYX&5c zEm54FnhqYD0kxOMAV~sw9bE|5oDMr=Je?tKoes8!6%K)n&?~p6z^+4@jJlsk=6S*{ zuYJ218boukV2%;uc~WS||A>cc(Xq($if4Pk7Zq&ejpD=2&(|a?+w(&&N^wDjjwFI9 zLs;IT;g20>v7m`nMY5xuXCNd>E9aityjG!HJw#ObHm&sQM9mN65C**I9ihkcbfTbK z+F=%mRC&@%L?Do)R*{o-st~74ep>*QrW9Ag(bCXR)6nQW{bZ(<0HuwjM245&A;uE@ z1c66JL?$HsMnqVoQwmL>(`JxFh7lP$y!ci3d!$ zN}~XEn#dKIuJUgq)1M!)*wS4y>M(bR`^k6~c3~&On^P}dY^B#?ynFtv6#J-;`ZV{`lzucHy39l0&OnDA@*aFPwY#GhfR>u#P@_4*cbgoq*&yi zif}O)w`>LmC$3-$gm1f#ZS;bQ>I)j{3-HLc&S4W|@5&l#fybsLC$k>crl-rE^gOu5 z8E>v$xUPsYE9v8QgPlH?b+v|5=DCFcXFIn0;@1N2*H;_eu1L1VXy{R_RSeDVDLAGR z&pq^#X%dFFVMSSi<9i7)suX|B4OB)1I zruIonLG`OlB%Ci|raW~V9r`N>JDW@)SDvA^2JOK6=~^(yZfaHH@gDOea17YcCZV&m z-jR`I^`RV$gQe8&xqydI<}hdoaUfF&=7XL5N32YPhl?wN-!(jkHndw=|Lt31#aOHy z4`~}JplCQ-2>vFqbeVYEp&hSN;gU`PW< zp`;s{4h2h{+tgUoO)p3x-_FRBh2V#sjL{{b)9p?06WcF1&_jnO18eosIVwW-`B6Ex ziJ&i_(KIu%i`y+QGEhM=%{+W&zd)!Ma<>W=UqevGcDI2LCz@b1b5cYyI$|$GBv%;~ zMSu~fRfQ~Vlz$*^xt@Dy8;NHunI%Sg|JvDEaUTn@NQ@2B_X`Jde9Po)$0-ce&W430d1W- z_VLde2RJ+X&rBgw|4u*Jw_6JH-ezfm8|oJ3fA>g-{8@3@9# z-hDO(cN3Uk$$l5)qHFv2K1Bd=Q}k008svK(?f`$fV=NKciV8C^B?dx@{Ekx->Kmbv z>QZUS;-aD#kle{e&^#&8s=n~c+|8Y&?Pl$o#|V?4t^Jmil(aV9WnSZZzr6klh~lJU zR{*W@`AXu`hJ!$hM#<~6m3_rSx{LDJi?oPjse34?4Dz^NLMY<~1L4pRsZi`1jod;% zwP$VeLME*1_6uKhu6s2Bjd zv%z9Kb6*!B03%FUXN3$8*{jt6L=Kw1dbNL9I{%v;Q;ZfboQQv>NJ&~w?h@&uLWQrr zl(VAQLW@3ICY+OiGX>59Cz|FSuFtqi;-kWO-ZUX1$QDAvDZNifsiSRZwgAp2uf!*> zhG6~uck#0Sd_E)p(icnAFJr0lV?s&G(23s{#WlanFr2*aNHNerA*N?r2z!6kocU?Q z{P7Ju44W7&3=|C#bxs#7#;^YXZVm$vG6h^)=wB)LGI?fA8<8)&=Ee%JqTlzmImuIG z`7#Wm%pwq(r>A%<_9U%?o~$pDS~jx8z#v=}88tXSdooSN9W&SW;-6sU>Yz}I@w<+_h~ z7#cy-M{HNZMbn*ZNDBku<9i+VjG&_6t5VF5oMYl5z_{7ki@~R+%~|h5B$ch}j7@B~ zAjtAP)eA7)<#ZtyS#Nv~Yj=Ogjb>q^M|>LV6slx~4asV~T83hd8Z&|={WI{tx{mdT zzk)ZV#*m>`G*+?=kA7;*%^?$hw7jLI@Fq2j90IYmWc0h8@XS~FbU1oEzl%JV)kzj= zP?1`sDTqOuuDpT_S~+CzaV0s6r$t$oOV;*$$q;IVXY&v1(NED+7A`!oZLO#n9xUy+3*`u6trnf*0rTAiJ}0fwXI-rmhn++=(X zHn#HxlW0KCU`>%10%i?>2BPML7LlJr7o+?sfp7BJHwe%(AxgTs%X4$w&doYyI4Y>X zYo$oddZ&n1X*|Q7=*^pG339PQv~1lTB1#!qOBMDfRDUq29NawrM!7gSnLW>vZ4w|N zk8W)Jd7K_Kbn|-tgN3#Rc?{5{dGFkertuIWhp5qCgBheRFgBXAu1h*4o7yb}BM<>L zHnOXwAH~I~O~mJdrLC%kEb8hyV0jx?ZB1^jdN#d|)g$#L2)wz)Cm=#j_~hsDICHH|g+Uj!D@h)1 z##i+x{EjBbqvzaeJ*WNgx+gPABQwJeDgynMRsz>^p7fNiL{Ax21*VWxBM(TrY{<*b zMhmucyINPyxj!|T#oQHtUS2As(=XG*<6kiDj$Q3+6O6v&8VBUF3w+IH;9HA~9JRZf zl2@xO%fRc#M+`MbMA+IUprL+iU=M-hu@9o?@>nJ&Q5) z)@iW*)l*z_$KR-GWO%r?3#}a0w^tSxU1z5B7H8jbPV>I%78(el!2H1f@Ze{Cr;DF( z?2UBO24ID!wR@iizrFw8U;!CZZ?~~K@!uj0n(n1%cF;>mE$&%Tiz(>~h=V;-i%H<1 zL&&Ngl0f~3=C+zsguAC*^yPlh$L)z5T zhow~Rr%!V-)EtT`7lM9&&Ncwa(0~#nAu(}oc2>JgBUsGwSI3KnWnVA=f9|}`J$wue z{Yl~TRqp&A$DfKy(#i?4r}w7*bgLe0EDq%g~Ul^|=%3e$*S`#}STkc?E@pgoNk4)7#t2;r?;; zXWfqa6MG@`q?P=N4u(X^7C}kVXm+Q+RS`YyXB4FP|EH+@t2|PkF_T9;X zmmp$HKl8NmQvWLN!pqgCPp?q$_4S4e`nurB+lMDkmsEBS+144 zMtgoiiy1??j*F^pRwI^@fgbUF);@Nkv4y8n;V?~ttdkS6bzRQ(&<#H93$EF@_BLO0 zUGH4A)FQRE>3u@{4AwLka1I7dOm4oV6s=^WVLZ&LNzF2A3PX6W9PLgE}7zP z01`%7kBT^2uj{DJJ*GBMQoriNBo7U9@MQ?q$hiNpoZqQm>eWG>nZ>DDIS5iiL>k$U z7G&9690N%H@GuuOhKwI+>2z_TyTssC)t8&HNaSvQ>H=UoWaVhEvx9_W{ewY)I%T^T zT>3xj@|X56CTo)mBx|)+=ItYTF~o8s4Ow9zI1!z;Q$Gt~R7w1JiI74~x+$VetEV;* zz6z{Blt3GgD3zgTZ*kj^sDRYa{fn2G(9c(N_C|+#v;l*Pwm$!aXv~Rn9|( z@B*sCo{oeXn6zo&e!_e%>?>UkbFzMXb4|Ycn|sZ=MPrRTE%PM~b-^k)g%Y-2@oN-+ zHH|y0VQMNq5mm=rK;Gj(Q zco#6du}m$n;wM6V2{`DW_=hKpr3BtqfA(^th0Z!&4hx6}knUh{07fl9iuUAKT7#fV zl}6pbBT`dKEBOKSnX~eYK>_F3rlvc9d@EK=SCTd?KY)Jo?wO1S+y~IbvhGGKc3@F~ z?}lCDMo4BRNoe=E{nL#-xJ!Vajk8-<^$`OYEdRS4r-_pR++bkBIKFaSll4$qSy@?C zHEGE?Cd@xv-5>qt2>?z^Sjr2ar2yUf6x?%1BK)Tl4W##w_?&h6J3t#4?iWgl z16ooA0CqG#_$F*N#>U1j+ckf5n}&GjYr^ywUsvJj$&t5;`-C)UEsT-ZwM^0 z?r0h74elq=PBYy5x1l!0WnB#@*EOsBAg+1*5=kR4`E+Jq?%FjUzn}vlU}3t7?b4KE zoZ>dVJ*UOr%rlk}3gtQZ_|pF+-1r}#&S?wg$ghfSN475@QJV-bQN*X{=I18ord3=t zX~B=iRX=>?9`dFI*f!YkI9~_q{E6Atx&jA{-lj3AL3y3)E9$70|4EtSM0{GA#Eqt@ zVN@hdn4*;QdMi3%&gMl%om)u-ENE~d+7?oq^Aw@LCi+!3_jk9}U>uvvf%fl#~k zM5C{Yg^7cC=N?^$CXlF+zoO91e(qac7zx|z#Mx+Q)#K=`9iU;V ziY!cYB@JLAHlh3(t!$E>P#*{rpo*FX@ zMCX8$+PtQzxY!yT$bfnQ20kSoE6>8m=X07>=JfXd*+vRDueVEQ6=wmzH2@4~TIRn1 z803BV`YD{hDZ93|XD|B$P>jfdNmqhwiabt4@4I*JfP>24Lg5E1aN`)^)#>;GS1aEW z=d3ipFQFt}&(;}kyhLCm>;(MU0C?#Q#>YEbTS{2KU=F}6z-6%)SS_+)gehUUj=#Ol zYly_d$M*#E_$?<-z$pW=7hqDSsE7*r^YDm-%lvGk^VVfgi4+QT!v65|cRqh=QRWul z*FX%dNIQNO0r>lXC1?3J(+~JuwchQd0bB~ezSq~+O-)T=c*Y(cf56xbc#86R-;}a$ zKm7_sdmdY7U4FM~+D;q?pM3q{#63fC7ocDlpkiG0IxGWwoIT~}&-vyvcm(F_m|;Qk z)b}%mLUlk(or2<-DQ=^>Dhkd_%36cM$IUFX)kb&KzqVeK1h_-2e;%IwEW>(eGS-TV zb9xI}6{wj+G!WFHHb>1L)RXR;^$ZG!=NFVRrNOzD{vm9mjwcGZ0pJ)L$ULkz>x707 zC;ffby4KNj`9Shsi9U`NdulZ8(6S1i3=6ft+TI!h0SEFON3+T1i34x_0(F?gkm=N@ z)sHF+rqKk!tnBq(y;?0SWXT{M;$hN+3H5}zwol7vdqKU`TN*6;Al}3ys^W*1Sb()C zm>o2)2(>C6Uk2->7UyFSKrEq!(QIih)(JTc<9+Om5YD+I{79W_($0{+@XL&cjMbNc z;wEC+U-&37QqA~6O%DEqWiq85277#-C)C@pVxfk90Z5MftPvm1!@yq9^fsVhg(Bff zsnFHu*-Vbzg^ct=tn>IQI^g)$wG`y_5Ub5*ZJK$ zjboZ`ZAD=q^w)xrbaxoYiV`eD1cOzTqob74Z<^z+>L(ZEB~7nw6x{%4MfR$JIZ5nO3eq(|4^X6z)%ek73O)PE`0_;EO_Gpo#T^+U?Xar4m<%2Oq(1R2em6Ps;V<>@>8)jHf`lxEr41h9%E6~Nj zTkJN=9=jyS0<7Ys?cOecRHaBwQ!}ZOsJ*StAh*d_@dWV4d;qE%#0o1$n;_e3%obwA zNf5bc+XkpmZ$ACmc;$?Je0=<@2>S_`|L`4D!|mgABdqau1W^3xH$NqTl4 zzJz@e{c1Mhl_QSzu)(nwCvix(bUvV^6i&B4EkczDJ~!~o)V!beyxg0^}UEuM|N(8WH4U>wj@VGQW7?=zCqzMKw(MKMVPRpNXYMW7NbKP#_+fri6u3{HfR zsSEfdbF+!1Cw!)$vIONPhE95t1(tHW9&@%;)#UdWnSIPc<~sW#P1-zw_=NQ&$ZF%< z1IPr{z3aBH%KemfC8iflsKEYter)xd#~edx#o<+dslQ&!fGtZRn7*flIizBBPM2k9@e%F3L z*pf78+BMj?YL_-jeFVH=9xkN-W|?SYZgJRa>}X?i2ud_}@Br7(LNrurW9uTH9rWjt z4u}PxE`^_*K^FuN8N^l^SXfal#zeqvi1s})aR+?kbi>Y_(KP#?`vpL$yl{LYLh3(( zE&2`gF#v2`2lyqpg(?(z8cu2z3rot&PmYgY`A znkE$NzgV&EBZi7`H>>7q)PF41t{iwF83O_AdM~dKb^5!uw;%Oa#Wf@0CyZmh8NvtW zkl3?Azd}U!T#H}9fgxx#jU}hKPNjkEXiAvG(TU~pan1hqLATV;Qb|4v3QX%rW5of( zs1?10$%u-{}C2nr9hv_lTS{M4o@NmXw39Q?*@0)^H z=>P`2dbgXMdMnHAq1!;H!}Gjsd7aM(s6gL>};0X_CM^gqyI!KojAA_d&VeO7`5q8|QCr z;0BRm`&R(hCqC_Nl@FDMKq&bJ)H_Y_Af)ww8Mav={+p;y2)%B&RfZsw!eQ^#>V6%(J%eQvVq(fc>gle(P`WMRw9oPyd2>G)e&IwgH}Sx_u)ti8lD5H zwrsG7*Ei3RQBYi6UBNB2A;Uos3C6NO4D9u=QvC!^7NwwqrJyH7E)xsvxYz4H0#mg4 zU?kjhMVf9_P-%f51i$I5h)kAgg5iuo$Z&PC0fwh0-23dDE()ylqBtC*VwJ$H(SfLa!3r)g=At^_2nid06n=?&4$@IhJPJ`#X>kybbTN;MO8f%m z+vB)8rDHuqbXZeS`lB4{1+ibnnDwW`hx-Q3dQ>(E!08#RKr4Yo)k6*Q`HM#LKkaw< zD%44GBh>ozz3BpPetE|86;^+jYjq12OH`O6dl@V?RNbNzw_g>Xv;zzbqiMjP2m%QX zPE1L8RPU)wmyTD@jmtKIgV17CkDZ7nsMxU`)*#3*MlT=RTa~9GkTE5jE71ad^xeys zK<7@^lRFeH7A7I+2go2ly~~>Gt`45q$2!UENI4(FHwUc7sbJ+ElW<@BZHQ?1`g!M9 zF}i59K#(JI{&p^^ZutpN)xI{|7I(W~T>H+wwQ(l^V8HW}n18t5HJu|;PV4y0BikKz zVciN{zv+-VD6Bz+RI(*KDU4suyK8*t=kQ%WxGoo)Ba2U7m8x^>ZGK+;m9C}Z31{yl zsq>|oaxJY-Bn-vH1BbWi85!kS@Sw5|6q)hDedY^HFkdJ=H@Ay`Gy)M3r#yohD^6=| z(B0j=24wc|th&T?8YVm28yOjSeGclCPzn3sp5fzO+djXkHZ|3k&M>B$tyBvR>bg3n z{hk?XSFpsui#w2yWYpz>mWjz1SU2Dj(qV)F_6B%8H`OI4IAlHf7({7eSTwN%@W$Lj zBG8@?6riSG_-5stX`zacshfwn;N;nw9exq;__?Y81sgvkA6K*Su7K&Y;TGsl33W?w z58tr$PnxXW-4#s51`FUeuC}R|Ev3MWu6kX&*0C*7xQ{ueEKfXvuoSr++Ja z%UMV26+EGK5-Zmwyt=S(rRE}72@mLP?` z@Xrw&R+o~stWrWTwzSl1%+KSks0QNP_pbwD3|TS4`Vf&A7q5B;AY`1JM@mJeIF~B{ zJeO88;gMyt;Q!{^_N||AV4S0DYXYynTnSdatV+YCl#KfCVN83=A%A~%K2tp&a`YRg zjCH%g8E1>tCF^2bOwFbO&5~BPNLTRX&msJ~`SQGq-iXW#pC}beeuj^KN-jbl06mcm0PoSt;vnc0 zjOYF(W->2;n#sCKneRU3U?np>74BhDt$NCo%+LyryEo@t zBpgD^#;kK-=;;x)olH4i)irO+&YY7En{pg@;q?G(j9op;g6nsiApimJIg1rT*}KIB zt;dTJsfN{wAH&A2%@Sh$n@HpDhqqOtbT6&-k-HW7-->BQ)CtWY2a6G)_G5(23?2SM zLlLMY00EEuK6y6oQVgO{KvJ*rQ2Au05Y-z_wdYEouTtOT{G*7uevz6OwPAXDw5qgg zT@hBawoc>C+qsXN)(i~gBtfZUaZ^rFcX$6ZuQ-a&s zn<($GqxnUl8B(6CN#g2E(jMOb-#pqC=0%T+4`Z)0JSV%XPt%AvIObiiv0oMOl1RpB zkK%-4u2j-!TgNjddq}fbRSJF<`Ce0_N_#vp!|ClP+{;?~haP+E;e5fWe;|AEv(Px@ z@VF3>Cgs)U^r;(P|E=as(t(1LV}X?kN%o+_uYX$$hYzcd9#_jBy_w#{sgSi>7eik3 zsJ00A{S>pM?Tmp{qE!B#i|Zpq9Z)Jc7Duk^!1|ECDw3VE^L{Md9UTkC+Cj)Ulf1u`xwYZ4iQkbzcRVxA_+lxi zcauSbI!{;|-Bhi;+GdLxM*?BR<3zlZEgaHm_B`2NvP4pj`LY_1? zLj1 zS&v#3WhebU+*kRXKCGgPr364d*IMS^;Qryt%HqH!vFO0e zX#1UB7{K($ew?dP=kBGHgPYy2o8sVpWVktpZ2ITBOke5|?=afYd^YDz2@D%^>_~m* zXNI0eG5N$mEA-Cuj&o_nxU_I=$ge-=-L?~47RlFgEbt%lREj{61BROKKV8I$wR(Lv z@o8B$dP->xg?yKmm59ZXsTLeRCklm%X}}43w%8sn)M!} z2){RC3%-xP!6%%^_{XyG?&0Kpk&fLff8Orpmcb(UQ0VVnVz3)$RAd$7h@uCE>Ed_< zR#m^oZzv_aNOk_K@PbiEZpJDsNC4*B&DV`+u>+Tpj->R&ef(ng`?HP z#4b=&)pk_dh$$$0<6I(kunuo3O+#MM3qs0cfg&dW(l-J7R81Y54cYtXPcZO3eJ4f3 zQ$Oe8j&^;$=ze00_?nz(oB=C>x%9)=)f4MwEsl0uV1;Y|;DC@E2r0r;8IyXKPrX5f z27Ng^bnp6LP{!WwM3w__cD9!y_c<+ohFjZKKe(26JQt{Krq-FuiyOx4t6Z_Ypov(! zfYB0717g+6mmWlOl@m>s;f(PqG1x?*=N{|{#)$;%6ISYJOV&J{w$UUZ8_d^H$f%K_ zVv{X`x$oY(hkAOxi_}rpNMtd^>e|?A4ix~&!`g5~@F#lzy37N59pS)l9X%kB;oTORa%RUevM%Dt zoxAy2Kc+tvvzGL1Q->-2c>y6`wI3bl&znBH9v8Z21nJ{L1!$n=POaW_^N~!94W@$!)V&g5yZD#IHm9U^*Q>Wzw= zf6h5**bgnn&rn({ZS~c&`)=^@hCg}csnT!D<_o5nzFiaH?w>uVrZ=rt1KbF}1}wDD zDvCW_s5c7sW?*E!MO!E=_@}D+Db&RJG_(H7n_|*Kb6yF^JSM(ju&R}4|K4=g+<8(5s|-1|jPBIxI9D%Vb+4I_l-;qyxY!m844)UiO`7}j_5T)C zcO_SC6gbtsCy0@IA=flpGZQQ;7Y`|Y34u-0^T&T) zjcXiY2q#~e+>WCeehOZ)NI<$QKC}*b#7F}cXA_&-KJjc5&p+KqW~pM2ywYu&+*LN_ z5GnE!6p|8V9Wxu+7w)>gWVd`N$ zbBcE@@a`X~J)?u%Y?POrWOgcRnd13l>6zfEi&t<(?j&z_wT;VnFoqi%PSV?E#EPQE z1aYJ>EG29~dd#E49I=#lNexl!m35-hPJeu|hla%R#c+_{X{eyBzkz=NdE06%5U&KAM25^3*nZLie=K zk%X6+k&2iszhoMF?iGj=@wjlF8SGJCkCgLQ>7R9x^27EbnII{Vd_>#M&8~80Rv6=bJQL zD7h39Gn*_WISd39IfIwii9I#E5Y0id1r)^*^S^^|r)N2Wpi@@r?{dM-fAnV%>E5lO zD5*IIB%*%Zy*nswdXpE>2`?D~#`Uo`zyrBQwYRq^2Ycpbe3%QS1B|OO^aFLurnWEK zkF3#$m@GMm+CF(xV&Lj0iC7*NOZb~_~%Jy?j9Zv5ur8+ zLrI8;bjupWNugDX8De+gCFJl*^xM|6F0bOJVg(^z`s2b(i%U7z&E2i*ic{LK2eG;- zdRV_M)^1&pz>02d$%ne+VR%sqSMUJ=YIN4#eiN&_GH~IY|&w|w<{hnuM{KW zAmC!)Tk+w;@#PMtq6M~7%%9GqPs>jxr^{MyLPVI8!X?Qeq%y`}X>Q-3phh)tYMu+W zJ9}d)R2=K37*ya~@FNdv&lOOkgp|R-LT|MMKC%7tO5FV5O!Pl@$A4dV2YG8gno{_;b>k*9!ae?hkFuJl84sZkd zT0G=bPz+@vb#pY_-YgX}M1V3_+nf$3S7lJMDqd2wOIp7?7W+t%OqM~yVyAKF5&iQeICyltc*)OYh zCfG*UG@+zjsqI|8!?ok1$wc@Ls#*LVwVX`k5Cj4{z8~^rY`2pA;|>`j5%=#4&wdyq zKLd+=Q9GZ<)%9a{M5LpnAmsaG@v5CYDRjYl!Y5>O300?H}7>KZ9XIB;>W^zrB+^RZz&93Dn=a*ibGzt+RM@OatP<7Oq3*=r0< zyuiiXjfzst6!fK|k;*b*E2TvAhsF-)Czfua5{(n0L@2(THdc03pUm#gAV;Udi7-CT zldT(hqxw^e(ecW|-B;fVoc@f7r0~X6#Nq{lFYc3(AQHxtvQENPT3{=RRmCULTGx>$ z7;88#W#&kO&d03NE>7|Hm`bd8K;TCCsKMc$!zFqlM_sUafp?^ zn?3E0N$$r?zJL|X?2zA&Xc1KP)b5mDhYQc)uA6PrTk{Z9*VK(A!KY(jN=`n54cstf zU75GYwW{jPVPRonWh9Z%8UbJ9a>K^~C)V*xN*U8A_=#GN`+AhmA`9lucRs4j4Sw4S zFR&07BfWXR(B$vmWAH7JlBO6h>m>1^pIinTSAo0+%Vn*a*sV^0Tjf)EQc-y>+E+V! zPqWkenf6@@c2{cmxdZ%}HXPW}6#$3DQOA|)T>&!VApURbG7VT&PcgoLtbcxD;p20dJ>O|=KY8p{ zwVjYGLJmJT4nO!!t--|!a3w=lt?U_fT35#3a1@_2 zC*t3dC^|&UnJ6h4mx!%?=S~>l+S=wbp;Tr-@vIGq;%EU@_u?a8Xc9~-gdRxc)2R8V zFDn%-*54~WJU&^qmi(~vx^oRTv6N-Rm?)(-z)5 z=B=^R+M&xvxZq%%jik`ASKFmK0H|fsaUq9=IuoF zt%jQA{s}&EXf7;cVeQNAN)wZlsi~F&dK=L;E16}$XERlixv5IFU2$Bl2jxSeGeF<@ zp*9)_1`P}Qu+4$!}ZkkBP!vPIZ10MS-#uFfmEKe#=e<%Clxg>3QKKs z9VoiVG?NGCCx-r_Rx!_CF5NErbKG`5A^Ahd_zQ`ib1?X#oSXDO03q)Wjr|h!Y2p_c zf`lfEu;Whf%CKa)5{R<$ahmc~6k_o?u5>y`A`)FK9O)29*q0INJyK|~Kpwk>J5(=~ z;IXsngB`u4C4=Q&2EpTI{>u-mckLG!&QV1CO*oElRa&(sx^ZXM|IHdY_V!>QdR*tw zu%39?yB{9`kJtHdRCjkp*C5fa+_}S6=hNnEP;nRV2(Oz~?ak8P$r9j?kj2S{gbJE?+*Myemm?Gwlnx{4>^ta9K0D+}1#3`C(?>d+_O4oYjvl(E@ z*Ok^7s0qeMSZ*M5jb8%oF*QaJO60Z<2>k|%|ItY~N*Bc_(LWgnZ}0%)U2lU=BIo?* zKHF4g51vB1weQVhuGKjJk9Gy%2o8qv5)))Ku&TN$uSdwIE%4nPXnY`MHh%9Qkk4u! zv`2W6@=Lj6MW!NR;dQmL;tULGuN3~$2U{XA1B6VB?k&X3dm!K*B7(hjubGpT9=UB60uG?`BLuFzR6C z=`kh)~6sz*gH@d9{`w4ZVHg!HqSRJdfk3OJUa^ysj6X?LwZQn8*I5 zZXY93v{V7JBzVEhNG z$W#zbJ=sk@3#xi;uM|rDSorSe#LK!(5%_`~Lsp_IjCOPaL#&iEPc~akbRZr^JBGYO zBqn7=7J(!ar8gu_;H>mj(JVhiB=dC|h~rS3&*^2vXsLVo?D>lJ{(#g$ErX7X75Xdr ziwHu+?88#Go?ATD%nN^!B&G?om;MyrD&eH1SYJT6{c=`l6U`C`h0nxq3EMNOe3D=E zpZ`$8{l;Jwj`dA6gOmt0)G8InBuJ~VBZD%K6%m&PUNS(56=}9(r`)wsYs8q(9WGHO z%XP}ax9wCbo&3djtBZdpEleR-2~;-E!8%g(*jaW5M1&j>K>?`;!Esau_8rFv@`_7> zYrjT$PIM;DK4gEJo5ON-jTF(o*pzuc|C@K``gIR^wsd@|_SYi1W{K*NSYJQVnK_|f z4jv1_mrfi6g!C#?0ygjC+CL$u8Z@f8# zc`O;MO_56-x48D{Q)MIXvaw?VmIVvCJ-YxBB72Xq@b3P_9zlhF-Prh!5ywbB(flCXA>Q58nl9ZhG_ zjb;#nVWRSRetN&Vbz%F9-Ub8a0mmdN>9F;6)V}xbnh<4->Osd!)t)riu_dn;A%6rmaqDOEfqN? zCO?#(OajBFx3?a~G&v9V`WyyQW?8N|?bCAJAy+UhRmSv*y;hpXnP*R;_~YN=Kzx+N zDQs!9B=ag0$NqnMZtlH4c#PK^RXrA?mt#T3dm8S3&CTuWJVs%>d^poao#+~*CvKkIjUQMjQ#1-0OnboIgJ%Rtn1#oBl%as+XL%VKY+D>Lus6wjS{JCs(dlDCo z`8?$}yea}Nj#0D8W51MvwUY~5<(b~yn~*1}F4%;F0A1(X1Ui&(bWDD z@*SOyd#P}+M#ZD4d-nZM9V&+yoWEo+kjfqZDkJvz@1+tZ;a^0Bo5inJ@m8WgDWyMU zt?D}}q{V0mo$~lItc-rTDS|{%eV9X&a%ob@l-(l+1bNW}nH7<(9J;}dZhjMkdBO{U zkpC8Ql`iEdK$=Q`6<5W1?=ph_!Vm%tWPOc}bU>)_GRi-f8Yf754KDDzl^NG4Hi(0UNE%reZ6`8dI z6d|n!uH{YhhbUj8w7Ko+Q!rQNg$-2FyV+7kRdiyfS2^f$kecQTN#XU#l9rB6^0raW zdFkT9cH=oZSQ)#246`1TYTVAm>(iqTZet+pc2-H}Ph%!kX_1pq}jJ3aUZqhYn*m$$ICP7c%$m- z&<3`rfGH4i?&EPBF%=ab#}Ia_f#f9Tr;XKI+P_;xs2Pgbk$u5ppU2;*&?TifME6RE z=SY%g&l4&YVaa(HIIvJ*M#n+E(JQDpnVRKWxek?=D;u12IM>B?^Er;`pPc>NUZD^l zXF(_Jl#D+4Tfs-zACL%lpOpfyo%B&yBxJoZ-Mia~S=aiH(#CaKt+U@Rt+w^^J%2yr z{Q`EXzggU$j220D&#I<{^%%+eo$N>7a-|0MW+>Bt8d%Rq)7u^Ais@k=EJ0VD?C%qFePLs7^MW?bI2wf1I~@@zn%F7a^JukK@0lu+1j+ z&1-Fen>>5!Intu~cS%z2BTq#f!Up_1ogY7>P{1QmlcS*tdXFvE*xs|H+B&1vHo?Wi zEHd$V+YhXTLBKxD%$H%ES?`Y~uBmfS>liVN{+UJMce#JgGu@NA8lo_7Zo8dh)*^Nu zm)&6du_T6fgt}8H>c_6fjPuG|2t}zxinqmM-F9(2_FMTVcx-Q@gRSM8%egNMVXOFt zrRYgqzxnNKD4=cKN|$RZFExYC?AStJRM)MaM#DeFv}@jm8TYElNqBGzwXAH=7xu>f z_WpfV>LNZCD;)5MO-cPf`_dz^koWjE3>H1cmnioUgbCuuyxp??{XHrMRD@syOU44r z0$=M5gd*5cmlTR%FXeI#X_c>ogccBpG^Ar!4gun!aWXNrRPjyj>H2q3x~;eo*@=S(K8PiWCx{Fvb3X4&W1{L^%%|dm zC-Wm6QNAR@LE3b5GM&-W=bP8Cc#H5VHw9nwOdbbqe9F`@QNZCtM!F%+H}0{JO!vac zt-ZgVryn#@t5Xq|{T8nK^|b%e46o^uW|he3xZy#*NgrfdEILvrze*(F==kUOr&m*6 zp=5BRDhP8@H7W``FZ=#BN7!L)5;puA`!}AtoALVPNLpfI``6aK2ZF9(TI|y+WLK{c z5`3@6)USQZ7pQhY)+|`!!hC-ZkW^_jpSZH%wcn6<+_(omEfiEdTJAH+;4v|F66llA zDUKRon4k)@Ej~K%qU$S5ePX}*Ga%=e#d~u~#Z%$(jUl-Gi~gjGx75k$-KFgNNa`DUoOL9l63VSO4_ZN;Cm;0+p6rdo<7#kIJ`esP(K(x z)7p)IdlLM6pj%(BMr;z0t+=rCeqpI5KO`D!U9X5)TBhc3P`aa5rL22ZlIKDvv;<;s z;=na++NJV|%pGXcsNI-^oHL!|5J;Y1neM!=ykcYn;_Tw?BiF}p`62#Z<8a$`^DtuN znk4D1`g%%mkdrg^8V-svt)M(f*i_$35f&#J(aEoi%{t10xLQr!;VZ=E&MtqBek`kf z9~_!D9RwRf!j?;yt9WJ{+ZaznEt!i`kc-q$l#!X(CY8& zSGL^a;fXUWeKYZ^-wMnlaQCk1n^$Wj)M1`Epm34YiMFmaRwRz;{@ZF#otH!gmE&x`0p|_N?Nve zR^PUoOj?3Sg>=DL$IHm(Mj{;r*U3RuVqagA{nsB;4c-bF9Ul>NvFeq@7O7pV5K%}C zLn~PJobK2;t}q6}RbR!a-i#n;j3*5tqo9q4h<$NvZ7kEL+S#n1`*8d8c7K&dtiGZ_ z=+DgBX}*gRT_1s?Z^fmu#Z20gd9;o$Sb3+6jW>Nq`Yo-j<5B&LPF$(B%L!E?|C{#NVw~T5PI`n5yWX#1^LF`4J&V5m7;&oe z>noiQ>XX5{ z>BSR6Rw7iXg)J8YJATP&?_1lQDKTCmIm*Nj9JQRgsouaDR>6GttC7D!q1UFR+@}dG zwdCGsi7=KzgrwMwFW_4r69+cC&uPT(YL}K+C!Q=z@)$9)IO;A6s1+2m(h> z!X%6}B1#%*Oa32CUm2BE11){%F6r)+ZUiNyyFt1e>6Vo4?vR%5Zs~522I=mu@4WZk z?=1hgmdoXX&pvzanb|YdWE}D|dOo+Z4oV9)aXml&Z2cbI0fX6m*Ib!9Zf>Fri>I)mXYI4DZ-l5+fMl+xlpk{GY`B?puS4(E+%S)t&-sd`FuLkuplO$%m z;C~LvEtwrX0U$jB?o?ybiLqgQ4T}YiMZek^&u@9sWuzUiuJ<~jn49$Js3h6hw9EVr zL&!msQ9rWrfj%3G}k zr!E+mkuZ^cf!s?LXcj&M2pI~~tZdeXBpc4*Vw-{+w~I3}0rE1K_UY=yOT?y~sX{Z@ z^Li^Yq*%_K0`m9Et33vIzyK{H+={Q4r{6Q?BD~DD(P} zk9I5AHX_d5oOTgWq!NSHRWGh`iV*B+w6m)*X6~c&o;FwczPI&_+85vJbt%mFcor9G zjAL6upCjj0d_3fO7ylRxBI*&{c{>xleHvK!?Hw=wQhRR4RM|PHw(2l%at~$lu-+IF zzwoJAhwB_x!RqiX`lb2!avs+-RUwjwl;Gi6uvq>_?!O70rPeQN#j(&|KTka`&RGfb z8bvj~6>rD!UsrW-xov3OyDU#X8oYB*b@*+mTk&n5d>7=pSPJJSaK^S?TRZ|M#dPTaO;)y$4wV|YKQyH>y^=;5cDbK{(I3|rQ7;PNhDH={Pj4+( z`yvypl#*e5@tB}bx_1dZgQDdRY&14FHWnC9RxWEsB140jPGDerPcD7aC@C!_aaONH zOjAGRtiljt5GT(dE2qsL2LZXN@4s2>Y{~_E@?KR{%&9(kUx5mxI;{}Sj-sO0=F-|J zgDD&=lgc^}b1h{+M25Ac`e1E)9+QAedR0~y0f2Yvz=iwEK0oZn7mqLKnUyNqvU`OF0O7RjO(j}EdT1DWS|R+guvX8 zr#a?E_;3Hs{+#itEqK36RVT4+b~L|43D_NN%Q@4P*YC|1?%qS_?`nzL;utT6pt*SW#7>NRj!x4wSk4 zu4HK61DmvWka`(1w8*}e=l%&O6c!(3ES_}!{5-jBmm?s^DS(X}3kg>{J#_4GM5n>SOK>PGo?Md9dHD*gspcIZko3~-(bx^Z~yC`|g z`jhhL(Qy=NT6Gou>Y^Y}|MqjocdZco7n6hI3bgF{9Q{f8j>~S}%;%+LOJXzL(}VV= z+r>++q0LG`WLB_G*avF89eP<-ilTXBHx#Y#Uv)%FEQ)}CFWx-|&v=aKdIcM=^3^woL z$5kzJ9O+w5*lri#poXx%W|*!=i$g^&33N3?yA=CQnp_uhWz)?CSehZvSZ-XA$zWSX0GL}dX{-EK0}b97gA7RQXkSu;S%;? z3U=sTmlUg7?5p)1f`%LfzNiI6D9 za_hWIM)%^ETu?LvMTAYoeB36%1fr*d-`|*1u&_Jp_`Zu7dHHfCaOs;a2)U0Ja7 zR`@RO`TXebp1Imq%#0Q8?2P)&mU+ecti2sMWfT`a5CD5jSF2TJ@6O-mipC=MB_GT5 z9#%${#cBg@^uVdD-W5h14e@~+=~dA0VNnp&(Tj=*ODtYYoX&$r3ZB$Q1|YJctJ;Z7fe$T8t}02IJ2GIi-4XITcObrdR=hb1o%gEV@a)-flyWNw!pI;71?DR@`x8 zi_RBtE!!`AX-Cdsao^K9-*RR;ZrHpI`LktV7MyLojTm&}tfFBFN_t%|fa*@%=VrcI zMsZ8a=)n%zU>5@e#~(ATZj)xg!ua@}U4r!`MZ6pwC;%rxkbIfvwPxMY39n~+&@1BN z0#?R&^inNakjQ^N$cL@YKNq%cNPNp&oX5(i>5!0c9(0loo)<>!-5X{v1q29jyqpcg zR(^1bn2vb8D=iv-On1~phd%h_(7(=f4D?TJSUfjy#Y=~+eBjMrXK50!*YDl0B;z;D zF8dIk3)YQAjN47^%>-~Qw6P%)cJTE3SEkZAXiQqJ-(Hb z&vl%%Hm8lD&-@vJ>5eftAX2iM45zHE5lZ=<`s1VcprDTP?33GgP)YSG_^xp5x)k^8 z)O>uacpBj%!JTZql27F4Osl4@^gsqg$Z&+R_x{P&T>pWg5`{Ft)4ohIe1`_(SHz_e zl%@R){Y*CdsA91saXg`WSz{w=(mLhkAjH0ALP~@VU`Pi2!s)48EgaY|9JE52Wk#w( z?s4g7Js9|d5K3(zhiel24_BK-k%gd9eBgt?|2*eHGf4rA4MOw-5Z%{%=YONZnRqPk z-UtEYzxih8V#Iz+5`V^Hnu%-VmOj+Qj42}Yc{KcM*8;$o0>V9Z3km91cpy6QqMCFqPvUd@K(GoL&@s)oupWqT12gf8$d@tQBsjDFG3jg(J2Sa zIiKO|P_BRyo7S@v%8kXJnUm2x0HF^s%x+#4x1j;W`94xz4X5C6-qI6f^QeMZ<0So< zkElS)!dG7xmy-Ft0XAeqI--1Q9yJRt>3pS-sWB8LDCFKJlraeMKy+Am2twh>4!O(@ z_UtI3*`f-Iz4^4{rG?bPsly`IbIXHM!l*&1HjY>a^4<>H=RJE~294jfj%P>&01c-`#jYHd-qc_ZguNV%~y3ZEf9Te6Dx^jz@E)%7{s*rG>Zb>r4O{q73vVE z>ili`?i8j>-k_Ozh*ZJ@bZ?_LyP|rv`y=OfHq*(_U`iMlY>;Xx9(TtlrHRjuO-&^# z3hnIRiRQJSqDzsH!8g&e>Yo7sLsI*9Cj>bTEU_pBO|NH~XrlFznk7ZLnfcEYN#WPm zDo04;LNeAHZ{FH_ZTgB>#1Z|rt_oy$m5h_P2rwaNT>lC#+_3by-15F?RxYo4z@=DD$~BN0SGf(!fS)HOk_<@X&vIk{Du+DtPGguh#q* zDZb|yx$?@{WQR~W5~se$tm`iAS+SjKd?YO&{)bfwneV!j@+zYiQ!g>YP3jxb@R)O! zd~1KN+rQ$WroM4rU3u!E{mL;?_onme7{aj^ zksyJEa=j|9f-K?(utGyO@i_(hb^CXdD}=^jrM^0o!78};D?{@nb{CMQ{hXyN!vAGy zV4kaxQKYRQy;*O08ol=+GdH5EXa$F@(4y{YSLy$F0ih!4*g}kvKsxaeg+Hb6?W}|itAsMuv z-4VNAEE>L!TH<1;5gXyc|O#jr39r{RW@+h~;-j7egK z_i^?bz(YXh3UxCunAKxgXq{C{rdVjTgG#TTI364rWUzR_r_j31`Z;>=J<=pa^JpB1 z@Mc;V6iFDnyFq4klmwKRSiLy#v69q|K{~mKl*pi6mYI61dR49^!Bg13*zg9tV3@=Z7k|9tG!G1{Xol-5sEd$fr~_yW=}?2ga&0_#BJ2sh2S_4I>2Q z^Q>1pxeCb~3yFDTlZj2h^(Yn`+TcpXi|6}T8?(z`Mv7{hm4`E2D{ar zt{uOi1vi+GTsl6?&A4VJ-{^0c3KD* zg2beb#d(k=zhG)Y);dT$-onmXc}NcodvmH_{s_`9{perqOi-HCY`w^4L39UV-bQF;x zE0@Fi68*)AUZBh!F%T zs83Hgb@2JjvR#a`kd~@n^6slRdr!D+wB9Q<`tZ%~gJ(Wf3vl?{{Hh^W3s??|y#=?# zg$loZBcg^zI_O$7ETYc#-qa|re@|A&Rq6#U58%3K%_(Lrz??nWt;Xz@8V6Hd-mqYp z1aCj2YGfve0!XuQ>kqO{rn$fVGGiLRWbs)L)v%r&>izGzmJjJxH13oYB?AmT)QEQP z3O?)n-fymbqZ#*)sb=eq{+sBgB+S$HJ=4r!1~ccTFG||~vwd1lXgrw=)0jFEL^p=x z`@zGx@=TE+LFQ{QI_{1&I|La?*Uq?e>&v$mKF=CFz=&LsvBf8^p<=@mlrTiHb|0h2inSgrW-o0D1d91R_?*Pn*#dIm1Vbl>i0#_%Rrr)xvBC zlH9PaB}MM8xY!ySv1E1^Ny6y5j6qcmykW`{bJfMaN;9N?)5)THM4);~q zzJB{=34-8?Ock$DD7#hduIh{*)YW$;8xisF*+~Ct6e~N#!;l3M9DUUDKDBYoPmj@} zc58z|8X*QYH~pC~6S$jp^M(g&S&=D|La!ZXciAsXiY9)-9rc&6<{1o+NMl9>O>4Gy z`BD%?CnxQKGM2Vpr*VJJfbMI@C>?@ntD@q88I{zeuArCD#l>9s z4oDkXHhD=)*TVFvec|iAMlD$TJmi2u6f|##c#QHKV2rr*5@(v65_Y|a5c+Ah`rT7KTWzoslm{s9T@I-vr zv84LqJDDEA5{vwxTVsU6P+J@da#z3ZtI8}PBvR2a;aNpOkWqn?v>QKQq>SXFLKVfmx#(Mur4M&C=@+F>vfG~u9qd(%gB0|8L zCyo2xkjMY@ol3?JoRodV=C0`EA1v5i7QLmF6=^wf>L`L8G;C(-Ag@1_`RbxbsszZ3 zC*p|$7tV_xi)k0EFn;P#!T1T0acY~O!v}AN9ZGy@TKR~{#5KyzDFCAA@DOoim;hNq zcmkmm9oFTe$d+VzGoAI4L3m!qgsU;Uni>vore24$ix9k=eA@f% zi*<2^U>vT-|JMR&$)*z1fooS!!Z&51PFkiYu<4acCB=j^yTs##wbZd)6kiqxb4?a6-Au`D%s zt*n1uf!K_b$Pw_op-PgRo1g!2to@DvXjQPs{lW{bSvm!?1<{slK~trH4*kEK9dA3s zbzM)p=Syd)NQEC=Pb?mu76n59&{H~2k`4!n)a#^5;ma-2vz3F=n_K5Kc7^;;JZN|} zTr4!zfQb>w(b26$$z1`H~=UZL3~<|>|Fsw1v8Wm}a=X$s(I z<(^3e|KhBIYdv7U)}UP@Q@DUr7C~n3Zx4e#%Z7Zqp^m257goF%cUwXo%GE^yMj&Um`QnM?mF|i=A!uph{`?j{0$OJfg<_Sva z3OO3t(ogQ93kph3ExG6|X&dYpKW)N)j5SX#yK0~)RR5j$!N_gQE{wMVBZc~3Cj3(T z!DsOVg{V$fjV%o3p80eUeF0A2HjX_M+T-uIPP-ut{wfQ-5? zsx`dgsgy!2S?hNysSsNt(?4#pOiGB^(V|%lE7RZ~Rq2zf$!?0|n)UH(PrtB+z+wv) z&7tHlkwLM_1ud%G|3Rqyo!&dkL0*a8H;* z=gxS(Pe<&1L7qWgJI~=gKKWv0`_0lnlGOF>5`4F`oh++(&0QxY!!_gT{=v9Al_OycL@O91-_M^Ygk4$;df+c5dM$F-utQ?87oB9FWbCL)eqt^ zGc&|&$LP7Tz38zwYCaj1*hahJYyc4UyW3rL4_vrIBgN{;!Q5gGR3UM|@bL z8h5+%%>Znc+B$GtY;=ank`%a^G6u^>htc&?>I+WH^AG>*Y=2FGPV;;2K+wo6Gm{fS zNa@lU5)Wd=N)1a+hWcMzoI{tOpJC|yuf9CCj5R5x6j@(h;_vL)pk17_q8}MiGzcgR zA3E281+u=-IAM);Y8r$Jk4^?&%dDK@N(CZPNGZvTSbkbDZSv~-Fnwn`Z**B|gFy9R z`m$-cfW1bm0zC`|hZ7zq;7z|ti?zU7wW>e&r04zqv`8^U+t;8S`vm2RQl_BLm(dbOC_Jut= z2#v&MefItXFD4Q|7H^$Q2??RpRrsRgG`W+=gontppuvz-Tg0KOLcIF@E( zSM~JX!>sh$McX|Y(QBR0H|`P=kUG}B+y@K`?z~ctP7_Hfr^dc1ZUk1*CTE(SB1;Ov zZ(kfveix=a3viA8R|TW|L;VBq>*-!Nt3GqfR~OxNqi1hjw>eAIOT^hOAey-EBgGcl zki*pFy%dNTeIaY9Rm54Lq~YMT-UD(BZ=dcy-3Q`8je*Lm+odah-htvw2A8epE3_mA zT;@6$;CxiD518FK@U(dlQxK@m8+hmQ_$QsnUl0xwWG8|T5qM}4kssEIN7mc=?v^S`*?BW`APYD?^O>cGSO zzK{(5s(nLbk%TXkze5R+n%CcZa9qp_v^0BvpUBoY6er5C8dvKwCkT(g$U4{JMrvrzv;R89f z)bxbE0I|*@ei$M~C2b?om4@kg92_%a$SU>~S=>C6T zbUh}fii-=_hj|f`O;AYc&2s=CTNiPDkiOWUFnjiYeu@Fm3N1*%q13g_`VS(yh zino`YI)#_RG*Jo&05Rytb0d>u(5h9#{T(V<;N96;XI~E@ypA6ND>6iHx~Qz(Mw1;U*dEmr7-SDVU)v%6Y394Wyi7EeE@@l4Yi;g3x zhucOV`n(Pb;6|;80Rsd3KUPko1x8__iD|hxDjuMYypTFVKE|=n$bqZrE@`oFZ02W( zIhQ~mIT~m0#4VSSBBBZPNaha@@lF9uC{Fy^sF3oaYGZbjj1GH6T4hri4aE#INUUEEG70Kj9*I!M|*pdd}Z7F*{;s= z2&*QSYi91)0(Em5wp+(+!Nw{8)`x^dV8UHA8V-?^nxT6%I(!#R{$+;;9F8{HXF_NT z39a$y`gF|3yAas7iM7KXg$VfW1y}jW`m~h!7q3?+NG$QIMf7wXt z$Adrf?K$gaSCw>`s@gN7V@Gb%X*3yWOVUF zSM!4IASRWV3ba2V2l7B<#9^RP484S@NyP*1ikr=<5&IH`2p1O^c%vC>%FZ7wA=fXq zB-PyW5qkzq`qqq8Eh(Z!Av_-KSPzn;k)weNR&=;r#*!AD4KobS15@i-dU}+A*wF&g z_r5irHFtP)@c~S|oT?@_A?5@lJl9^7kV<|>dzuOvr7(NmtCfwnlDaxv@GwILv}253 z`iC4Q`s19ZGd3&Bf&6PEtIa3v)fN5=Ft{6JD}$fpa$a`UxVW(4b44lGK7Hcj6j+|B zPW!eT>GA~`wBgVA-nwvRU*i~3ULG0aeZ!ndHslW3%N8djH0!LQ;v_%<=XZ7W??0Ux zqpfWgP6QL>?9f7;y$9qa-Z!OAEhOpW8ny^>xzDsq?G&Frg@_N10oBIZ4f18u!@q(5 z7y;k6W0Oab5Gf^R`9_FAzEm{|&QnxKzb#%UKUQQmWNjH}a%lK*oI}>~cG#jM6kP5< zLAnMsUodDPrlI*^x$PH9`T>KK`VnBf+A7H-9NGX+oF+w@nj$#Yd=3|km%X)e?dBN# z^EOBp=-0_B5G?EmF$I*nZ!7cl-{|3PLjcoYUVu7-=}DsuD(k!j*9g>eW2W^Xh}y1w zrUYUW60&nL96Ftb&e5J;g#kQ#E^y&dPt^ZW&%Zd+=61iQ=KA@Q*;1V~CX3Vl68wwd zgZ|y`4CCrV^y7Xc4KFD^Ws#TMKgat!hsQ3n*kAKiU%+b6lkh3vgNJxqNi$RG$#scFsczPKOeU zUVmMq5xMbwxAt~Bdn@qLq5l+jERBk8s{ zw8USRv=va7qaLc8=)GuFWZQ&iuwL6B`1!4f@(99D*_1iOWnVy`-2MX2B}euj_n!S; zBd83oYIqCJzea=_i)qVwu$D_|r9rMIv4lK`nigCi*rc}?O z9}5cK+v+q^2;s%4Bj(^k#f2_c72oEROG#mB?<5_p+1Gb}UT{0rZ6pS}$Kv+!AwGOizI0H1L4jh~?3e{Ex=4OL zCQd|@A<(O6YMLfp0STmx&d#sJpnpINy}B|=(&{gTL>DouYw$G)ED~nGE-XAmhV{0a zGzgHcmixy`gAR`j+tKq2H!KjBlMUW1i6^pu*xx^Q7=fb=ge3Hw?0Ixz!Glx%_g|xj zVF^^x+Yc};KP9QGY*vwhiVEU5`#@W@G9@+D#9BBgTvST~`@TbaHe|Y_tL0?|0A3=G znD}#8Uq1r_GDt)b^$Jm8;b89*Mg?=l^H*~-fR`oN=R^bq+0d}zh_yGKw_7(AsKq=V z!dgH3=jINdWn;wfC@LqOq6K!W3vm)?mq#PG9UV!7iag4(V`6t^j`ws=FR}SqH+-u_ zM_ybHuvk~FQH`#{m&eEkg4}lWoxI+9nru$(G$)8BRy)5y$sm9i4euR0x>9XLDP>o0 zRhLNmcHXi163$(AnGnG|miymG<@r9fUF^${b z0;Wgld0qF~{^hy?OF`?Gf5nq8f%(-Xqx_jV5`xL2W5Tt1y$8SzJs8 zEp?usd$pbd6`5_L6Rq}INVKfNyw+2*B=}ze zs|y8Qeh87qWDH$&?vE^12})=`3yK9(!Xu~18$NN09aCO$uPIZs)=%ZHbv)5t(LP|O1!3_hFw?* zI;HS#*blvXYU=mozBy(u+}*k8Y&`6zO*9C|7M(vWTEoj zJ)G{DpZw@Nx+B6r2X><9{=8w{2KRRVg*zVrq%n!DqkKqJgT1I!Lt>(e_Y+Sc9i_}*KXSe$exA&^vtx&CsA3OJgDkW;& z-E)b%Z_gz4{5qZ;ciQi-IZ;s=-?l>(d9S*mV%j}!Y~vJDzso+KzrQIY3_tafzOEY8 zOx98gBL)f3(mKiLj<;<%eKiyRpBk zQ1AR7wgB3@&vNzx!RYen{BGO}wj~4TZy|yLE_XJBa+h#y<;c)~BUxWs z_Vqm99yRcTAHlbz*)D3X;)A*1`{}^}Z|_(IZ@%JC*S(jC%qXb&#w4$lQbV)vY;%+cKfc z>hi*Vzunw^39nG7@yV_SdC~k74=FunWjQ&D2uVwM{%~eB+il$I8nwI@qfqFMH0k_( zqjInXy3OcIcT_lj3&y7;os-|U#fb6Z-@8+hvY)~?RlCrtwN8h5?oMMJ)7;tX)2>K)a zT1)KkVmA@|Zmr8553y&rZTI4J*`~fhFY)7Y)0g`_piL$g8uzu}t?qd5-+fFT^u;-Rt6 zxRtDU0nt-Vs*pR0Xq5FF}SF53hyZ}h@q@DayWmxZWlUaH6pH`}yJtW3R)1Y?)jU?~TWTRuW zudntN%DK{rQA3)1Wbox?yj+ zFsEoRry#;Wf1O;tXD^rf%82886GuBZSPcBCtlXd=KY)*?r#s@6eOf zDDD7s)BoG#8?r%~n$BKFI64~cKxD4j0kwjp4FLh@ep*}F5WE?;d$X7zhYlG1COy&l z)qL|b!F&mk;8xp8I{X?UR=v!j?X&G^7T86D#2(@Cgy=qUj9a-37!@d1YbAxPVE(RT z9+MnN&26Y4#iOC6?Wm{XlG?TB{lslnQpKXdP#`1meWSH@KHOg@Hjl1&mN+J^$3T<; zBlwR}uA&f!P<)so9Wu}@#3)Yl0fDI3BHguB085OI2zN{u9WvPCq^7I$Z9uzRboc%B z8P3}Jqn9UaraX_F{?*C;rTb?RI|&H|4Yv(2wBGb5dDLsB1Ej`KVMhnl+UHj+u8z^E z3kz%O{oJo!sYvEO)$?%>VWtmm8bXcmB&j$Fu!9XxhGmqnvEL?p2$y}^LvqPT=;XZ+J?HuqR(sFc_9PNEG-HSmOn{Jzi2beP z)EgB$!2IaGaBUEU$ehUF96s4LW_+f=3!3@z`>g1}$ht1fs5PxYcC&Df1a zADJkkUY?^Si$Y=ubvn>bTGA`wWaK0bTsJKLK}g|ahas)T;F)_CE(Mdqotox zTi~d0{x|w`{-0QQI&lqD% z7!d6jGlafx*BeWM=TDnnF+_a4`OxLP(_+MFpVAYkp!Lh_@>`6#HQiQddKfdzgF z4zWtR&OuHkcciOsbGhMc*D)8HzDxZz7mNF$W=4CG&#ReAw>jnbKk0kr!&O@8j#VKG z1Y|w9VuCZKDdm3$9I9s^QS?PIRvI_+9+zm3&h6kfO1H)FzhN?`HHJm0J2ZsW@{7KM zximPZBKqHC|H}YnM`+AF3NfUwI{m~YN1j}n)mi%=TzQ=`L}CN*<6$0!dbUViJ~!HE zMoNSD|6>Uz5oL^tElaF9&2+!fCj7hdJY1L4o7<>(yt5Ga`J`#RKaN?x+}@Yn9CJ^_G5ouQIE_R{~aNQ!%s z2XtV^B9M=OT#7B=+hfZX_QIk;1M1zc=cJyd6((LoNhA7oT{GnQD^RM+>3CgQ^NZa;T|4i}*2dw@cze$4cYaoO423EMd}9^I@z%((bCXhR}#UcWLV(P24} z>f3ThBaxv4vkU87e3p=YV`In-TG$c&m|>z0Qd@^bW&p3p)yZko8dw#OeSkEN1&XCr zS%0qTFcq$NHW3UAK5EFljnhW7ts0RVK5<=SWGe6r{5A$0-zIb)qu}hA+si5)JC|w- zq*)TA7r{U?;~?P$3&VefN8pXjF-*PQZzJ_QU|ZnYx@dU*0{*+lN}>YLTMq}mwz=Ax zzDjmpujSm`p#t59vrJ7JZ_JRi07S5Hjm62_p&0<0JY5%+PER9%>+SNgVa?x2{6pMT zsi{4=d9aYmSB1;wiFlhO7!oGFxHuq>j*X;da(Z-hg28j7*x1y(@{B56FaQ7&(e4|> zO=Fc7!tr5}R3lTI{?j_^QB9`Pc9EbEDqYH1PEtV7}GL=CchZzZ#?&Dcr;dXk*%*>QI z%xx$VCGF8t_S4M0G|V#GS#0t+3jzXVwCMU10?0z42+Hf{Tm!Jojv?x9@99>hZ~0eH zCF4uxk~e8HoXlm(ws8fCQY;j_nZnD96H?RpQSNP>f| zT@X)s{i|t-;;vJ>A`f5dg4P+jtZ3)l3zA^Viyd2pGFe;K*0nXQ)7DaTfza91`JWNz zS&uV57$jC?_N3G$1t=j-2o^M^9Cn3hlKovJX$DbAa*=Hk0w8#mb*D3RFQ=CV%9|R; zc}T^0d;JjYzG}^W@ZWU}k`*!R8Xn}|I5D(VHd>7g{QpCRqXNXG0Y9!yJo~6cg3&pn zAVD1VXIuDOc5h*K>YzR>BOUsIua`sboek|GKenfANsk)QUOSF&`K>C;*pewkb}k>d z2&e%QJQu_uMs#>S-F5tyue={nphe(&Z|ZhXDf7*mR&tVy*a}L%Swf~%&fXmP_YD8} zGj{1vrbq|+FmsG<;0H_bSU~nv%hCwr+Q8m?O42L7dJF(%J!L8UL#DF|!QY!`(UGmV z2%tglO%pQ$ia1R&^y$NX_@Y}lf1ypcuJ^jNGibjKuf`3ZmGM~^Mzh*k+z%ZLN&hnL zeR2!xFaBiG$B%+nYdA>MAHoK=p@4|nKSpwaK+QWj0R2~o@~>P*>DzV$skyen;nC6a zgxfh9v-adak*~B0*@c$DOhFf$RV4lP$iR8o&MAedMZlq}+doL=ox zGRbgUa?zK?)lqWvzwww%w%$N>Nu$ZFG(mEh)XL`O&VqO)HG@d5q{5`8`d)aJ3|rt3 zG<9AW_T$6dJ(}Rfs6@FsKcK3b=yRn)nk-%DWR(v9e^~F%^YUJn(-GCrHXXdc2ryxE zAT;lw@~pG7lN=Zt8TngV*ysyFWnmoZ867Q;FXKFP#uwE$B0P~$?djs0y*xPcp{=fBGmJ#AuO@!MIsA$ z*xvR9e{(tVLs2>m1nRt8(Y_B3s86&K0cJ9P@pIK_+A@FQ;exD>@lh~nuMu7j9yM#- zJGOuflG>37s{cphoSNu}Rq}Yvd4%rX-YmS17sSS}Sgw!ru;)SHj0ntHCt4C@I@F1T zed%)PT;)f#a{6kO(j8rYwjynP@!l3|4et)FOhvhAAS0XU&F^a^7024jDo^#i9aZu{Mq>3*F$O zWPhir^}dDHUBi*DHYIM_eRY|>xmEmBFL;r9-B-5o z{o@2vqt((IirWJIFJk(bAj(eO8o-OM)eA>UL6dbGCSW)PS~vmiO1xiSpRZI{&-fmg zk2&PCVUY&#G*S({84>5IZR3`*!O>RG`YBrP1=mCvyg5s>C~ksF_=Yg>KLW&Fr!)jn zdVqDvMUe0EK+tntH4MAc0suNaHZcKoJ*f`np8TC z?UOI(S&bd%klIsTl)wk*9-43l#-n)Z(OQZYDtRJ)M`pf#lfe`aWXW5l58IBHIpK9U z84{~$o%b@Nl|+XQ69J%cY?Yesv#!=j>!5|e-*qzs0oSiTNsaEaJT}s7InK{La`yYe zkm4*}E_#Zn`MC%h;v~zP+<0*m0(;qz-L?9D&6enU+|r4~wYjRFuR0_VsTHg2?`!i# z>!(2g1DfqmWtGghXoglZ9GpAs_$YYjkbl0{$+o^i4&WJ!#=-+oK6hPud_L{?fKB7c z#^X#rLlXPp6j`uhXd14DJ+F;;J~2aB+)>v{_#XJ--FTJ%}YKGWB_F!6ken5>d=M$Bu* zqE#^T&Wm<{Rzh5;Sf%RMgDl)Ma7M; z&-Zu}zcElkW{^3eb2su(x4bcNfZRNU%MNDONt{i#@nN=A%oTFlrAp>PGLgsO(1|j) zaNj3fI<+xs&#d2at31|(aq|u1;oCO;IZ!m)EvB)pP#60(fhHjuV`l$rip$?4If1hsZOV>UvYKsRJV3lyE5UJ*^T#8oN|0W z#7eYmOo8UMq}Uny?)GRrfBWgDG--~unfMmg{L><7YU&t!8LGe0;zhh;<_ClwN1)!~4oh9{B*iSV!sp&WX_EJ}bIB>-#?R%4WB4VoHnZH9t(8 z+xS-JIS!PMS^d+;zz~IjfiX#1WmUf!FP|YvNiD}+OzwKG55Dp6j6}H_@PeD<@qFhcvk2=a-cw8!BQ% zP>-4EewSYudD_*?&Q-~J69Ocnvp;!UF#_n&Pp2$jYTeGGH5r)`*vLv9%+|zpTb;i# zCy3=u8%rqU@J=&ITil&23CCfFp*QgZ7%LF#@%vo|C*=jfao-b9TTb*&tEpuyb z<}KOUgbtl-H4m#zRZ^T)fB+_uIKK*B4ZT+EuTaJv1R-Trb>5wA$9%5e!RUDSM|j?O zKYWw3LU`198AU4@--j0yDZ6Z2=J~A(X7I8{v2?iTx}=nG&PvVul{uUWKbRonqA%~V zebuHz4+Uscdmfau@nkjlVj48tdSS7Z%N2^BjNzQd%`)3jj!Q*>x}1`1R|!B%%9JJR z45a)kl|Tra&(BR-7q!3S-WOQ=xm6>emM)i({rll&k%2`1{EJGlknLzJ<5($cT&U)i zN~Wjmv-q~F_O>UQun}eeKs+?YQZ=;3=cN+IA1SsbfHO44i&!vZyC6=PPaM@sYm`k! z`0ZjekmfhTtCbvnis+<;vL((wrciMy#-JaZhzwi=(47^%Mt|mH%9+X#9ofXZ4h!WP zEY9JeOT4@7>v;Dp^Y$ihtd{y_*NbVL50m&ewSaugC`31v$qhY$*z6}T5sd)^JiKc# z_jvD?oxAqN*^w2+ye>s7$~K@c8Ezab;ry%FAq<615lA*?32=DKO)l06^b;2QYMX5T z!`;jujs=jSdhb{OL|Y;Q|9kqPWRrurOZSoy@WZiKIS#_K8xn;*=IhM3xR~6gMx;Wr z)!8`^;2{Swp@lI5)#a^rO)`78Azaz}!ca~;wS*^MFR{z8JwC1cvU7gwNsfy)GOi2| z*JuZU7>f@}F3wb-omzmr@UrvGjT4nWFUc%bttF#dQt{HR%lJWR^Najs&CfzF@t+AP zMVV_V6L4i{sfnJ!MHv2b1Y7`}8e+z0ek?>J8&y{n;h!s*LlfLZGx^H&pt~=a=MLd_ zVw1l?Dgqy+;4TwRTzC9bH*Jyld_V8&c+;*UZf;sQH#%>CjAxjcm8GVweY@_J19XE! zYP5Jo=kpm9w>Hk`rB7Ga?GJO`_il}@r~VSD`>ywA7N{O{fasI6jGRkn@%vidycMLs0WZ;GitnQ(FV<2^nJ{xgP;XpVSjn~R zX<=diN~50FIFX*_rXLVkCiA^UQ?@eJ5Q6lPs>Q%)vGUaSMWTx~fh`OgH);T4Q|CCy z_hpb2F<@$O-{$;az0TZ=6UQ8{wOwGtXr}Y|&9X~yZhg9|z{t;(FFm_u>*x$W5=8c- zl(B^4sig7@=sqY=)f3GBV@9IM|L*KOa(ao2y^MQ)sU<7x9wlBOUllEG^z-L7thaOm z`z$N+?j`h6z})$<{C_lkbx>8`_x7O?5H3iGpmcY)ba!`m_oW+=?k?%>776L@ zlv3#~>3YxS_nr65`GXl^?iu#kYwc$}fud*Ny<^JaMk!yI6t87jaV>tkyU~P5v{Pws zJ3Z#DT-IXgaMGY|EHluI50{(eMnRGQL+>I=yOY{&^Ek4};ma^Es~K5!#^)Pw(=vXt zM#@FsPM-O$ZTu~<>oj}{1y|KAH905A_26uDs*CMg3YWx)3)xjS=zUIxRHIBzPHJXO zYR08*Xw+Nr!SLR9eF+x{!`q(oM~d*R8MKQ=C185OkqrL;o%i%9lx>@##ZwzT2u&v!X+CL7Tj6 zG-6_8c&qmxrxC0ZC{O6sJ2A7Zm9u-(k+V6NS|#^l^7^*GEgkk1%Wb9(*Z;n)uW_01 zj;x?kKFA!_(wgo*N5u>t2_4PMVhF5HoBSR|SWOuB@vH z8#5H~*dP*Q_K!v|LK2w3`9))QHo-?Ms7Sn-S6@p>2-4+0&UAB|jlYMU-yS$4zcF&< zF>BG|hOe^;=8v_Enxj+)M^nOg28#h(lP`0%-I-q{V7}FrlpLIswDWu6ZO0+V%HIo| z1|h_H!CiSw)z9_e{g~M%TDpyUeMQZGKW>02Bt!E{8Eh=i>>t_@yooy5jYTJ^7vgdb-NHBS=FCVra(- z-f_2-RO~NDv`p5#jL6TkT3&ABVX4KeJmOtK=E&HN3WI;crNX8z!{L!g3yj$IU{ON zVZ2pzB7|1A&bfez2K?cws$JPQJiby=cGPmL>q#7Owep4>4}Y5vtn`P=oWrDBny$g{ zj=RupP5OGoW$cpEp5KWR!FJnmS>2D|+iat5*8ko5#Cq7Qewuuafd<;9Ag||=GJBmU zCgDl!7*Nu&oTUEvvY$bb)$HxPsCmkaL_xu{w3}wDncUgNJFh0gHQehmyE56SD z!}c=MG)jEg1k@+6qo!y^Gu#@E{Gww+p_2Ie6BwQQE6{#k_377Oz6XVD2=2EbQTSBc z>}pK3H}{C7_(QqKHv_*{qLgexzlf(9MKr(0SX}*%qU;X9lv$;tV6AqCtn5H`Kk|Kn z*_8W$fM6~m{4aGH^!QMLATWN|6Hkl(@6v)>BkPmQd*#4|2d1^@+i_B28!qYP8$7rL zrvv`o8zzx!FQ&6|CMyr;TUue=4-Rd-+XX>_y zl9wFP`uS;RU}r3Cs@aW@k9B?7>t$^*>z0GN0%n?Ns+&?U{r5^E8IgQ@^EKBA&L?G? z#IbbRh8=VPQA_}sY*{p&di9?2yFFv|fMssG8Nxp(lV<+S`rZl8IgX;E0N?XH!L zY5V8|PB86m*viR;_V05@PMn5%S}xBzuiQ3^4>8PBF=z2Evf_1hOEORaZYG)duWrzC7clG3pQEcdQ$1faE&!zdE8(U@x z4Q(+WUSa_d_=B{<-m&{1c#{5mzr8~-bn(gGQw|ae=D>RM3j#{z$=BB$^`5<37p{c0 z%5*y}68Z7=<<)NJXfQqZEubTPk;W80^RnG;;@|8p|E2k4CaehgF`|bD{T%&CD>us3 z#CP8sE4w?Obxqus{UF8;`fe8l!AxE8GoAnFxq4bo_p$QywekdMD7JgC2;_s5h3Ft# zUYvBMO{G5ZyTVwztaoQg6}zS{Q;y?NbtN6kq)z}Nti1B`dT+Bc(PmW$g!Vf+DoA){}_m`P8p@`)YJYb}OdM{d;fwstuj}T&bJyL}+vp4=F-A1s$ zx2mT77o^jtnYfpCz=rQp2som{&FlEScM69g=$S@+gQYKp9Q@Bag!N0}%=--5(TS12 zZB4~*u;7)|wUiiPrPPv}=5ML3ahM2m{UPe7Y zKyF4<$5BiQwYt@x{3lg|r&9HdI)>@k?B%0k?NRCObNHzD9(h`IwJY<$U>Ab7Of~f~ zXEvTCq6-9K$xpu4ymns8YbGocS0%JdwxH};C*e_33@&I)Kl%+5i62WWKyA#V$V3bF z^M~LBa*M?=ItWGL!qX#b)`?Zg3$3#{2zv=F(NmF@aD32m2q8j#9+!%tiJ(ZTtOYr7 zU--Ya;ID+}JZNVa;BvWt)$MoWK~v~Bunl+nT`JF7Z>p8NZ;;-%YpNCvN}fF4c$jG{+s+%Gzp9doVLSK9E9lE?U<>kd)U5}7HeIx=oXxbW#Y1YlZ7&vfN zKODV*#lgcnURxnXh7Cdv&fdgh&4@>LxEo??KKhQ{%QC-lswKkzML&V<8T1TwqeLTeQ$g`UyWsYLA(6>_jj zd9+xcmltO=LXfQYoB5>_930*aud{i#O|qJiR9F4~lEmrgQ08gF^cb%^pVm7=-o4wX zkp(@QHRwPQ<{nZ4C}|t>BkN52&&lYaQ7;U^^^6c1Hbd@vIZfW`iRv!>qlS%{*{lWI z-XyIW9?r_pkN^l^ZEu@h6KRvSxDrGbSY<{^z?dH2B5=p1jqD#}e6wChlb=H)^M_a% zhy@c1J`Tgh#9YHm``&iEq5$C7!)s@!_0w~;;>3lQDDwJi50N}y%MRZ5^KYcrFD(8i z*U;OIc{ODN85MHT#Oi81BqYiH!5|@KNV=^k5xS&8wiSrC6eIuMTjm4hEfHI!76OD{ zLnIJElHJ|@jOxirnn?cn7*jV5cwn;yTZv|!w}a_Bo>=)>^ulxBR7T!sZm-C#PZ9EX zcRBkM>vTRb_l7A|VuN7s6_(*kC ze}h8%BUjRzukrjGOE+Hnx5JW>@Qz}NTeVub(nm**Tsy5x1ZdT0hKWL>733_VdHYzg z53#UlR4VkNq9T2pabR>*tl9BD8ixGT!>bdKnLHVL;QWBDSTsvtsA+N}E@IT}e3M6M zl8e2nxsUQvaMSum`iK~&&ch{~^m%;G>oF46G91>5HrT{kx6p-SY4}0^?HG&I##cBN(wVM?FbQ1(@FtWpFOt!QhkC6lq=`ITkT$T z+DA_@n4-YSp^EK%P~5zYjrs2VU9s!(Qb6%3Uq)hd_vCOo&A+zFS(2X6!SA*6%`OrjtF15aX#ESj&=F30CYMq2CZ1lH^$19!YBROJ)7jd7h*BhP& z{>}NG8;@1DveV0+gLN1NE=afs83vI#6D=HL(`A1e^ppi1>BtJr(L@u;Mc@Jchy9Q^ z-`y7{a@zA?JrLvDwc-ZNb%+xN>?+F3^^~NdAR$MBgR_9iJ2Kh@}&OIv?m(P0m}*Ya~#539kj9 zK_bMk-lXDr<|q^^(-B)c1UYn^l;}E0XQn~md*}4^NpNMq@)q3+TD7b)FfNe;^J;jS z$y0i~y494G3+$Y`ABkMECcMMf`3;YVM~M$@WYuZKkM2*e@Vwo1nrFB*zY;SpD$e{h zK}QLzDxBldJvD00Nc-#;eY>ufrXxCS!vPK%W@EnAnB zYL_b1Tqizb2C9@R(c;{$`|K~z%uQJ8unbOhpC2yTH!rAzgU(-}Um@@`$WHsy45f;# z*}My^f`a!+c~6IqFAs{=UtrOOVsmg8m|fb(jnZvhS$TQUfuUH=fSUxx5gZp380p{b zqL_C)NA6l50n^5nyXg=p)cyLBKj7H&YO$K8{{?I&B;0tLRcIuUVSfJ`)H>(?6hpb~ z@}*$7-Z_r=x0^MnBAaE<$uF`G$HKBjlUEA(zH_Diy|?*zo_@*kZ@VS}jjBo%O{d12 zBpuFscO8_Jw$o{rLmNNkj#{Q`dFJ1)xu>qV4)A44_N&I_8@A{XX8W+6DB|F%tOnO z8f}c~D`(WDGdhz#d*GG!gIiR^RQ3oxb6KbG$It|`90?>OcD8!`3p6wz{h;OVvNK8 z&jlEQBZu+eIBx%P6|aE!;z{tJPk};k`L;h0bPmvjd;9p@yl?g>PG6m@pfmw14RQ?9MqXKxFR>*=rDBrziO=5KY*kS|S3LIKn z+nSJpNzT?3+*LDHuvtxL;)f_G!5fgL2O95JRKSM&?XV#~I&Nf2)s-(xjl-JK2Z9xQ zz#x>l7de7%9wuJvY)G@Ims~m?K5--+bbLh-hZk0&v0QhFstDeGxIaUeUqp5`y`GVOG25vlr4ZZ?q(c2oaPT4~GB5y$kR#)RPQ$S~ zXozpcv9ut}0CBX~NZ+wR$&fPwODP$yY`@8yJSJ+~5KCL45=?On+1v-Pr>D5S_eT6R?WS}y5A@Ur1dadyU>MBl=b(hr$y zr>5WGUMa~@_H798Wlxd-o_jfQsHj&rr`EGa%?@$5owu=s0^T}yYfYwEe}8o$+cY17 zC)?xwWAt#czP`flms-uP>+07*W_Fe_yC7q$Vim?TwmhGwIU=IJ%XV$Wt3O)bLDEb|$LT4KLNk0X+{4Fo-LITphGePwaSH8PP^`JIVoYz~a6|#bR z6Cs9XxBHN2eD#-A$IaUr$)V3L+o8nBmQyVZ9*4pC`G1r%N#TN|NHO665OGwand4*H za*K_L@hO<`+`5Sj3aaSu9r>aQe)^E48ZF<`9bLvVn$}a zk<01mnAHlERvsS3mzm({D_OIn${Tp%(s{|F<4t*>j47c73olDnjK6Vy(jVrI!&dq) z$f!wwwn^*s7}k94S@eR?r*fxU9;U54o8g3zlhL->;DK}4P^`O^D0~1M-5wZMx|f)z zXfG2ZV%Q4RrU8KRk&_EPP&1n&^}lO8XpcK&K}Sn>Y15> z$Uo0)yvZnpjoA}Eh{&H%=56_O^<-`N6t0tb{21X@pWXw)lM|Y%O3jfP9-4QT-X@^S zz@DlN`;Q(b&^>c1rraF}JS`7We3&|>TXSH2AAC_KQDS3NMdXAoPAZr*0*-TGdUgon z27)E}dOaqF6!n&yUDbnCgN4qzHhrh`eNx+V$~++yh$aJ{D4G%Do4ACKjpg+2QOB&X zf4ArVaR%zN(B?RlLm?9I-wUjJt`@1up>av1i1bEM-c00qd8e4n#KGwrisSTALz?r* z$nngsm2|O?AZjna&BjkmtheCS-`QqivO zcVWq%H#cgfB2HtenW0JDAw-Wd)u`5Cv<%MwN{o#9U7lX5drnQG|j|LUR1>;kf_?pEZ0hr@o&Cgvv7|)lQOfWqi zXMRmSid#W&TvHKNB+|je5k!0~f=;hQulM7w_l?~Tr7pQoA~>;EaA~JHXOMf zmJq3fp10r$90xw%S`w$Pia*q3^yKrBw=|j)OIB?uM>!Ujj*h$IseJe`-%@2snW1aY zfDS2D8byg7C(WX8?Oe(x))E;-W;T60i@VPW!W-9_cS(2(as~j<(feaUt$wwkSZYgZ zlX*@$b**hfw2e`Epc#aa5wI&X%`&=tWjNaR1O#L`ugpu9yJyZRf(3s5+2~P%8cn|^ zh`D@kSe{+5mhU+?V$;2PLFb>rx|pZ$?-$-qI{?of@gXRN4rHfdC5@%a8sf9aiafpk z)y7&X5Q;l*lL+BC1tCV% zzmCC`_M7{Y#7x-#UbnAC(Qgvh9uKC_+&!G=eVzvJXrU)8D|-s@%H*(t--d|(c>+Q; zi(06tpndCBpK}nYXJh7U27^Q;!@fsjM4RQjx|XKmgeqV3KQ}lbatQb1r0$H-^j{|+ z@H4JX2VB?Wz5HG{W${Z@<@3{iv7-8?<)m(oZsPZ?JRe;u@x#`0iO@p7`yjo~tV@4O zyD-iQ&E12Z{Sry6{QipsnUsmEqZQg#L|)8i%wL(>y>=KRT#9_RGhxa5ok`d@zth-u zz(ulyv8hFm&{^K0oaRq^3jQb#4&`S*^p3E-F!e42;M+nOL5qf6IgK-~WDZ*o1x zd7D~Qm7IDiPU;-H^C#1TT$*{XV6dp6;VJHA_3ZgP{IhFJtZ6hA)p}AATS>CIy1C)~ zC?41yCkc}S1x`WcLBt~melQ|=UfVCbY39k>F>t|vITq$idDMq{vOS}5Cs!w z^Lk1AzSni^h#*gD9iL-GMT1zf3{Fog`3(Kh&GUI#IM~V*Oce{xa`=R1aNR7etVT^} z&SUUYqktMBx>ddBb9f|E>L+${T!YgsJ>76=w|ng2RCSg34veEcrWnYw7m+t<3PLKm(TUct+Y7!>X*+cOiyk3Qw`yKm2GYZxg{Q!3l-&WlRq@KbLeK6igtcoLiljr*99}fcF6I;BZHFy zRp@iaO39bMuzXm#_>s{V;Z)&dTYU-Aifi3#uuq5YBjt)_t3*0*|4`bFpeS&}g_SZ1 zUd^}ET3Co-Eq(f+c3LMB4ksK)5^%XiLiQ(UbRkv}TcBti8blJbB6X?(XYjK~3_EC> zT}|gJJQe&qX3Q^KKEGpU|3R0`^6pU{-L5ZNPF&t8Gd_zZ{vUX|JZ&VWqIR8|RpI#k z{t4+!9*tY^$I~oB_w`-22Du0j|5bt~6#>wpOrl8vdcb-j1$sVplaN1I!@#|atl$m2b}zr2#s|nr%%X|2kzYA)S|gCXj;Hd; z$a(1=R&d9HJNkFYHU1$Mc5BW9i6PJz-b{AFMwY|9nF9RMWz=%ysp0sEpH3Q!N>Ts# z47#(YJyBwQi;p6{{t={7iHF5{@+U|+5y+QlNDi1>>^ACeZ8@;mnOyUM>JnpuFD0Wg zu46K;l0$1b`p+K~1NZLh>x;@wiJjz`f)-mger1}l9OajIM{p?`IJD?Z7L~a}o)1+j z1&pIvz=4D?A+N8jxcJCOlBHsf!+Qd^3)osEY8Mwf5OYPsShK57FADjDyl`?WJUA?A$iLKH!Lq36pdW&_x!rhDN!OMZw zc>Hw-iaqlc>^#w^6i+WF{{ z-rgB+23GAnT+@5WK)(umEYPJaVFZxQ7aQHg*XkOT7&KpC_M6?cb2i;Oa)8Ce0&xk&qz91{viMZP4ML%{ToBby$ z0GuKt_Mo6d%E8NHw(`OQp0}(&X5gR}LKk(ch;YLnbkBtUS2(J8OpN1A(mOE()>d68 zkFPkoFKmqM8Km{y#i>dl(=I&HD*R(E5!@f56gvc!;6=bedb^klPe+*#KYUp>Di>%&u)FXcZsSQ= zNihHl$`uOg)kpuk4I^fHWd1(TDnFPQncgDa2rYixlbVsy^RV18f{z4Q#1|1Vh`;VU zRE>mjYN@S2X$lE~h$sqNGq6CnWn|HinI(|W*L)vOxT4Te@l8V^MnYn&aN^_lLO>uh zqT8!q_*us-L?ra?+L;?Ao7kdE zNLctZ@AW>Q`w$I44mN5ve_m+K`?08v6@GGy^d9B*ItKqOL6USh1f+t4O!ml2wa*+t z&sFfy2YR}RoY!RVDOyFs?uu6NBE(W;#6ibzP_Z!Cg<0Sk$lfE2P}77Z zCYM`H0auE z%hC2~O_EDuIa~6E!)pD2Qg(h!Iwv=ujM9Mv2{cOIqlgeREQ(2dlmz7|Z_V>8I2HAv#avd9R30eW1 z*=zYjqIGl+Eg3nw$|j*F85v0{{gL6uuj5|bwXlH23xAzM+9E0&R1!UO3KdC4(rlYS0C z4p#C=s(;!mK+nXxhRv6DCf?Dp&Bv7hG^l%v-;?nPL+gr*J@ETq`{Jb$7Z;QJ4-CLY zBEzw6@94zKTQ_&IM2(g@v8Q}}hcQBLGPb$x6o7-n67IU(fc;lplA5n`$?!hT3TO^R3yG=_2ldfdci+AHb%>+ zL(luYv#`5?G(egUHW~p$3iFXg3R(bDA#ghG_V*YLR~@O~A2AKI=kEzlrgT&f_rXaZ z3<->B{{{b;vrCvZcmlhCt8NTJ zkPtOZOWUq?FWBzUiUt9~kmpHdF^J`)n}!B3sOmxP_MSGvjv@{7Z)_Ws{01s6) zc0{fpYr;LfBjr(!G18ZRMEP_jdjK_+qSL5ZQnM>DQZTs()|p7%V!8e|Nnk zbor-E;o0#lEx6R60u_~!v~(yc@81mGsoWBa2+gs}tFp_tOHhGrIxG{Im;?6rM-sPt zP+ol?KFu-*o$Q;n45g`FO*#A+!CRdZdc(+iXGQ-mckM?_TC;2S;-sXFSjJMBV#p45 zBi(J|jI}zLyl$p5%J$Bb9=V;zB4`iuFAIHoP*ABk1~N%B4?KYUr*ct;A_t#Y1o%p7 z)VoE6sX{G205=#|PdsiPft>u$QOMJqi};WdiZLNoH~w5D z+MQrx0tsaDAQ~(H6~AsjFkE~UB^pL(Fg`o`<{p+^yiG3&%!fX?VPoax8ECWaB7nVVk_Nt;~nBPF4C{h+6RI3>m3gGv5c>CQHL1A8C|NS+L?wp_3V_EZMqjqB~=X)KRaS>9us^T@0 z0i`-@dE~{gm-wTBpK+7zO!o1;4P_KZ>#?R?|C?+N^DxBHEUYW`cSyp77+=%xDb z-EtA?!67qr?Kp@CgrjwEKSwZO0er0FtczSmNEXlIj!iOwfb5fH3u6lYo^r2Iv zkG}UEuRX4Mw+C~Ld6DFy)O2O|1-?U*sn88pGfP`E*Qkk|>t^%M4>NJOzAE-38f6^W zK>jl9iw<%=!=vK~zw^`as^d*_Zq%J$^Z@Ay5vy1P%~@{bGr)XEFxFDE^3`!u-aV>{ zV+x)_U3^B$*U0JLc6n6m+S)e_CTFgXDB^%np$08>1EFNDE`(> ztYGUGmJm4{bD0SS~5yT9-8795%XZPu7)>XC~_jPVy=xQwV4mpu|2f})Dbs9|DAP|`yUXQ z_~utbZT)Eaik!CGC}c(4zNB}QYQMH>HEI36?;pRNI=(TH4gG4nu4+P$h8~-Mt(@)% z2k0zNCWdiIfRF^;b}i^&AlinuZtvf|Br4XxdEa8Y9}>{bp}lYgG11 zI&_uk=6F^2^Q)5z33hC3Oh;4{(GnJwadhDfx4i05tYKLd{c?9erADKcv^u3JE$yX` zcleQwY$`|M;iyO)RlHQ)PouUg6>do6u}y{c?u?Yw+O!pydwLkin?(y7u1)^z*|YKQ z-+<-f_~d#TvH;ilOJ$#=f9t<40d05Nx$=ILX(<<^2(-Gv5d?D5)My{6dfM(m&%Z&R zJi3=bfxuZ%RW|lIk(tWI^aB6f?Jl}&Gq$yJNF&KMy259j)Wsk?i$uI+_BGwy@}LQe zQc(!q>BW)ayB7A1{c%*K?jP#Lw*A(4`6WS=KRcYmLjK3&w}q!NiWGVqe%f|^5#GsQ z`L2GyiH|oZUVf;|9A3VFC>%YM|6QSg05Hw7qG?U@{rLUEUQ+i%IA0!iF^LS>%F@Iim`ZhvP{gE0XJOecp91FVr=WxEgn?QLw4K1l61F#Jl69A$2u z7REl?);aqL`QG!!d;Qz7M$v38v{Hx{3N!NeH`Oi%C(7I-u(5J3WeH?FnG11#8^ zkKe#dni2fWgqe?u!~`)gJv}{TGR4%xt>BpsQ>0)qzlfVE;WrljSVOi%H9d7*hP*vcju!m$s|raLXQh#LEP0Ouhr+GZd?i9q$6^icCoTHa{nPi6|5-cb61i`>4>A7d zHt7VN3KW@CQ{QH2*c+%{9ry0s?ZlYG#`y&*_$@vUT){FSE9_a3W4WS76aDB^rnDR` zHoyjk$0iI;S98tVcN=pe;G-Y~)G9sPIB~dd-bAd#movmB$H%uR(9CQ|s zkx?yZbm6 z-se`{^Nv<)K{&%cNRNow3#t@_^-F+s_Ae^Wz9wiPngw*!upf1nTi8PEM#-b@s%n+S zB=r63`WOMB)qV@U`~NMma<)$1&!Z+^;M;Zl=1M=kx9TqAAQ)?P1mnHdJgy8RB$6#g z0HL1rZ|NOfcjC_PN}<~)r-h;~EWq8v2SvD^XZ6-~wdvo~!>EH{BM_<$Oe|!9^M%c{ zv3=K1{$=xJ>a4*+QmX0Dr8EC~Bt>5i+z6oO9pC52$`&r~b=0b?G%Xg41;VB>w4@}5 z9G%n+0arpvWo%*M3_GIjSMji$RM#}-K@b|Crml0`Y!UJoGu-^T`6+P(KfEt7t0VoK zlZ$HAYCeY#YHhccBQ;L%J$=OCk>zFNL{Avo0{sU9WGg4QK;6ptwYzx+PeXK4lSf+% zYS_9(%j)lP}ff+2hXoVc=gzWK*?rsP;i(T|V%_g;%hrK?-cH>Z5i zPdpy}uU*x$w45qpl!Z7b86uO|*vpY9M1RvcS>Sd`n6m-Q zb;W-hgbZEF8}viDdq}k{N`t#0;?;S6>Om@J2gMAV_&ollrqJCXih5z~fOgTt!yp(( zmHj|Ku+d*IGfVU${&!G2>ofkIMZb3|PR(k(NbBIH=asv% zS(02>p^yk;{Q0H}nMtRO4qrsy;AN*Y@8!H5ui``NJ56}pV%=7d*#5#nfG#OY(y8;9 zQX(lf5h|v$tl8$5)fu_f=E+{APc3Q0k?nAb22ZL}?V^wJdclnffPKx@8}6K%*+jkd zl&3IIQY03vPP;Q1qzqWC8JJISGPaARsB}RU^@$-0b%a?)@92?$doK;3tb*PxMu7)O zLcc~j%@zv)%M)wB*Y|&p+hqj}aSG)+gVm7p232J9Fd4Ohqo}Hh04=M&Y%u zA~;;M<_mxLt^%}eO)Fe{by(kwA2cQoMY*i@d#-_Q+HPzxll?WuAGK5HlWg;l#T16X z!I|FQYvke~!$w4+#H}*<2dkvz0)aB+=MTZMoMhJTg=hZyP}SD;;S}4 zKcD%~#qgyi$)!gzZtQwP>!cEVTpS*%3q!aX&dEODSrrSTekOE zYs!2Nvd)JC_(>7I)DT?w?tVa?A>UGB;rGD=EZ`v@GE@rdzRFni(0v`E_}|Lo`RWP_ zDA&6}2PWT#xkL}pei1^R!TyPlrp&o<^l{%E@BD9ZoK=zMy_u&d3J?9 zwZg`9UhD4vuigGOW1%TqVVeM-LKG09##Ck-)fIgHwmkj`^>CZuOa5r9ea?o)EN>Ae zEG9H%6AciB>+`5231di=R5vFPS3TUJKQ<81Ux&k%2KNg1U}La0G*_ra=I38PH~GZp zl4Xj&DJjoW{(mljwT;Ux-?~AmYAHDIlc?19bdLgeDlpCCWnw6pm^#Jf3bAf;2)~hj zs3F_NKw+r42#zS{`T3a)n4WKoc8dJ5b_{B&qAxCz@I20{gy~ZFL9a6{eoS;p>r9pM z?R5cBflko~Zs?hS&ylSx_*WAi&pNHYUre938I*#G8+=n?2y!s@`r3%|51I1)BPb3I zWB!5`j7H_fB%gf%E?E?9y6JMhiJJ$WZ213 zRwFcqJ;s#OT@SZ^K0kyrOPGZW9Bvx2*+5pR&Gqai0544z7(W%xa)ZxaFHh?i4(o>3^FF+*kG?Mwie_6{*@Qj%<7=f%5yv~`^Vjkr)=p|hRlc)$5YX* zIu6BVl6u;V0SI_3=G^@nB~p=YP*O(iSE>=1IGsFedS#v43Bba{ZO@l5Y+6^-Hl;3M z&Co8Cl9$BVdgtPD;Eue+gt4>vp!8C0;xfc#^D*G^_;Yas&i`uKZg;->Eim%ZtZ-<&Z%zEhLY$a=$Fs1VxgYIQm_WO&HgQNZfV8}Uf z-U-K&B*;iac01t{WA9Ok+WF^3=Eqy@oiBZQahlWsiH?BOx!t4ZSuo${&mIRLLn@^3 z`!B|&VJX0~ed~D(ZtvythAO$~hkH}yhK6v`e0`8BCMT|Op)x0~bU*1amW*qJxpIcO z80PkTvSiXJJ}Ty3kCsQOF~bhJsOT0RlL2DjY3@%cazsEUMy6C1lu8N_k2hpbfyuUC z@~bse=~IogYubhrYBt`$Dr09zA!}69=s)Vg3@J3-`;w&Ya5J`#iq$SHpWtSaJ_kAV ze7Z#H<)6~j#8KD49$#tcu#{@*7&eH77lS8h^0AcHToMu&7Zmxr=as0pp%<+}v*#sT zslKp~`ZXUBx?caduoQRk0}?An;4iN*G@vK&0$C23?Wgig0j;kj|sqlEn+{;XS^ zxN2_^CgSnbA0{_U1O%G5uZ++O8cG#wfE)R=)#Bve=Ekv=rO!Hsx(&9LC8veRu+2># zLtDp--&Hyl^tH8(rfoO8AJvHQZ;<*Z`&ij=(M0QyXLoQzi7}&||1rJZF82VS&Ko3k znWSgWCKfPoTtD7^XlRg%go%cM08Kw$fAUT7zl$5ccJbUk+j}9G{y*q=jXVD9T9SGz zRV6yy>G^d4>xTEn>WOS9>-;*#_gq!wNbjv{f=x;ik^~gzT={(U%m*x$Ls@w`w$G^) z_-JvKQb)v88T6ot$edwm*PaD?6??Y{>dc_RUysSy60w6GheOoGXL|m)-9LrFJ^nHi%!dIzB4PlbS!N!|6aREKDmzGLOx6*Qo3l#v{_bW{ZmIHhqEcF1(h z2L-riJD@@)FDol$Lx5>=c%K}wVy`d)BUp`TA{o}-r6$7%~b_r}R zG)3776v?%Kvh@asTQFHXq_9wRE`Su4L`cwZnu|&4TW4WhNjXTqIgs?s#lyjB=UJgU zA|k;?miW&2mKR9^%CWG2Jtidp0PWE<3?n%&jl`RXK!?X-bgaVLI61^%<3usSlQfX2yt#!jP4@qa{M5;A>U78k57Ws}-ZQGrz(7xpBPP(71bb=#S%%vik zVxxD*`60G@+w{n7Wz&L&rHLMdoUX+9ocQbjxTyM(wwyI+40G8ln#e&qQPC`x>2X$O zCPDilqjS@l%hjr5p4Z;GWcR(iq%?~#rJ*fj0{-cN_M+7P?FZxzgph9_b*;Gz8GyCB zyXz0LfJ!_~tD#@zh(zF6ct4IOJ z>~}plQ$iF;Nl7puMh4kLzEsf5z^T0iFw#_w`3xzsp3U@284DI6QKe?Zzv5vzKmei! zgc#-)i1m%4#eKdI#ej0I+!C5dQUqaqXZhH+5@gteCL55HIadM7#2NK|ta*236-X(o z1Av1f01gqXtUJ||Q%f~!&2UGIxx#yAM3FKLysn4gZclU=Cl=+MA0nJ<9IG;@40z*}G0~B9b zrny>qic~6}*y%`YOX}>O5NT9w^PtO?@X=D&O?Yje=a;l@@H87Cj*=QhGr41APCS6s z8@rW4%4KOCiiv&l{==ET5>}iTV{3Dc_g0MJ^PeS%u!-+Nm5H;yzI3NqA;W*AF+pLm z%}vpa_|}FKq<<{eU)7mX0d1s7AhbL6z2iZ&MvZVQjeKSCG;yMD(7+34p6StR^WB+FL#^hmf6eO z`9j+!4!%F6Tp~G6Zt%W3V__QBK2&$}ziz2{1jD@MMZMnNuD&wE!6h$GSIL}Co8c)$ zLrf5OH8Jq}!WHl_-T*?FMjE{@wzZzlVYn~Wm}GDIU*92rG&mZmv}OG*SxAz+g8j|i zIosuaXR~baQxp8ujs3SFl=COYJlGv-tn*P z-sga}tC8C7i+?CL9wv1h>u||ZDX<};R7>z7#?`zzBWa?d?|vE;egDoJ^C*XzW~%~$ z?=&b}sF>|2`7BOZJ503LWt(uC3)0FRn60i{ERWwK2MMBnp%fr2t#yqIz;o!L>O&< z)h{!^h$nVH?O_5z92q>*mV7F;j@&|^NB)n{9~DIi4rdc)q-&Y>1(rDY`3>~-%~%gL zoW$muvX2;Pn_#|G(Qgsl(b0dMuqY_I#+(BHX^2%uV-vja@kVp;CeN=Gj=JV9_F@Am zmovXxp3%{epTi*c%=f@&a{wQjV;%dY4HjDK z=~IqrYpxykr++8Wf&lfSrPGF$nkN4E*4LmP&%pFMd|no>`~g>M`a^>W!GIHA#sB0p zrFMTYdUnp5ai{<6#Xk<)cjHp z>Ra}(f1>of>3I{lZ>AxV9TK7B^4zHp_jp#)i8PlH=>ScFo;sl!~)#64<@4w9Jk zP>EO%vzz!)PyBiL==H~G4y&fA{hUwPT*LBDu>ULM>tZ@)xqsI9U$dz;b_65QoB?W)mH}f?JDCxk6Sc@_iW)Txb`0#8lnfp(Jus);vKhM zKl_{!eH?PndkmPeJ45K8j@s}+k_uMGmcAAlYbaVy#TlBE*V|g|l5y}?$lf08Bu~uV z)f-Z8G1FzSA3MaBu7@T5y5X~;Z{%~vws$*3PpfR9jGTJqHM|Go(Z#lRY~taumwo$# zX+lme)8}!JUZZr!ZuO;vR`eI8tL|jylCpLJ7z2$#RHZO`n(0n8m@YrJ98;3t#%=5R zSW;p&G$_AzgjoO)SH@0J)}v395(yF-{$ylQ&tWrif*&MA3~71Stdx&S>(PP7r;yLu zsFZP^@PriXc9&Ru6kP1uBhdcF(ZjNT^%TEq0ryOf>rE)pHo8}%BWCQ!m(|`tpG4UV z8_jhhf6g0kk!$USpLrLwEt@fQ$9*LtSLJJA!(_tFq`@6=${%9qT&jyu{q5i1N23qIG{aX&u4-J885 zaTOAd6V?yOBm9v_0Fvt=m*u(8GQ()%6$~*Uiv5{!W1}h&`qa%wR|e9A{rz-jw>5l} zFEB#%xH~(=XNwI!!0?pp*{Ae6Ekcbf+1k}|zE!R0*nxeVcA(Idtaz-Fv_LcW zKZifJl<&O`GTx5}_?eoT4*p3v;E4jAe=RJEhRxrkXTpd4v7#?o7f9)Yl_?(IS}$@u zO#SK6LB&R9{*LhndMOnh+r5jcKmq^@kSP6_{8CCE@ttlWJqovr$&LF#v4vd)S77KQ3`>NKW72EXVwI(+X5N=ycX z2=fXns%e$5FV~vUytu=X!3edZW^2YONI6PjE|2}@JfJcBF z!;W-VFHbj_c>Wg5S!TT?#xrXBN(rPs5 z=rt@IH`CWoEnL}0W#4^xD6gOfhv}xKlrVXQhK9WoIA#{)x7Tq{H*|M5bajnwJUsi6 zJ4QCPjG;meBC~@}>0iZ6`8NisjBRyax3^_%RXZl!ckOgV{USt2wywOeMh-Pe@|Bcy zve^WUTXb^leh=TZ-RExkw3Uh=!#{~4Rgfh}MGx{v{w0MuIQ$5bE5Ox4I^z+G=FR`I z1?95af@u$ds8sIQpTNC!e}lR(_trbQeu#~o&sI@>-N^Wz=$xg2|N9H-y=?G&`wj>- zx%inBhY~6h{T|J;e63*XxP8*~jN$3wAn%oNrVA7KzgNx(Q|am57Xd0XpNF-rsoU=3 z$UE*+s|_7O#2}%z5f+3hugDM1wE}o9c3NZw@H#U!Bhvv~ez`suc%z?}F(|Z>F)0C?hYlS8>FSB zr8^`=8U&;pq`T|8ect(I&Oc^2KhEBJt#z#{n5U6aX)zo!#nYK)t)!FL&4)2oV~Ij5 zmFUXma6I|KTd^i!8M?ECUZr>Qb53zLN{kT{91m6BgJ(iD7xC}*Z{4_JNZ)V&FVJW| z5F9_xiq+Cx50!OfpSLIL?kmYb!5&93yBCK4{9CA)n+p+1PYrWl>U8${Ze?lDaEPvALhY z8$B?!!cLd?`I_%q*A$xR+w8>@tC@ww%QONje3^Q7Mr|!_*vO7qBdAr9uTT*$Y*3|~ z`G#$Roi>KMWGOIM zkWs@5m&m-n+E77|7YGgWgS$H)B16%mL+k6~v}1Owv2*~^l+4U+cb{utaAmdH9$B)# z%e|_7r;(NEyT(4jk;?-G$TNh0vrteIAi{0^-))9HNhxzR`g1uDbnvk8H6ppzpQLHb z(*+iKqoiPj(-meLwfZynugXlr<`{dQMa5fl!qqIhJ?;CUd$i+kVEFFxvbYVhl@~&e zHsjYj{1@zx?mVO762Hf*olMl&tw+D-v4v<`QyJ^DrAE-aH!8p^6Vg3%&QDVNx;J-k zKb#!od2h!m??(GFaHscpg+07^EFVv~+;HSw!c0$V&80GGduk2echxcX;pe9z&)v-# zA*nYs>uMxLXQB8M(69h$@QCCu+`%ry8;SK|qMsUlt1)*>GejI)3d^KdIHaPVd<+l2 zqqDj4zl-^3KE!%eMXId=9vu#INtw1D1Cg**~)7Je#WXgXJ*_Ot2!&;3o1F% zQO3V(8eRdB`6i*E3GcmVw3Nsfrm3%v1B*~jdmK_L#d+*ph zVd-UMRZJFo=Wpns@a_?5hJ&5ou6vFZOmftwprak$yrhYrXU2)X;Yxda{!l~xRb4hZ zx(--BYP}f@PqHHvvw!Ve4c2EG-puBz6Y-k(J9*~rqN3@c(c7$aoYS|VTvVIie~5yL zsx)ko)X+c?sZEjinQZFMcG1G#+c|Yyve2iH1o<}E^`FqXRhyF`+S4d)zp;*6 zZx_J^4+n7$A4Pg>_#I-{jF=c0+@+@GcdH`u*#r_Ecb+yvSRPLxbn!AYFny=fpvO!6 zzb?qwdi2XDu2hj~bm!T5s?gxgpwQp*t+hNq7`2r*Xi}67Nnz3xt<2bZ==6I9nY?%FPRjQ3$r#JKmmYY&C!n|64Fef_9=rcZwC#|)CU}h z64B#+RC2%6QOj)f+cx2F3l}Pyqf{11nJASb&&EZ(`L7OrKO|sMS4IRxpw7{{0y1XB zPn_Q-GAKa<;j7-~{Zz_y=BN=?FWjN%qF7<*aEMU4R9*mbFvJ)D$fG`{WU3!dMn*8Tdw4;o>}X3j76T}nwx~G>c}~TWn4QHM)5%86 z|E+#})j)|Ag@x^^8?fp5h%Sm++T21zPY~rO3bGjzoz*EY9{fLu=TC3imyYatKCUoz zE0(soxAODzbF#DV9M4oqq0Z{J{L#=z%u8#UJ|EaZxw=&2@d%3&q47Ur&(kc%Gkh839&F=Vn#irOXW$62@5)#pBz9g;qv%&y-UiSk* z`esIOv3#SQTLLV!iPZZ`JSP!)CkV3}ZN=PCrbY{^^^W$v`gkPa$q2k^aB*epi5cgw zSs(pv)YEapPAJz1s0rBgI*i%0UT(}CY1!kY5=*8U418EO+lOTo<+txVbMPs=tg{Sw zEi;tA^d41;6(*vgDnN-y_`Ix7s<(Zh#zN}fyp|Vd#;1jX!(&aMU}e4*X|f!nJquGv zgy?s@BPM80@ts{uc4Wgz9@tO$=jUY^@6}i!7|{b6 z8Q~or1d-y%h#=sl?G@4J8;wqx7{$(pEGA~gl1KmHoCeD1>(sXfUCz9Tp-Vvm{Jaa_ zP8YdI$_N^I#@$OFL=hS+M2U~aB;LFB+@jJwd(q+_kB&xD)CHkOqqtZk?JNra5n)zs zEb~f4dbH>)!2YHzfes7wI%?yv0yDdCx2-CD6Es*e?Zw2@G*a&+ldBp+XFdlj|72z! zf%_@wRz2qE#oc_xXJFX0uS{dgp<}g2@U~fkE>*uq?eH4!+ID7xuGqeez{1qEsl<0| z>ANw@(fI@T%FpAT`NB+D%NME~xE~zS7h||M#+mr{a`0K&f1}^HD560kL|_ zh^Io4B4cMys~+Fj+{||7DVU-$XB!4D%+Xxbg$BnWqOxRo;0B`Ij{{zFwn*9ck&yiT zk0M2ybz(kcPF~Ke%yI)#{sMH+QY!aLwgz3%!a`Zr;h-wAO2us_`s=eNOS0xASLR>rV zzmgI7fwfO!dA2V&V~ojHJLg_EhZWLA0}c}?N&Mnz-8tl}EED+1)|Ac@cw`hYKeo1BU_%2?CimfyuJ_1e-J zk?$1KUg6}KeK`DzKAdE+s4{fr=#}sts;_DIS%;G@75Xgh?uC>4b~QjtkYtVns`fIG zLqYhp7fn~Ux^@_Yk`it};+`&*j)($OK|eo>8QmXT3gt1gvp?s(?AKggqy^Y@IOp#S z?{XOy;_(JPRz}i z;|LwJgS?7W`B)%eFrq#(o%Tfh9pUn%ct6PJd_X<)NRnucSlx&KD9 zXsKEew=w(C-Cq zi|@O}h4L1uFB{t-;4~_q=XX2?vOVCXnQzm~aB3cs_2HFxS{9ldEtvbz+pW=v`nIyzL%Z#F>OUwcbSXUiY(2t7 zH}>~i_xDqSKC}~BXD)QtU;wgF_1Y##z$kr*9}k)AHZDM*d;CIF;Z?!SQ*J*21h7Fg}-+^KhqYxtcy zg@)fWyTV?gIl|7Kq{Y|+0Vg$(nA}~K6yRCl;Q+^N?l^A3wZzlK=9hSo00(?e~(6O3*@Zj0G0~^UUO33um7P}LD#E@q` zh(G6>k2ERh!@3$g3fE5luo9yE=(U^v&*rgqtF#0ZiA|Eu^{KLk53?> z>y^;0g0_cttskr5+4A7%vF>E?KJcAqEIz51Gn3X2rkspG*A?!qrPGFGuhT9KZcy80 zVNOy1DIBjcdtwg(I=^l@J89FNslt)&3OUR3$Gyz*g?Ku|p2lmN-37shRi&~F26$>i zyJ#4BahAiywRmUuzxrVUTPV-+>u2b+@Y*HCqclZ$nE#dWd7@4YBLoGmV8fULD<-VK z9r{))6ko(dl?xyl1&)5=ez}R;@KZX{LFfDanw7OANW={M{;lrrel^Jv@bZ+}ezJ(> zk{8zRUWg@%m~YMT@Tj$B+K9@Rb8~mzCnJ;D%4-+&diLkfcIWLXBl?+L`AG3}OHJ^C z!2Im&5Fh%{iXJsi^n#9mmFI%GqnQ~92Cr_NqoT#v_eO(Z8S{qx&t*yh4f*-It$SS; z$$1@5C+)aE@Wh_*^VL?okZZRrHu2jyNi(AO+r>sjFc{hbjD0^oUJ(=fcS%uVH85(? zNns%-+G$oHtd@{bmKYF`8bf27P6i`fCyb65=zbP?tFu5#Xz0iTlJCj=h1TqwEGk(C zx=@9T&Ng=(Yq-Bo(V(5wU__=VbXKHX6btX|SpdO(`?b0Tnia`Ew8?N}DadO7&D6Rz zH(By?BU)`)HyUgZgnwxG+!FV=uPBJ%cId-YI3>tpv|E9wK6geX2;mnO^ZKt^4r(0Q zMu8uw_0G#G+AQXmnXS+O8bPp!S=R5iS`I`f~wSFohWhvSta9!s4s`g)Wqds|YI+$7SA;NhXY+I# z8Ksg)cxACOSTI`FGig}DanIVU!TNTQ;;=pk< zFBrxCDP!wf^1t+;x_tUaV@MviS4{!MHOl+`f*X8>KmmFd-mQM?ra&{3tB3~f!)2ehAeB&EH&+t&wh{lS{L^}?CZXU%jBArc5JqN8dX)TZjEO90}&*xI5 zi1>bXuI^v7=^K`g*fsKjql{*Sz+{8!;ddO}Sk(#@9Na2o4eS$K{SMH7UWb|cR=U4n zL1*djmv;bq7)Ys=jpFWRVWrfmm??AMn*aNyw#8Y_q*_LXE_&9+t%aRkjf+8Xu42V; zjc**YA}KSie{wXVe%{q>dfWBQ*!uoHZ>sFvDlY>D(lm;1`bay8{P3u>%wMicU%W%P zk3a6F^F}0XNj=VsiMTvm-ct@NK*VIDnu;5{ZH!vSPNpf#2B}7g;*H8u9E$PZy1S#W zBPXYogONHMeUsn^Id5W5W^zi{mkuXR*}scP(4acu0v$fM^LB+=tBgD!Wc-JhEZB($ zdd$ukJz!Y!6c>ZtSFZwG-X;eDUQAdM>tvKOeVvrn&E+{aH^ZSja>U=yUz#bIzj=JQ z8gr#>XWcyx&4O}$*KX!BhH#Q zdo|!QBR@s8H^Kno7%BV$UtHExhrMh%epKPWKaJ()1-5V0zah*fXO8QxH9-JKq;jd2 zI@QQDlCG@hHq_MiTCmJ|j1KS5yE$HV{sCwFAaIty(7+QM&B_CP&MFQC=V52r4Gr{L zKTM~dU=HEU3%_W>=h9t`B7KS|9>+ZDQF|o7CZpHj8ktU?#|=sM-4v##WD^qDj3MsF z5J>}|wLKGK8SfeO#3~8@^`Xwxo5+)h#=Y;}NNnXrlh1t*j)%qCyhP6vg(jj?VgiCY zGc@9Y59zJCyO#{8`l|@-H6sk$A8^UrS5_7TkDR>$W6wE5?S%J;p{{NyWwiPR?{AN3 z^)k&v(D4We_7Cx)gByNtKRlEtCZ0#9>nfBiG&NNt5b=c1&&9S026hXBeu)-r!_!0W zW1xad_O%%Xk(3sOy^#S(|37*SWt^YO0NkwrkyF`yxj4h%QGlp`iRn8K;g&E7US6*3 zd_2%@{j_p|93iSrYP6^oLyA`{_QN?87dtZ4UPMf8gfp`Q>T6v=Lw@b96>}Fx?BHUx zhv50POrrE>R#UH-DGtKu4WE5@JBWx%3aNsYO77nEK!mC}8!NEA^FCBGkcS{vTrjfw zy4$_Aw1Xqv?0h+UOV-YbqpqbxvOa-eRUg7ZshPoK#K2wD$be z-tg_c;wAg)si~@8gxcf@$_X=fDh>*Xeft~AEyzR?=QIa@4Lm@ktlf`;S7%1q2pWL% z+2wZw&oPi~Qf~=^i;Yd|v7BXD6P|zzMwdvlcs+)uYAlzs{i)dIt0iVTtUw#aC z##-p@!;Gv?7J*}1bXY7(aWAD+iU@@yR^#i-BM#9I$V@FFNk1-9MLa|Grs>)!?ZN`> zLd9P*Un$0UVQKJX<;M1R9LW)!0(6*yB9iH3FjPLGXbG702opW`8 zgId-KC1?vn0hh^9Dz0t(!J#>6lAA(fZ)TLV7;a1)#Z*AfBmPkIC@h0hM&>E&k;30Q{LLuuH4fLPp_Oaz z&(v;l-Q4phh;De8Ur-ibtqzXN+E=W4QETg6BOKojFtjQ%8HByQ#KPM`@SMhBIY~38 zak0@9_D74@U+zHN(PBz!(q}!~oS3@%t)P!1?2{?A_I67Q*!dr5VS(=mAwNjIk~D}b zIL92G*=K8B*3CQYXOJjvquHTUw#rZi3(0jvWbX9UBZu4Iiov4)2OeTN!&JGW^MMm1hY*-2VNl;)A@-9UKu4tEhPN>Zsz9x?(U|(wr%3+OM(JB?|-xm~BvMmaB^;f=QA#{Py zzZVwJNDZSO|E5hLeGVIaDvFFOW)?o^9xzgDQw1SE<%@3!4i^O8?o}rcXl|D zCRA&H;BWKfAoue}@ifWo>BIYCY!_V*^rAj9!!1SqISGCXNz~K&!&FtTm9nQ%=S>%@T!0!(m!lG;Ism9ify9 zuOF2=@^52E33_4Pi3ACnyF-&jqERS!h?3`Wf)JqJUs_AF&}2+AoG?YOG)uTMazFIvN#k=?K3dRXf;`;st)`9X^ssq(nGNoxI-ELXAANw!^{B;`=~zQ_ zOZh(>WJ8e@V`-hL|0s@X_%2R_L4j8Jv(M45-BW?HBhe61iq3N#EiWEMb_0YuyP4@E zrEa%;5@9i>Wa(nltTBtmR(meog5ZqT6RhY#Rn?^5boVh+o7WGxamHLrySoIl8e#W7 z=YDtKjyi^vo0<_T?sI5wK`(>$nJ2J)i@;>m_DhqCV-8H*X=|g)kUzLZ0ILHCm(|y? zg9shtUkD3)xA0$gZx&0MP!L|QWU<>uH@a6~_ZLzELo|g0w-JQB-;P4&05f^_(_=-bsLaajY2 z#a@&eZU7*_6r;dM9K!eBTdCNGH*isD5=Kvvq0}4A)eg~TnzF@Uzic7OTFI%L2gzCh zdI1z*cmg#C6HgBMmDdDibNWfARG)x}0U2-s8lIlIa~>Z^U6>;ddmvldrWJ|*P61WK zR!YxTE7y2Oe0vYXW)9+?LW2@ul%dh-{qS4A?v~Dw^SOk}AgT%1vPuQI)j`iU+`QXl zo)K=tiy9S-d?|G(ZdRow6FHf?Sg-(~WKO)~8?7f!y@|JdzIm4wq<2ldwA9AG`M4B! zDupRu0suiVV$egb?xr4zY<54{8%-!j?=+vSus@EOI~q<*46Plw#k!RVswVNQb^nYmb1uJlGgG@1GM4|TTLYY zY7@z_>D5HIHGG!-lo*^VQP@?TMRe;<{#|KUnweV*KL3Do`wY@swp7`Lj!CGG`78=scE<)F zAPj)pn_sfgP$bmU^`Q4def@-`TSJqlxs{bEvO5D#EYotQS*GP5d&E}#@>#mVDM%wv zPW%@i#a#cMt(&La-*!{h40y3!x2vhUyLLlyguc7vO532rw{hsCWE282gi(XF<7&E0 z%kW-|2V5j=s(t62-BA+saBU2DH&6($6ws7u$Gl%&c8ztYYHAWKRDlvP6C0}udZrs} zX>9DuGRjzM;e1}+#o6hivBcoa-~#$>o!602aW!AjZcjh7Z9WO~?Rzct zCjQ;{G%H8FKUVK~S=rfEE<)Bio@k1aspl(5)U8|fXQ^c?nxg5SA{*}hJ!Z0H`pD80 zr@r3Uk49ro3~*=`k*$+#?EYn4$A-+#Wm&hhl8Sxr`+P&ONQXV`%ria3o1K=K!shge zRmfxzvbR%R0OiE0f(0E5(R&7=Z*rk{>FNU5kKZ^}@Nv#|Ps7$A5^qN=+IGK2_0iF` z>VwUmTWhNp1x5;vm78!`o1bJvcqt%KoK#vuRa|`FE<>@D1^)I^-@;s(EK0|!;w_0* zS9g*^_2NV=N)#)b{^4N01utM=&now!Fyk`SfY|4_r+~fJt-ma<&VxT3Y*L)%K)fI{ z2;Vd?0TiKCEtOvgoJ?9cv=bvMO zXUkJ1?tIV)Q-q;E-oY=X{UBVw+p)#+PzmCpb+KrDkJv%-KGNmF;l4nFT z{aN-rpZXZVr02);OV;w!jgeBEEU0#81Bj^BxBSjQ(_@uI>t`dAV*F)e5DH{$}@xFQIeSj9xjsE-IlI-cbc6Z8ZiY z77#MaQHd*8+Dki1+N^`rW_vM$Qe|^fGmRl?`yVFD^cRv;P)XucHfelrdv5 zWa*ValqoiCluXPmnYT>^NU)GXpJ-phP?_tQY;fvcxN5D$UR zapR29%cBz-GBQ;E3t%GLuuem;?Giy0eE1s>^w^v?@l!gB_|o7h_cQwEP-rBT zO3Lslj-|P|;S&ubt(|l4zKzfNOmcE^P{G5)88>l6;wp%w#ztQc+nP#i<%?I1k>8P~ zBvpcRYRe!d=8?`l@2%fg`aA?i2x}nRJYNQKSaxsvp@79j1TcI^n_;=V)PE)eu3gbX zgA|B~8;2;&DIATn{Mmc^eIIT479$$0*ZclLHErcz8z`&>trx^+DhiaPFI`d8X5133 zk8~d=d)BuX+>Wur>e$q%sI127Z?t0q+kK8Y6W3cwUoFTb%$%1h>kSwGEFc3P(#@*7 zKgCHhJm(0!Y;H%WHh3?hxW-{%Al~iU@Rf;!J@KFK_)OXkOn|jL4Zn-Ml7)}Z6d#B* zK@aW3lk#26&%bac8Lx6}+-wD8=!e`EZ;Qj3=0$!!lCfuV9&TyghWNL2v zfT(Eaw;*f{i+p$gV)WvDg_gDY{O{t-^O1-Isof7{+1dHAN?)^eg^G~^J=}gleE1Dc za_!6t9nYyJ#Ey!G-)&mOGU%G6hdI@!@KO9<4&3zoyZ-$-Ppo@G`^k7PBuh$RK&*o~ zB_P4?nLgR7>2R53S-`%#y)Ok}>^>dkeKnrhJH$|$5b@%@(?ku4IeH0fRMyvfnR|B>)P)u# z7#j}#V)-H}qJqUzVJ*Gj{WcUZi($n%yT4s^n|~<@pE)(;@i@3%UHt$+Adr{)3D5xc z^^75_yw;^?07F(5NlooauoH$W3&xBgRd#whX^)$UA9WBk5E88%g3)(4{;qp`B=>M> z^t7Aa{U8X47pj!bzyZj8*}`ibPEIiKLomk1oL&(kEaq$rV9+_f4hzJ6D|z=vK5Y{N zBjXz&D!Q)CZ_u?)O=>6>&gZ?q5Hsm4G=E5EX{|th#!D6oD38?5Tv`)eUEs{FoJWL> zTyYKWbJ1~^+H*D&+o$3qNsI#1G`MQFbpITkIP+v?BxVr?^I z6QoT2B5vHI(=f+zvPO+KdI~iHA5c~E^kIbh*G&kVp`$@<)>*H#KL@*ZlFY0=@y)V(d7(&8O=9fLp4Yq^Mx#})GBXbhZT^yHO#X+6dLFs^e- zJl-8N40cR&o_}h7G;(PN;ZZVEh*nSZP z&;Tt+$mGwZ{L3f*ls^}5j2P}_tBK?8yI{&-h41}doW zaR>x1o!+!9`xLH@?F!>*jFnVoX{&=&c?yPPISbb^k2%m7f@P2?ePZM4 zue+^SX58jEZ5Ij7n-63#g`rv5*t!uSu$3=&fNu##-S2NpQGXDZVn6=WnojBBK^Lyc z_!Eu_I_ZK~8$YY*o9^x_r4CX&z%n~g$4i~zYm#{fN2&nzN;0yL;(qi z{X=gvfv@fLMhrNx9}{~EmKi*BDKOq$yzekqCsV0{iB_izy!-K~G|&qbKrZ7eQ(yk0 z4E9_Rk|jAzdFls=!^K!(@CZ^=R3!@r*^0RQ=iOL&6G2s-^-WC#q~Ob^Z6nHnbM5Vq z2#|~LtO}OW3o(#kMT(Q+tZf$ zI!bm#gG(|4Gy&(Q-mu*o|7+gN5+lFks~<3aH%C=^jbBVyL_ZG|Lg4edCp*r(y}Vwp z2ab;oh~o9=m#2DgUdL)IulW&RG6`>&za=|fV_#3QTda< zcwkl0aN0(z#oo7dt7;iDh^NNXwA z_p7Uz+28uOsx5H+rY34?aF3q!bTN4t0z{3*D=Nv1o%Tgn1E~P|cRfgJ;9vw41W=B4 zHsga2uCUZefr2H$4jzbi2#i7hCSj~BLK#8fjp!5n|6G7*Y(!Z9@E=$bj4hFsaCXOE zHEG4kHY{@m{#~0A8d%jhxihdz)Ofyrj`vpW(jLW>$gutr8NQDg`<|%4P~a+_e@&;C zNsRO${*w5qW@F8@vXu1_eBbYnul&%g2-@fy<03HbY`NES{Vfhw9QSB$4P-TVEz0#z zu0xk#T;Gv@kMXt=@;uLrE1K&PK6I>-ZVjxZ-+aE_Za@8^hiOYDm3!00P))_n9c*S3 zOR$4lIW&x0E%a)Ba-N(ag<%T^l6v=(t0m*f(J})7c`3De+kK@VOXJ%9)Yr#ORe!vS z=?9+Y0ZeggS<+;v;CXykzN7HpMaRc<8&oDA4ujE^1#Ab~KRi$SBki}<4dBcuc>SRK zSDQ`dTPviY0IP`2ycSmY$6oiOm?2xjr^NNO&P(X_G6vr6ab-{6tEh$c_fo#lBat7e zSdCzT)Y)Q_ZaKAX= z@!R*|%BOkh^3&^!go{gvY-bdQp`NsM{h7JWy6C1bbR z@Yw%u!;eKYc+amZ`{?NRTBk27HNQiE8_0N$fC7o7wLC)Um2#?tf^}_FW&vQ+>DU~< zse<8RTK~vR&8ZPqI?v%?Jfe4Si6 z?WX9xC6Z`tM4>qRExIvSQBqfwUs3NSozd}o5govrZsN5B-^I~U?UU{rn`gGHF*ty4 zpUkBrB~NP>9-79R z7;U0#X!GK-ey!P16DGJ12&3wjPu0sGAJKqJ+TJ_5eUR$*Go55#Fg@J*!ruizUzKeR zVJ?O_`~4eX;7q>=Idu6h`Zr2vc+{9UH3={(B=zgDO&lZo>DmW4Wn?LYgbsPaV!cvD z)@pwhPt74$$~tr5q#Ot~!V7xzn%M(U=m46nul|J$$aX({K&oa~t72UJuKt;LK-Oxr zeCng~VE)=f_Fk79*!k^EI&}%V(-|cOYS{*esSaO|0Q7(3IKU; zSTt-Hi#vlPyKjUI9{Rm}jkdL4g_Et&{#G=ZzIWADQ%$%F;wlyW2)Jb#+moM@1H^g0xD&y@!}hvFxqf07jzAU`np1*fDoax+8j1 zPO+7ATIS4KM|b9v3+Z#;)HkiY|FMjmsg)hISIS(c-$k;vu;?&g$`aMIM2P;*9hLQD zsh(5zwJ5(F+lbCR+jW{a(N^7-K}xhAWKXY_mPGUk2w5h8X^+g`KejC{wL%6|lW@D~ z=u_(or4Ay7M*TyArBsM&N{@A^+xKDOg`fVIp)uw33J2xi^RL~b{p+|0@$jn3nMNi? zs>{lFf?kjS5CAxQ|K7&KLxU`F(zfw+qjAPw77jSFskE@-V>YxG40!NYQw#9W$WTo0 z-@6nfa6>A^;_ur_y91^C7=VU$p{JZ;Sp^(*S*Np50XwMnO9&fjEk zD;Y;r=45kRznE<`(RjR~mY9(^Y9egBg|Dmkh<_l*fd_)_m`KgO6ZDCn8}KYRWSwZd z*2yO+%Z$AVU`<2RiJ~_`r{#I3S6R1jBk=HLQQ%j?OIYlAKF{thitCR*DEot4CJbar za&QS7H2|IXd6ROzP!4Ru+oh{}ze||eroB5w&Y|lR&x@$f{K+oG$ z`CRbcm!4R#EU8GC-gj;HrW1;TDpk|=f;W@Gqz8oiXd@e19Kd_=$;s#AX!$?*j8%y) z)tgV(O6i#Z_@a!CRUT708ob7gPS2qV3;fuBv$U_}Q2H9oI{tX{TDs~+Q$ynA@7|kG zzA%VdGZ2cO5wOIIA+C*WGJh@Qj9u| zNYHtITI1%&X2BCkT?nO#5)DQNib_j4xzxc`n%#UGHC2h5YdyNLwi&861r9t6DN_yu z?JyA}Ti@t}h1Di)q{uFk8ibxe+jYfKLt&w4p;m~~dyI_yX4(!4sa zKCj{5&4#CH9Y04TX~i|U?46bi-`Fp`t^T>2PCCFsxO7pTMUi-L=#jUXlvo?>-?Tlf zq<;@DDB1UAE8x80TmykII5MsOF0RC4>8E=Zj@GF-mj4n={Y+IvL9j5WA^S6lHvJ9 zEr1y?3iJVe#xd+{)3S0~$t7CV`j?L|z**1pkkG?aX_4xic0PY|^Nzwos}G0DIyw)n z6VJ?_NK;eEm9aos<=`JjubXR>#wJhDt+a08JqpTfynrinoR_l&TG^~SJU#ALvlu8M zzcmses^`XTVDFumH~@Zt9L?)>lHe$m-fdWW^wmx;y2wugt!T}+SbRFGhH;tVs` z!xFspY=ZljpJ2Q~i~rr@LsjE8p;?vZrznW;|QgbO9wAw!WV^j|9!Ofvp>T@!$ zcIM(~pDH^xJB@F4EOMboRtD}IH7ElK6d??hfo8A(Nj*t-nKT%~8qg&oy0Y7QlwEkd z2+AluB4_W4-UD^)YGKfUSs88iF?NKCC_Qq5(cp8aJ;_HQ&I8HL%FfRD@)=gFq9X|G ztTrr*#Zwt~DQ`CF=#pO+j{l-=%&mjU6E$9HQ04DJG{To@jU~9@`BA_Bgl4*UI7sJ4 zin~q%_HPYcu2524M#><5A9WP*Occ*b)hR)0<`eFXf33{K2RhVAkWVbDCmV9qDrodG zi4q61wUY*}&S^HtQm2Uf)$|B_dd|n!KC;Hn)?zJ%9YR`OJ zJ}c?BYSdz)NlGC9&St~M=b-86+Zzd~7Yf2j@KcG!Ll zZ{g**(oe4t{qH=7yj?}lp@^RNg}d)M9>e(>xXuvvt%RX&-He@J*kL(KCyaF$3PsPk z%m74h`hOuFq25L*V1ZDQW`!U+Vp=LTl!#bBqh9UON0&~hgC8+eGIL&__Dy>2oK ztp-+E+51m#owFg6r^;Sl*4x?96Z@~XfZs9F2w}@;C@CSsi2QpkBe2SbjTk>fPxnhn zaV~PeG{as<4bv=D_Wnvr2tWka@oU6?_un%x#nHn+;9-nIzkw{6$jJTP-eqMPWZ>~; z4hB$|fv^L?!M%Wl1c-(CrOe7`S8|1$po@Oj{mcfEi>p-2XsG#Pu?@1j|1>%&wF;wS zA>H{y88ryZf30^bDrqyG{SMQ-M2&uiM)VB>32sALy*dH(ZizIX8mepe0)gtc_3kqG zuvW{iG+5J_U9~xXtBD9*_9c&P1cQ312b;`pg;~; zR_u_;KQl8|Zn`{fwQ*P4hy)25DXIY(Xb~mZ?fbz10AZ>n>h|6FZ=nI$z#!!+!}r~7 zzPC@Lz-L(xxp``RE>+t3V+UnbDy1h6A2Zk!`ak22Ah^=2@RK^4_|~$R%N)IMC@?(^Bb~?BM&J|3M8K z8;Tm{4DAD9q9gd4D`Lhl;%8`AS?v(= zm;=?0ui34QwUU7Zd! zoJ_S00*H%-NYi+4jnUt(;1j5UG+y6(@}-! z7tc?r4&vAs6I}kYjgCh!1-o|)ruFlRP4+0CDYEv29-n6e_B+Zu*%fNGqR5rTVi-{oUJg z0(X9$RRq*3<&9x^%#U9`gAAu3g%R8l;is})CzqJu+VE^zY#=pOM zeoN&~mZ4_fH`lJ}Q^P(}m(V}#$q7??3#eipE>xey+#>vU{=HypP+!$aOH4W9rXhg2 zs0apUADTT~zeA>$MdH4`ikBQe&Hn^Sh#%d%n{YwlHc56BwZRNVr@+1?+h@1vZ zf4qnYhdkCIU%V>X%5OXIMZC<`J_nFOC9Ic(>B{S*F-kR=^PeXTENqQZSdE*r?RDZ> z?V7s|Y7V+=j#A{>$C(YpS?D#HFX+-H!b*SaS3L4_`WvuTaq?J*hk|Ym#D;~^tW4ww z^!y)FUmaD|9&Nn|0qF*5knR$Y76Flx?(XicgVGIB0@5N9hm`J??(XjH{AVRPQ7a!gaqC!~mh5(H5s(D~D*TDDz_26>e(*ieI`qoP=r5v!89 zgA)m6*icJ6q6^du=axXhAc%Msy$%{uGNxc}_1aR`>>f;UEX^T`Q^b|IR^`d(UvKo% z=7}ZAJG0ibR5nE$itF|eFVzV$b01*xeb3-suHU_a=aF-|-3#r(S#U{&P^CbF2_k4{ z^OJzAyt>q!rJBoLuTRw~3CV!yb5;3m&==OSKUm0OwK`9}_KQa+-1cE#e-qwL%n5J4 zo^(&3Tlmq`bTrlw;1*)OuPZk7Ih&$JhHBQ~4UB{$>7nbr-W9qFf1(a+N?IjN{QiEk zS-#IpBwEVvUo`mVf4rcK#nUvAj1ae;ah*f6H=kJ!nd+OEz<9nRzW1blhuMjB``G=d zSE6C74HQ=M#!h?Q|I~Qw`)BO_`S)`l%(CFU0xR2-)pWAd)aO5xxUl+_yp`%Sr+1tl8-&lzc!t()xo%QF`CRTBxCYqXdJ;{!gC|BON)?aoATJ+eyz|mlN z+jqX#i~8ejG3GMj_7yMLd;CRD3U_1GNmx}2cT0|jK}u`TZ|Dn!+jWRJ1Pu`9#(whl z8m}&OJ0ds8wD5gU(X77y&`O>lb7Ta*vkR}wTmrA}MS6j;Jvc6WLVETNUG-XeX6=I8 zmoL=ReP?O0Tuo<@V2j^Wwpv*BVnufbMuXb(fEZP(B$7wu_^vE%`sn_IWd=r2PL~9K zfkuLiB7lI3q)51KeSW)P1Xr=S5mEx8 zxG#L%9JrH^LZ}K<_%o#Xeqh(hR&Z2P{NTumqYv_sq<#Sm7zdvGgx>prn=&QSMV&TJ z`pUE&ygVvMswCV*T_1#fBt4+v5v~{_9uH#z@994AfGd}1VF`y8MKaV%xb^F4o{WiV z^d_|Ne&fIMy|s&Z+#Tbt4&8(KqI2mBi+_8x*nhr%@2-x+WM*!bgcy>~#3UP3L#sj$ z>R1YrL@yD3v#>3Qle!wA=T7X4j2@h|If@bVq&@ccBX+f7S$|q|yfJAGP|>reAdJK( zuoeE2WSu!}x~88wymV6@EYQtdTHL+fdsNchKCMHMB8!bGky7;qb^2hQ2Qk4aO6ia_ z8Pj$lj!n5OXsK{fJWW&f?Mjew=a?dn+`Ide;ToBRHnL*>MYzLp5&*-uzd)$K@b+n?)* z#iVRxY;9i%BC4ge&~o+4ozPKn6ivOAnrj8sJSK*4(;<5=x~<$ptY8YB;9Kw4e7u?@3=w2s~m3#>GU3YhTdFsl5>Dw!1(hhh36)uu~lWPMx{r5U2B z|I|i(D2fUH4)dPJBr3f)L52{S(m|qeJVTf93@c5=QU<2=@JxzOx_u4$ARY>Rl=g&XC%O98D zRV?TSbtA);e-m2rlocQU@*9epKgZ*?UgUQLc^LWURC89J4;At zRcYZzboKQuZEGUF^R|Z0A7a3_%jfslEWJk?o+AROHFa@pAOIe;K z3pC%fw_A(o)ctOGg->;*+?~{+N8m`Fh4t89MP6sI`*^fQJT0`Y(_C7LNGEoYyOlAl z0+9+l>dJWGxcoOMi<+gJf`N21m_pvP+30yPihx0$JsQw)TsidKT2c%;U%ler8lG0bCz z`$&O}3Up2^+1g6|tqJT}jWlxy<~D8AzMTQv`5Lf^K^ep@6d<|mx*x>_{3X3EG(+xR zykEvrUV%{({DC|Kjz@>rEZ5{oW&lOH?5~YJ@0QD8 zV?5j-TH55KWYYeAbil%@SWC-IGWT?KwZISnEUckLrA!f$>%8{zCxXkaIpr1Y3GO_U z&I-Dw8Tw^|!`h}wjveLUa@R)&(=gtoVH}zA=6+9iRUU%#23`B7;EvMC{O`SDD2Fpi zi=$J~ObQT=C)3V467@f7R<2i|jv~$W>5#E~bE41; zw;*SOkt=BtQxQE|ob;tiJ0s^G4Ht)eqHM*E@PZZ5_e4!o);!Rs+xa2hP}Ei zjrN^UD3FFFGVWQg@wr$0E3D*a2jmmh(oK3i4gMRuOs?3G2K9!xk$VP#NZ`;*K|_+@ z&TNL<)6kwLcn&f+Czny=b@4t)d0F3Y-*y|?R1H9$U7M3}uV`D2_q3L2XbVL;m(G-ssp$hLQchyiCknk`w1booMdpohIG{5KZN5fKSmxS2>`?d4!vw{#{Y zOgj#v{GLFy^vI3{6Xf^7Lk#p-&oPR+w&}ZtrZUxJCW{qhz~@Y156vco zWkqBvaQaQrBl8aICunpW-V@uTz;)?s7MMC)pyB-ne@rzb2P8k+J)^=9*)Y@!H?N% z(``L1&-~U?@NfEB+wlm>Oa&$Jr)cWD03=!6#W8_0ZiR1|XRyE@LJzAn>vuXCHpCHO zB6ou`4;L`W+D}aSoWfTV2LnDSp3Wa<8VnnRQN-p}e#tl45AX|4!{)LwR`{0AUe`Ea z-y6+7+fD9e^`ipphq;ZXuk{GufmwW^1@jAIQ>{)9Z0j%QyG%q#C%Nm`#nV}S%tJ|J zB7!ej*v%hw7<0~r&W)VK)q;ZRiK&F<+bdA7=c`l~u2{JSED$Nl(mk{O^4nndc)pf< zx`XAcr|}98@LgnHQ>7$%VEBKz06&`OK2fzaKPjdyMqw(^o1nf1T@TYqd#nmsJP|Qs z2CAzk6mZu(1qIBZC7dzQgQ}`2Z>+ky4b|_v!TlnM?5U(w6GqYq8W$~a9)=9x4p;MY zDAQKG!0qiFPE@zhk^xnQk~J=49y5_l8FTK^p`r-nP>Y_#*0N-lkjfKs?iFCKTh9;| zp4s@VrJ-}kY#ZEdbtdUa7oOBIFjzZFjElbF52E@cvyMf8ClfF-u!fjy79VD!4xO_Y zVUG;mcBCMb^bZer?G;ywE9L2sMoKKG$c)M@8mWI=%@Sp&ikH^78X4*xyrCa%zH;|K zWr877awKuf{q~%_ZYr5et6pnl+J%Sw;f+<0G)-oD%`UezNGQ6_!(qpMB{mVE|9m&x za>)iz#P!b)XObW9-?uOOpa6S}?joYJB!(6R{p2;EZ66=D;MVr*tKOA06$?+AdZK>n zF(2ANb9Mu)9L?0Y5hDf`*0{Ywyd)x1%cwCW5A4tz3Mq#ItmlI)dn;!4Bf3_Wf}lcjl`Tc^x;j7{o0Uj5e^!;jxvg zX)ch^e$V(4>-dc^S2S!4`@!wEh}T~*{e?PFI9|e^99&gJi>-n?l1M=D^8+v9FuzUh z$v#=4>PRSM?1InwsG8c0NBui-7~nVl>3kQb@Hen=_*-hDhxTAfJ4kaZYAHRZ(PiFm zwIePxIoqMGbEnzrpYX^p#WmR9D zXWB5q@A<{~F4DgKaG|Bvhen~qq3;KFKP(F?bN%+q_N=(N2`MkO=4<%p_e-v#GLCFr zyCRIm*+)AQELCLUsc!lcv3;w+hYWZ&=r-!_URo8X zki^glEv>jo5V$F5E2qkvciRsSv(2GI3J{`Ng=;}_uV#Pg$++3GeuKw)(cfQG;1c|S zs%&D)?q)hxU~t%GJcKIQ6_{bzXXmKHMep&dCq~gcbi1>iwPTZfrH4#0+ssytYi5`y zrO(RBN={VwwDWqgUC4MHg`_7j34hm>F=JaM+|>^t%Yq7Z7TOUF2BG zMd@>J)4u!bYuqautz2>A1d9l2Ez+WTNSYe1JndIO6{odq&@8*v(2v!|mF^+ih537Q z&{&)WZQO>EwB%2`B9~%mHZ^O_JiTJI^0P<0M9*Ubdd1T6s_7YIfI;|BCb+RTi|y6f z&o56Ve6h&p?D=N6R%+R%i9~7zriqEjuLs>iO|yG;Zx8Q5#0lM8ILX@#7S`bOddaX$?PARq+Ux{y@d5g4USV4 z{`&K1^|SlmD#T;C&w(##ZS2&ds^q{}j-dI?&6r~8PLup=Md9fu@$_a`fJCi9-kYH4 z9e(t-BQ=o>tuk}}uSsOk#D|-JU^j5YU%Z_$alSfp;3fQPqN<$A+@)=d+sEwHxL1HE zl4TX+KML|LTBb|=%hxRFL)6NxfIBSI()Tt$rUZGkA7-DQ6 z+b?_v1yD?nOszJWvVLf^lv%j**Bo+`b18=zK3w@wD_OK^LY1h$GEn+D4K`=^+$`C$ z7l8{hSPSD8WFIM4R#Nfg$t1NyNHVrNRxMOFgo;#P!ab`F>6(M?4E z+Ydw};NLYKf3$Q=Y}d(~c}|A;LJ`{DEAiDTFHbAw*~=e;mPqlk@XTuxafcHQMuvk% z$v5mmFQJz%^!kfX4{64HbJF{aSqW4CzC?d%U#&Xe)>~IId)n#4+B@;jitp-P3j&>E zv8x_fzQ@=Y#P|Ib)}G6X*Y_gPHKchSk2~xLp=SS^u+U;wFKbGK&o4swWzj&A@+;Zc z=#2To$z(|3;mar$yfE?H>=kdyeRe)>(@Jl?=prZs91yJeJjWLQ(G4mT8!v6T)XaS| z5pPZ(URcUP+#obuAHVA98o$AY-Y#94HJ+9A?eO=dChZVWzG-b`6 zK$MR}+x3=z{v0=uFUy?`16uDBno}RmOLDhy?D!M=u^p@jE~>fJkJnelP9$_3^1rd? zA^mvOkd~w1W-dKb$E4e@bz*g{Efc%u0caqJehoMenbr!-`2{xR*{hmOdJ>8a$5nD( z43M>vYSvKda(C#XeqK`F;gG)W=Oky+N@t#ez{y=zJNK-5#^)5m)SuyzbMcE`Nh{Fb zS~V>Z@hP-u{8Q0`#{qbS3e`2JN`r$^fZC=%glAnSM!<%~I7>|CWe}?kC3}&7oqA%o z8c%}TAJyql+_^6ye;q7)4ajcX&0%m#awb zI|Vv74h_x+X426T{3Qc_$Z-UfWu^<%)YORg`fYh?29FAg=`F2_3+dTl{51q;r+EuU z>8VC*m&v86mC!?aR!@*(l#1}g?mn;A)u&dZ^R}J)JYPCCET%WSprpp#PZ+0H{%u_!>rD96Pg{WXk`fu#R4_!XOjhrQ!76jN+c^=Hbf{c__5 z9eI~fG~~Br#cc->w8lKbL6_=hF0UFd;@duu9i^sJ-94-(Z55KzUfhWZ_Viyr!HE5Z z2>$1CtXb@;eNWrLkRT06%_N~)%lp`;X(CZmNtskPC2I;W=3%|3@FYlXv*l~0rx|ql z=Z@CW`JKg2lX-4@E*VSO^f&JIw$R^OO122xv{uET*XnehhXgRoQe&&rR|~c5ICzMy zT5u<^?@VlN(hwh?dB6e&Jj8j}rwfgEfJRbEs+O?hgT|`1J6}^#QS($1(dyYzMa5dw zb-1_-b*hDZDb5!p&>$8}q7Q~GBDkoMfg%wRZUEt{ls7wXw4h4hN9%W=oVl!Vxj1;| zGTHvH=fn#QI@PHRa56XCSKY5l9dx(aX0lN~Tta1P$b4(H^Xgw)f8nsR8&JN?7UfU3 zGMnv2pCbnRk_-jKI04%XG&sp`!zT1upgftlZRJ}->_B>}G&Dm>NLh8_fmf_T6L5?f z*$PNegnTq4WwL6-vCHYt%sR>@LqH?M*j=K67OSlkIkcd z@AXy!BTH%x`+@vWPO?u=H=9g!(d1ldsA)%e^vKZ3lG+;Yz5fe@cbM*6N0<>bn^ugQ zZcbrh+C@ipY{?v?_*H~-ob!4URk$lmzZ1R&Ny1?OY?1F$%&x6l*_WJL9C_jvu z`?U65>B5H()itb(7hVB)n?J!61ih|bcw+K>-99WMBVRd7&uxTx1BV5S{KAuqQUwpa zI4M-)G6BI{<8vs>3s=k)zNf3s9Pxn>ZK9gD-}QoY__-R+Mq|DYF8&&&e?w&IiU)u< z`SkWZN(6e^U=T+)VS|ugO%GdSf>b9MKKZJaRnoy&x(&i)5i|+Xx4ju=QCcuBwDt5Z zZ^e*la&q=0t5C8ybv?0bt6UGNUn|qcedqBb|59i;*dx$9dc+prWl^&%nyQ|KVt6m3M=y zfc^vhefjwwvya8KREIpK7-!1H!>pT~F#Hf(M|77pA zfCIa3QtXuXM<(TZi>sLV3%XSZrIP0)p9@EnNHAWJwSR0RX|2>#s8A>hV0FI29QF_B zJ82!G!20|;vWbHk>+{zaQSki7jo6mcMV_3*(L@Y933jAzq+6z-z53tmrR}@L)pD!d zav7xmwE0OyV{u$T<#DW2Tlpv`S8u{wk#n#Yudo6c5AZOCX_Czyw}$!MCMw!~uy3?((VO1+NXxa zr>iUe6ctWC@9gqyD(q-HK3l!dq9&i#gHn-K6-*o)xYLL9)WB(42fKuXS7jZ%q6=+D zKc3QGyiFXeCzo){IK@bKLW=(csz2WF51?{o^>=Gr;$=7>=x3}7dSZQgdXMJqPlQEqLCH9 zw$|2M)ah5FCM5=pkX+~UYU9hzG|pE~okuOSsjzQRoFec6B@$++E9!(4IuXhYOn>-L zx~+TNL;I3`X%M2nwmf6+V*22y!jCK^67)_-3YcX4cXR<$IdFpoYE0esY@piR>YHuP z=%2s#s;9tffiR;*VEEtSLA*$O06Fn$IKwV8tp+V>VCKLs zd473HtERDHZb3y=%PR|~u_^z``E$$k{=L5by+GPv+#&L3Oh76RJHDVcJNqd2ldg@$ zFH=ogbxcb9i07RTBEIW`{qgZ!y&GPw5=E-+Zq>q0s|&d?!u~L(0!9?yzJ0qThdd?! z6%5Uy->cgez9RQ~jwo9qgafi~Z}Uoh508_Qip5GlSDJf!)eDGIVM!uQN$NKHJQfW< z+h=SCZ9cX^9-{IyyhvUrM9BdLk5BbCSN|w>-F{%8vm~389?ZNy6g;JPFoG*UINdcXycR zbtWchr_#5{@`f41RpkIM;EZU$_Wpk>IxyJE>D+1lp5-c5Xh3oEg?;ww=l9<|$zA<1 zBuayp>wo|WxlQbsY;tYN#B)>_4Zp5(1YO1ReG_WRSjmZ*g8SU;O=SOhI>(y>bam#g zehp-Rn#wV%q*ziN0eC%B0I9#s&DC4PDw<42+2-ugt%Qi26zb>7&6!%kEg7X%7O z9vun#a-1nKn4Wq#8Ee4;#cJw;8O0@>$0x0L`-L5=hJ>SG>u7mNf{JiaTG@(Bg^VE2 zAtV2nm~|pee8FboWI>AQs%DxTLikVV@XI=wH`eWvKvkU~Wg5zj53oecu7l$1J=$MI*7=1kd10D9`EH=psAHlFb>DYXwB zV>I7xZ9YAv2}4$9Kl$O7x;FzYBJ`1~o=;nYaZ=Qb$^DAerU+ud`v7CHsdt1p$P!aB zoB*u9EbaNxrnMOTyHFjSI;ZtsI&wTJoc2FeA?BHX+S|{rTb|F3A-mHj>1a%W{P0#Bod4902U{hbq+^1rCMrGnX2r`-^Y1h6b_xYTe+lqQ+ceeayk|l5$X;uA z?^%r>oSplDzyM0X2C1np=Zf<&YsM<`%m~h9^$w8zz2xp^QV{9K~&vlO! zf#93#i3e<@vsw|0w;aT=ykuYeX(3peLB##%`q?B_{`k7neNK6x4lRQTj^~SjQC|_B z?KZ?=4d$QVniU6!5N{06? zd%tsieZNgtP}F#K`3cG`9AiGFZQH)i68j_J~O{iwY`i zPyuM5LJFh6H~zTEe-Up1E;qva%*7lkBd4 z6(XM>d{11j1$BYqLXU)IwRDP^d~!X}7E&X{jl@Q>8;gH5+9X$?HPLB<%%z=6g!|H{ zbdmWs_WRk*RZn5;s7+`H7OF%@NdDvJP$}_IZn^P<(4UrAP=!CK+R-1W*Tgv!1ymvR zHTQ8JhTvfH$1f90eb%R-SU|0x?}>A!uNq_G&EscveP0we#{?$*NyOiZe} zy8T|L7}oscg2D>|VvmTzZbRF`VjNmY&u_%z2VaOl+*H53*65YLp(yDyCar-3u1WT0N( zy7BrsFfyjnr0W_8qF1wAhxuNqlU5Q(-C!@zST^xaFmAx4w)v^t_|mklIAG%i4G6q+CwWtLz?>DkM;eBpYq2~Jvgz$UIbu)E|*TXI;;>1O!T0f0uz4T z3_}U&JlX8n$w@W0-{u|tZ3a@I6p=BXpv5NI@`8^SI4px`9%y0{@t=gRT5pxxn*!b& ze-?F6Zh8S$sK5RI032^f{KxE2Br%}IF6!nHCNOqZXTW~$vltS99kwyqOe|I&5rg^p26%u$ouWhgIdk*bKGR^P9s(7ir{A$(<+aHE~*f8=m zia4NM`&SdRpr}Zf*$f6e&3}qub^@rcu_H7=mVsg{*7Q4f8>ZhXDZ$wIckP6Y&Hlma z1%AYnHCJ@8{=&qU;E&i5SoN6+BgeQWl`|H{Bl5CUk|G5Nl>G?$s24bXjVR&c(U{Ul z{vtT?AzoT94iIJ0g$VWNgz!K|v$E;?3={-N^s;}U{wL@X;VZ1E@cY8m*^+_OTaI8!hZrz;7-W7az&o)Q5S*7DN6(TVxVy-MS z_yQFk_?DrkspaP8{>Cm!d0;@xm49;RGhCw5(J2BtaVkC6+q=@3W8((=2uk(j_G1jtG%=}mP6SL#X#V}u5t+3fTc~G(KBF!j(gydt`IuvRvCm|^WL`KOC4YG*xWR+#`{xRX~lIR|9(rq7R^VtsZ zgOsi4Mqk$PWz@{4gF0&fMWS?lJ^$Xmbzpv3Z7rvVb!1Mg3az0g{-I+HLn^Dmh#fsV zo|g2@YjZ{Bc)BLV>^v7G@$Bm#|H}nXVg3jws$)cQ9-vC4`Y17d8u10jaqm6M`>b$)`q!Dk&*xj^U~IZ~Oeu_fXQs#C2A8 zwxd|+kw0d4NGvfQQpR?vfOwGbFq#a@L)9#wQY~OH@{y+Yk~n{1zlSxmSieO`$HLp< z-^Vvr=)WiPeGrqe#u+}xm3W2fwTd1Q3}b+8>DQj3P^OYn|6@=EGVXT&YubnVY5Y@5 zMMo3UyKR&Xkw=w#96Z&{YP_O%`M7ojVW$24@@bRVqlJu>`<+80+353wCtN|mtT zXx!25VYle0;lUwIm~|J%CL>)uX@LXF^mt{NJpA<`V;i@cccpG6cbEK$N(?w*J5b|7 zMmgN7{+bg5daJ4uSbr79rE#irBk`O)#{P?e3K2|JhS~QFSYU0kXVNc_j0l~YbpKj# zcJ}qG;;Sw}OS5jU=Pq5c_a~lDvaDW>Fi6fxM~~+&cOsq7J~s47WVD$TW>hcg3${$^dvn^zPncD=4rBwFxf8fVlS>LXWWS+ z9u=iArGEF-4-rcJY$62OKNjQXj@2X7^kjy8sPza`B`$uq^y3HM|B0^1Wo^a~p7Y9_ zA-2WDfYJg>ChS|(OS*yc6c=noToxnVr6B_w&Iq$@TYRO{|A054-aEn(0!Wjjm|}v% z+kFp9aL#@zxr4$5`#d}4t=je&Nl8SO#(528U()fktV*$>qCRvo7ak}I62XMP0Aep~ z)D*eDBvL?RF+|dWG!QcE06?J}lPc_As@he=`sek}?+n=YVtO5vBW66!NQkyN`!FXhCM(cyF!#52kKYplpnf7w7-4oB$gy7h zU8lmYtgjCpw*;*tTBEW*30-r9=L84$_%s7zzw&Os$yPV3z>9e!fy#Jb{S`zhqS6PmBCdY#u6IK@eBRNq9%mt*`vzthPK=PUm0lkbDR8koU;G}O zC8+{ru!`uTjw59jf4x);*F%ZnII0=Pa{>V2ca86|)Fz~BaiI>YpT$}8EmCtNa9PBV^032XLHA}{IhhToFcl)CK;92F|LI34 zj(&E;2#Du8N*2-^toRu)capA<^^oe6U)FXsl1Ey8a4bL4@O=yD7qMJ8 zjaiHe8K!k|vn^M9*EdTeo3|hm1Qb7NmLH_|^9IgW@w${qCT3Pc6Se=x*Ctk1rq$cGgAS|yQ4*LByMy~In6s7oOe%CU&|yK7JF3w;`KfL_Z0xWbb-&GV za>!kWbRH}_kmK}Px!__BeTejVhliH#8_Q>m$lJZWaN`~;FpOyPx75@QHaGFJ1owZ@{w(0osrZV%fvzxAA9VGz9pv#JwI1L_1{W(9Mrmnuo+|Q0`%!xN| zgC1h+YGadAJV6alib)}Au}%G0o5tU+OK$G*nCzX63}j8WZ%bPs(cE!z$2(}k_+$5X z)(dfGy`?Zr9wFL*@y`aMZm#Tk_UW)_m@P6|dgF}FZ!;NWn&s0IQEuq#J|3Mz3^UW< z{PQ8(?)+pv0Or^JYBV^k{{S!xXd&e8t++)hjNrgPI8pGTH)sz%QmT{v`uAhOw_ssn z8j_~3)Q{6&3%BKq^?y!TuhI#s(7&W2qQ1yhRbywQcc=D-KU_3b2%oM*|8moPhGC8P z{n(K~{hu><2?FcLn!3gSZz1!El?<-On9RXf@v70DIi0T}sCnB}Q%iXA2_EQN4;x+W zO-XqXCa$BVrlO`*JYEQ7m2`iX{YfHUDhX97I;RVU`|Kd$SuRa;eJ3UsA1WJ+!yk#; zjGZF;aFiG~m9!TY)>U868KBp6y2PaZf!rsnvbDhLQ$m!5s7mc~H z@n$y%Ne|)|!|Yt~)rbWvzcyh3bF?5TfC9hrJ}uBRWiEAWE>$U$&E3|#YOMnwED$Dswm12? zsU&-rw;4g2K2ZHK=k_48ssr^;pZZ23}#`i z)8<_W83f4yn$i{Rj8UQ#CTmD6Vq=MZkbRJmss&46&5MC~MRIS0OF_+}_0=v- zw_}iR#Lp@H2I<4Lt#&@Luwqs=I8pu-u)I~&p*`;tdFWWtwufnbo%!T)f9njiI`39j zr;cDfD*Y#`-5Bt1i~tx^P4CiQB5r3sJI!ssUFZ#x%)T!&@usghq)yP1YC|zDE6)N| zmLK~vIC$}vWY%DeHPBCJX}Xqf=M8v&%b?SW(#$^4Piqm1iMQ1uYamgWyTss8|NAo4 zQf4n*y910`o5rrfx69y4zE)Kroai9P!-FyVBU?i8q`=Fn$s>p$%#W*q&j7!%T; z5EiQBB&amWyUsCt!Jw1TEF48Zdj;Di21mZ|J)`|!b zjL$dtuSK>$l%ra`IRi%Q-@hU&=iU&aCXhCOkihxB9#FS9_K<#M_h|kCrMyZD9f=~Y zH%UGZbH~&n8ySH_CH3DLE);IA+{q_NBQQ{U_f-at;>B_LQx?UfrhOL zZ0l6Nq(nP8SSaR7XV)NgBV*hKO^fNYg5>I=G1za}x63;;)K_PAo=5$xTdAkfvKduh|toj|t2&GGY-KopuQ5flN2L}cmbxTUYKNRMM_ z^WE0z5PrEvBn%8JJUhqR^Q*j~c0oD0%e*`@N{6zK5)zuWwv#6(H#0N1-4rer7WVc( zExq==f`hx0l5N{rRW)a~x@kZR`JXmcP|)w_p+ImL(YQ(Pet_$fyzGDj$@Da&vXblG zTOuuGC0v&bQ{~^~W&G4ry7PjGH#0=i$$vqUW2K z6qP;=t-A^Phk6}o_qT1%kF7Ji7ceAZD8&EmLt#m^7AO;8^0Z)pbI2*(>U>AYn?qVL z*N`>r*PzccUrZ#wAyV*-G5cWn)u%5Gk7fG8#(C+0f|I6D0n@?;z&y_#zYoH$K(W5*`>T z+ZO0x6L=k>KfeFiMtTV&s#xx5>R9)u_EzaW>fxzua*LDb{CkQGpPKO7s_*^yB(dUs z!Vb+HM<HCJB+RtgP%{_}wU{4Kn<|`dV3W6S1 zL(xgAtBz@dlrBL#2R00>JX^X04audaf*8P?H;MX>ea}S-CJj*rk;%!nkh9HFR%T{r zFrY+YMUDV}4ne2Yhj|cKyFV-v9A0jGTXCvK`8`(NJbq3v2HbO>)qzC<6PGy1Oc>dB zg`7SlS82KOk*xD&;4AiuuR;7aiKk03U_~L%gZUzEaXIvXnBBAKx!IGimzEjIa^CAv zrTUdYe+&nse{=oQ*-n*WB=b3jh20}(c9IG{UmD~0DD>d`ob55QJ4Muxp=rt?zxUur<){y=$%` zSSaMFH|{J?6^GRGkt@sr24k_3fo-#)63>-&-yg`ByXP2|LUzIC`?*~@&j2CmfAye) z@^EkaYg8=%C6FZ@P{i%g{{Evxtx^D86RrgVM;AG7TZ0Vy&PpCCGF@C`n|c4~38T2u zJ-zY&40IJDmQ2_)3Yfko6h=I+ENp{F9Mt~SE>HK^S_bAm?R=W7M3_O9{_nKPtw&WHaF)21n8C2vNba*(>6o&3qE*&}q{1 zYnBpG5d*C#>DMGV$dh*UzWc}UnjJU2;oAf~c2@49=Kr<;J{0}oCY&F+iIy)rk6<_= zLk-29>bQ@a+7C(Gvn<|7fV#qhc2MJ;#Uz|GRNpHE{Yw5A4y@*;>$kXNLI zPoyP~<7v0ZUe7E4Q~o5#+BrN!O2hzG-jjRntaYIf0&P=n_y8azl>U5ncx=v@qQZ{` zH08^0Xd-`^RCQ-fA6Z&bQBn##)$)SP-r6!wCuIR=55UMWq<{T%*Ts_w&Y=98@6l|` zV&hv9^bfqYMvjJ?-pk&*QM{E6fo%pmEsxjRB6p)0x{Wtd5dG>fNnhWpStT(_#<&4? z!hILU@SOVkxuDvPk&&5)2PIqGH^9&({KuvE93;D_L=gigCzZo)B2Rn(^FZmh z@HgCYzBfi}gQ0ZE48_B5M7c|BPQjTk`>v!{ajuxr4lhM6zD>u73XT8v)X1guwhzc4 z*UDRaRXB`5g{5NAhK~Rs<;5z%e=#Bb_b6w4BIGT@P3%{b*GSE<^lX&YzFWJo4wEhP z5AiE&6!a{psvWWz860BXSVLz`)@Q`gZ{qJezd4w#?oa+e1}Xkf@CP!c%eQ`X83b~Q z;aF*j!mO)i{cJ2+K7Q$0`n*V#10w326LdCR#w(3`O( z^dd@v3JXxcrD+@y95(g`lf&s;l{T*(ssz<2zX-WataznwO&mZ$y9#NHo#X|AneOvoTr1PZj48^2LaH07#90Th&!CYGB0 zlG1W8hmC^`ft9U6!{mNAkl*K;Zh;5@jZ3Wv*+)mwUAZ_Z z5~C8bw}#=^e$r_?v0wIOsG+1x1+m?SH4MF8Rd>L@prDRG->1uho0%1gRO90AI)a|-h-g=tDNW>XtUGybG8lBUg0IO{n0CG(e*vWwd6#MF8`(@>tT z3XNSP*EhqrIelU669QwEwZqEEfwrs6pid#1YB^ONCH$ zi5$j6s%CBop$sF^7H8b-OJIf1PWf~muHG)6ht!XMAwb7_OmQGy67QeRxRLi&qO9>p zo;uI=F`a@cANvb)uBAM1V(UHBAD=7?S=*hfFWfD-^&i$ZnJB6EIkc^c5ph!@bU1yV z?^FeUro?Dk6a2HwNDcax+=OOS!)S8T-mY-&8kLtsB^dF8Npi6`Emj0yQeYNbDLbsh zcyu{Z>;5@KC(_t1sBh^u(Z4y?uO7U;1$91GTP^3Tn^4Iy*Q8C9zK2^42ob!3R{vC? z&Ox-32kBGWg~K+SxHqEUu=41j*MW~J{v(&iVh|nS4nyxhC^mSZnXS_S$n6Ub3!PrzaJqrI6q3ZwKfhL9oBA z{z?jp0&U78;onCH=PL?&Z)Efuioho(YlVeJ;zNo28>kwwy_wS~;qOfdr_T8ozbNDiz9-V-89OTiIBF857W(88;HC61h)a zP3#nhEii_`56Cn()2+kmwf@B~5x7Hi<(zV_Fyl zurb~tx{Mo3$a|{(3conz^rT5>?8Do=&E4~m?Ak3p#s`Oxr|HtP3`k5jkiN}t z|9rxMSNPX4g;Y)FEc(r7cHu5n`qsxLt(+l`jzMu)R}5F7GVlW#qfm2~Tw8SZ{f%z3 zF3$7H@C_njptb`2Pe_yEPc#e@1xPaKrh4fDZ1D?w8Ei`$9ex?kH8Je*0yaW&KKt7v zJZ6IN(vzv!c@g$$ELaU#?Sj{3w@cvQ{{n|)A!i;03T2JzmdThY~u z;2eGq`&T0amf<83p#Ua4=2DbEYK`f>4_2sQeBPS5wN85dU*~Y`=okm@JiHMRCnxEh z1SAv;OtrM^PIiz=Wb8PPo}MzV1o@&1;k5?J77eixVc4(k>Uqy{ceH+_HPKA69NT#Gmcr}j2oB0&VcNl z%0C;_cu}71!nGQe%CweNb2GCQ@#F~1(u^TwZt?Q8iOD*uJ_{x@)#~6J6|h(_#V!`> z_(2$zLf;>PGT@tvN_lY^efo8bzt2?#(=bMW6ABqQLKVtU>1<^wG%{$(XMZf!xOUyU zBuFJh8Eg>8?rI4D(tpTldQE-ye?M)@d0Yyj3EF2lagfl%l-#bQRTogy%=a6B8mV7U_$vu!MqbsgtaG5XSn_((EdGPmrY1$N4w?kFxe&W0TQX}v+grh>I=+Rf0UnIyT0n=~{ zU_Zeml5brS2e8)`m5?x=3=NTGdbjcGgBY}b3j}I@BpaBq!b<%M-UWn8Mg@%lk{O?lAPiUfztRgc7Gy)Pj#=fzBh^cN}WhTQYb9W-&|UrEX1db&57h&?2v>gCB3P%cmP#l6jkiSICK4tqQf?9OfP4jswcbu zudJ_{%hONd=}97)HhoZ^AY#J2ztd0#<#%7t`cbQT!~yQRqOGZLN!+MEDN&yo0;kCj z;9L?3{=;&ItM!&ND+)Ku$~0r}V7wc%2POhkmneeg%LkyYHQ>YgZjA-1+?Pf)Hfn#o z0K5%;pV9#{y=mMy1&|A*4xea{;jAtCYYQ~2n%NtMz}%B4pxQm??0I-*{yB7+d$!YJ!pwxCPvF;YjzNF7^&uz$TU%^HY@3)CaA$(UVV?#ERg;I+G&G8o zGtO#66t-D-keLI7OD`ilGZ`!UPoyMR3JWwW(t3bAxk6m#l&UC(Ld?F`k7`z3(l*0%f}0-#oJ5fHX=J z*mBuY`hoHN<3qEBb9=4$26q8rn%!%x3^)!H)h-K2abjlV!(cLW+*JJY5AZePaNs(naaG{j!>Lo{` zf&jjMj>6!~V=^yd8?03Kdf__r-1zGk9o%gv@MNv2tGl{bPc9?nA09_8n*4LFm>lna zT7UxRK(b^2Ja^k!0X5#EYHo$aiBjluB8<{h=|M~{-2_@=kFx(gNCPnDV-6uTmvKEd z6^&AvTJS)?6qWXyyG?aJCz41pBw)D6{0DimZc-lp2t~gcws;=$6+WwImU$~zT2O!p zY806*BbJ*xwfb(YSaUu${kf??O+SuOTIJ7$fp&_~pwhpbE++q@n%lW!fPTV5_n?|z z(@Q!~MVY@I|EnPJ-J+#(rYbDp%@13`L*H#?R+yBy6PBZ_n9)w%O-(;yZp#yHFu!>D zEXHG?SS4{(gZYV!SG7+%PLvADD^34B(%=Rt5s9S1t`iY*euMB8Xv6r9{8)_cJ=gB5TK?Xprsj8 zE#B>L^iweYX@Lmp4vP6^!E-u(i#+5b?cMRyyYg=l9sPjx^kkLBHO#{S9NLUmTY$S- ze7*GxYlQs}m0%F!-PbGen? z^uksCHzhMY0AhA+7PcjSP=gHK5yAY#fb_xTPDU-?TBq^n`bS3${F~m_^TYEhr2PGV z0YNxsVU*_-{q#sR&ujx*;Bj^Jbxo+6Jy%k4dIz1m&yeHJ`L5USVx)|{v)|`c>i0Z8 z~?J><o9W_$FBl)`5JLf$0`Dj>01}t%sHNE;>y&u z?2kpI$hz>67s;d4H81~^dp|uR4Vrm{Xf1gn1j?7kdYHR}w8sIU0-< zX#f1r-xL&Rg6>2jEUGBB`V+--Rw$mM8L$M=SA>z8=-)sY#B)4u*oUdfUF|wQ8xK&P zDe2|4*7dWt)az%dSydi)YaX?h?S@0KLTRF!b@}N&v3*OMuHC0GUS(BWi|L^V=cR;9 z7Ua_Qw&#_g!h&tnB&AEHY4UP8DRQGc#o>qBYdCy8rFe%E(}!Vw(YPlDNdF|v(s2_z z*W?lR;O01Ta5>m^(*jY{U<1C+%fybP+1q$3ttb+&y=W%y4X-toQk5JscJFJ41D8gI zMR|1S=4<%C>p8bf(#-1>FRg+Fdzx3QQ1C~0FBRQ|&vXL+?IrqlAj@7;_j>p^v|P6Q z{8aAPMm~XJ&7T(m0XcrnYbK#_Cj3_Dg8ZAZ&+KY>KbSb6Wc-5zbzmlTe@ihKe&Aw8 z!=ejcWH(Z>=7uE;HG2U7XxPRirm=X*{aXV@TW?;bx(V6Q|DK2N18s|ti_ih3kLB46 z%NZu>`#0BkaOr*EmDMyI$%P3tS=h+>-QlhcB0LmvKTVu6t$Dp>zCyA1r8iD`DJ@b+ z$V#nX#yB2ps`KT^UxiNS7(+fi_@>($4naS2`+>yN*tl)BnvyPoentvchAe7d*DANN zdksJP!!VaPq`~fwwo%~#Nbh(vb)&+SRk0zv1|J*5$xBpA4KKJ!_Z)~Tiy2Wvav93a zmiQhQ`5wV^yfR2@laOkq@&BQ|`!|bYW3T8~vz7^jk&>^K-d>W0(WhCzW*b&RwRTD5 znF;IalaukVjq4ikqPdq(PJDFb?4NMLCvvw%L=}u5(%LRLJYvO14lesVI+%r=3NmLb z^V=+)wKbG^ zPkKJ^n_Eyf2Bt%C!s6Z-3Ks7w@c;OO^6w!ivz0`I1LU}4=4(2S_RWyEl%O>dH7D22 z^}xB(;`4uMhH7Rpt3sp$@oe}%17l(((JJ|s2 zRIxkascx(w;$Kd^c)=o5+CQ_UHv*N;iP{A5`_X+5dutHBcm zb`dywKy=x15nV5u(^pKDm_2Hc4_dNlauGc}l28d+g!XMB@yzrJ7w0*d?xWRMGN@LE z$bISaEo8^8YwedcSC+MmppLNw)|=OvgHor}sVN~pr4#YC+aIOD2u53E2=KL;IOVIB zLi(Scz86N{YLoX`xtZZ}Jr7J#0ueBd8W6@UFMU}27=5qJ2uu*7${BKP2V=Kh*UwVf(dv3(Y#_buxJmKE8Q!ieCUN|6}{8dtz zPdG$v8}Q=p6tj6=Y#Apx;Jazuy;F7erz2BK)y$<+-arJ_J#-<@d;WAQ%;M|>dehS) z29g`#PvHNeph3!)R5CfJj_BLVvw?6UbQr$6xecP8J7Fk-E8jX@1F=Exk|Xf z9F`PO2H7hf8q_@pb(RWo4R)of)cbt}S(B3)e-*M9^3-S#Ea0T$dioX}L#B>y?^S5O zFR)7uN5~LtW*p|nV%?f-0l-NX0a~`pONs#xz>Lq%nXXW-_>S){Kl^svnPz8&az%?A z`qmz3s~c;jCLV{4T=N^9Nml zh{T*S4wS!QJ^+-?sH?{Dxkz8l*ca3`+Cc*~wa4KuW8qqM`ZEl!CWPm|yXNU`Z#eI@ z54>eDh3-P9NWWtkI{M2#-oGx|Su zk%y8M$Dt5m_8W3naB0n+EiWveq>bM}3Zri;X|K+oz45w_m$S{j3Nuo6x;Jp)eii#K zFcgk?Xj`D)y0PM2ZMJS29rBQhTf}Q<)T5;uUlY} zu-7#1?2y#nlmBVwP^-QlOI(8G=7x_tjvRj3mJ14O zGN6F}0FD#F-ki3~pTlF#KKk(f%MtRP=gnzCK{P`@HHgywxP@f3eYD*(_F zC5eU>&@{)2dbYUq-@5e6v4@Cg_b&cXZr$PUH^et(HU~NWvx$O%YRQU7+_#LFDp|&v zuB*T~yyx>=rInSSTWlxKG?jd1;1fCKmdD0(=GQo`&GViue*F~9T2dFG(O z>;_q$pDQShl`wMdGrc5~qE=)h<9orxC{hT*yJiWbBAd&M!X28?{pRzD~_o^Mtq@@Z=aXsz6ze8Cn z2ib)2;4i=bdp2S`TJbkgOOBtfnS5884A_7lao>#Q7ujb*1zmm3ki;mMxNcEf2Oy88 za9zscGjEJgU1vs@-~WpbBa&hpz&gqkmF@BMbuUcThk;C(^jjD2I>%fsL0at#0;R}+ zX#k+>L3;{*>i)%(`JNK7Jfbo2;!xbPmW4qo|LPG^(2tpI#dadHd}526vU13-Oos@u zCWm@(BPbR_PQzlXu8>0Fk0}QjJbECk=}%EzB9LO)h>dMrke|h*6B_|S(A)mGMW>MSrEz*-!73FjwV2(X3WOuSdJ~b|1dhqeuwH)%Jy|iuT{8o@XaRZe?AUR=V ztu{GkXntPGh^fG^nDiGC8KrzMu>dp5ya9qpu7XsYS{XF zVTMvxXK6LsO-;Ux@PX3CY%+R;hy3J#LISixoG7{|&6rdhStwFRlbK&8)l@|h;|#+& z|G%3FCMLDZ7=xRjNUsUz?BeXU@L>T3->iHRQ%n8oea&Te{l}x1{~iQJU`iFNV(7k| z+eM#f{1RqpgjDe???49JCHVIVj#1$792?L{z4})Q-xp=hS`(EM;yd2gr)7*tENHdM zMnbS>9K_M_mX*>(iJIzhBwAr6ByA7eAeWSeK|=Ip8FJ#YU%Dc9&nE0Z0>YRwX%96ZXTsE>`gY?gF98q;~6X<_7tu(DEHfO-Ym?W;cfq(7b^3nTu zR_*6Y+$=nxYvcMyT-|xoXT8quGqgcG*1oN)5@dUY;o0cQNEKb@6G7PsaOgc)jK|^d z_4+1p7_*!)U8fvQ9rosaH{VdMLRgOpU^3X%Y0m7*;E_- zyKw#+Rx>(-`D1@Ytyldn7Kf+&c$ax&>T#t4$WK&9Lfa(TWm7dG&n{+e0gLwe6m&gR zHaceEmo*56{4}6%LU=gqj#TLmD$-y^5_xE7BtB*)2`0t931#k>amMT6pg(14Zu2TZ z!KZB2IVuj&qvhGVrKMYOsj9-+-h3Jl-cvw0S3ylVW#=v=P0Mq;egnqR;zVLuma@um zP;zFYKiI&<^~H&EPU=xw+6u=1st2*g;gj}Nk3!QSDfA^C_ zB-^N%>_l}ms%dHd8XAN07qlB09XTN^rm)ffyVcKcV2x3^{@=@}p@AI`%MA;F*?1E8 zh`Q)3odXPp#>|2nnmRC8Z+*g3pEl53(bi}Fvuw;X4O!=MgS%rkHGMC(Oc+^`>-4jX z{mx!zYbLwh`!A`FCb`7oY#ClCOoF*O0LC?7GJN><2W*h5AvH9>+X@SGwcy{7yISk5 z&2TUu-qu>*JAZ~_g69l(7;>zM*!d6u#AmrmT+^Q+MfAdMC*kr?0_yqT4UjiUb}Xl= z7D3WiKSgE=;{+YQr59_+7Xai*=X-H+Xh0&+t<^wHxF!U5+YH2ouOI%pXHd}us>%!M z?bo1~gqA@83CVl0@qQOR9rEOubTmV!`}owEzp_yS$p)mc*f0MrQDJ_XTSFrSau4z1}3TAX05WBjlZ1-5TE> zQXZxT*vmP>J8<=%9}yWI0S?D2|!46!WmtWur><9yF_+A*39Nqv!?2b4j5H9L%aZ3D>yv= z(b~C&5!%B!Q;}b^^NNiX+Oupc1kg)9A?FIW8u$vqo@LU0-62goxZ@?IRyFF#i8w|CVeT1fCFc2Y zu*izm1^Hf}C{uem0r9!P>UhCoNZ^TB;u!q6eI|+9+6>do$^NGYNNz%+KlP_eNXuch z`I}Z`)g!M|`qDe~O%rR2LPZvIKld_n8s(KfHu$C1<$`o%5Sucoh>k8(Qo;Q13IpH! z3yA#Cc+Sc`N3pz={E6&M(vBlz?gISrVEnkXLSJX}Nkpsz32rST$ zoJy%V(d?SXbZv$Q6%Tp69rElB|D`lK#T zJdB(6?x=Gd)(grUyoXQs;z8sRVD$=n^H8pyO}eQj#~y>!r@q<$a3d5`90L~kglQ3U zGQ~%%bGyzL8l)OvfnyYlfpIP%W3)CQAY=cu=#iz0EvAbO9yY+7d&;Di(8*CTn%IVr zz@e~kN%3S?%pDT^&px`b@{vCFglwYz5C6OuVQ}4w9=5cwI?1OA0sQNJ zW&kGit|?a{>uZAky0)JZVo3VjhzYqvO*xA^O++x03b< ztWPyP77F0U{c!j^CT~9YAUSj6xszuKK`yJ#QE(*HXk|W=ZWBVT?xJ!`$L>LZSPFf9 zDc;X&Ok#W%aeLCRS2%I_x`9#2RcGR~6Wj7d7~NeM8Me8_NM=SwYnC7G9{Pey zIqZ)H-M5yGF`;y-^%lZ&g0!;-`-In`~)D03I-**lU;e z)xC6_x^kR?=sH95@!kea@Lxc_(zwI~hDNT3k7<)p6|bwS7)dB@&bLx=$|}uO{+u=V zu+JX~>VduF=UgtkG(tD-lODBh(n?~i)jciqO^E)B@niMu`#6K{HnQ#QJjhQP5>ex% zj@EKdZG1j38z#!ObT)Kr(A>|qbzAL)Enr#5Pu59P2^a&-yiNbWK_9$?0|CnhoH=2*tvC`9<1M&t9H zlN4BWyb*`?l@adkJBDm^O~P^WOW_lk?CdOE=w?ZGLUc=>!B22vl$zLc3emPjDIXXe zRkFOvemI`((cvKBY;hYCUHEpw0}Ah67a<#^2Plr}4o{XWqe$#rxdp&@ zM$c_@*F&(C=kS;i@XyF#A6A5=kNC2ZG@3|CYJpF3Gx);CxK>4pZ=9a)wN1iIJa@oR zn+dCdN&xFkO%|w#L|)&hvaG}T`e=8xzF`t3GHR>nTZCgvn|?*`WyLote0Mj(2OI^f zd}JvJ_8Jf7Ny#-TVtX`IRJS0C*`q^i#H70|$kl(3OICVp0aPElp@&>L+fr8aY~nt zBky8~VRHJ-@&n&(4kt$j-8Lc00)s@DyD4B*&3^@V^79 zG|TtKDi_mQS4&v3Z%|v*qse6TwpMdEb+y`T7D3$8$8Vr%^<>_+CKd3KxoAkcW_8^C z8ALx7<5~M#H&ye|*G(t6&~K<+E!7hEDY*X!=X!3KtE}FP{K`0z_9p6i(!2IVTyL(P z0_SP~M4za^Axm&*YG2j%s*@qU@Fce|Vs%m1c==p<1ld8TMhHy;c9xwAv%=pBDg^J_ z_Z#^5%HL#*C+UoQR@I-|bXb^?9V6Vc^%7c%+LnRKVHS82w@*$c_9A z43H48Kn?4O)XOKzT-&Dx!b&dl2`d>&5`bGr7Z?~2FD|B4q{WdE@W+|nX^jz-i*3^8 z3+Sm+buF@rmZ$eC;y=+A(}3d{3GspGtp@m~Y*=cj=^`<6A$6Cz1n8Nt}l`nws!a6h5Ph$VQX8o66@7So|QbqG% z%N1-y9`GqsXf;wD^ojQuq6fN)Ay5J5Fpb?ZA(U=1S6f)ggsw8p472|-n2rbXQ`|sP z3Rv{4t83vbb(E5g6fTys=65}wcN!N^Q&zrS4?^3#pBJ0lq4^GeY4cC+5ec$PJDcYD zNZKJmb_*%Vr(2|GzF2)g?jAb%p5M?mG!0gPe?X{OkFu0FGi5*YYpm%TdPO$G{23r4 zCBiUzQ?8|1%U~^}%Cf0b=g{Qfc-yf=5!f?gL8h{x07f`2{ISScmgHS%MHnwxLZ%F3 zEOI0uj~vB3F4~gq4YyqG#lX_#GiRxTyYckNEtA~xZ&G8RtBO7m2dqcva=m`q5XS~U z8=Brs7rxqEkF*TPc6uXk6n=F0X-cA=R9;yL`a*HP zxs}z_IG!w8AjXE~%&)BI=;^I3Eby?h{&64{MkgR3NawTx|EhY43j2K*bD*kZ95v!# zhhHyq#7}IjVez)xMXR8oApBqx6O)tGb}#EjITCziSh)=Di{EghO)Iupdoz|dEiOlv zR#xHR;Z%&t1&77v+Pp`p1v&%Rp*>Jt(>*~mmc;J}NL-#kcs1kqjb*l0#})-5cK*=L zIGUkKhC77>e-X&)ItY$BEZHQFY9h-dZk8viE=&OH?2MrTYUlx_~Hn`*U%zbl{YoTtXy*#rrS+(LUTh zL>+5Zb{k-yw<~Sp{VXKI=Wp+REYf~@dP?H}M<64whGWgY>_+?N>v$%Ei`oXIp@>r$ zRhIjv(A$;Ji?838FTtQ|L)nm(`A(0L&;3S-oY2cP_)&iTC2#l<^#5zHZUzUffu=d* zr87n|kd870;DXOuQ>{Riuo^Ppv!SmW*3Qbo=J1mYeq8A78HuUQ{`vl*rxu@xO$HAK zXT_nPaFHn=5)TsDG3R)v$OwmF6`QGW>eYBa{fy2z}7BkYiT`oL7^QlH?vi= zj3>BPX+#2G>_+vFhbvO5U}BnwjM^ME&0)Kw$Z(gU&dDxQQAzV~zBQ$@5~R&t<6*Sp zDEL?t%CL|1F0RbN35^z0P>uKH)oSRHJm&F{n1?6+aG(Cl4zyWLhR@B);21^Mm{0is zu>oFwVlu03$ z(sjc=AwnINo5epG?A!{o5dUCkj8rB#3lI5uL;r&}GaV*X1w)6SXr{LFKjVI{S7T$capdKyrGL$Pm_Z#GY|!uAuhCh&E{8p# zSZ}XqZ&~8}%7uwp#FmFwk=vz{5bNp_9%dIfp*3(|JLL18(A$BWpJZH~Y#|*r^~BK) zcN80Pw}Unr`u_2;_i=TdBww z_cG__bGu;1f}Cr?%f=QjNQI5af{Ya^>gnm3<$XEW*Vkv3g*F`GjRGrFpN6xhz#X*bCbvSTZw_y|#zfo^;cbi)w{664HB zE*Iq@^G+6h#JPsy)N+p%$fWq-my92URxR=a3qJ}D!I@C8k^)6jq)>RRNQwjxga5T@ z2@j3AO*1qdC1FOC$eG+zZ#ein`f!N)`+-YjDt$l_ra}>u7N$ZOofgJ+GM?KP!aG|O zfxiR48$nuKpXWU$mIdNe34D3*bTLACnljB_QV8(8su=HVq0-E)Ap`GJsbv-V+$Ch7 zfb05(#F^P4jS!e5rxfEq{W;CIDkn(#MIkW%g4++x04V?X%+FNe95nwBg`VWU=GUp< zKHsgl5fKrs*m89<16>Zw2UCSwnwsWmVE?C>m{_aZS;tXD>vp{pz+B?I4h77o)mAL) zrf_Td`GEst1$p`T!9I=gtLzE^vL}$Nyz{yK8x@6$+zp~c=gWzmp2toixdbW-ionxx z?YO|5HZ`{A<3XX4k`k%!{YJH!Bn_8wS$;0af(*4wR+aS$?2ImMm+U~Vu+GpgxwMIg zbb1d%K6fk0Nl9O(ocZ6K?eE_o>AgKpE6GJhMZG?Z`{{Q2zPNQUl2uP;x27vXxKgIK&HcMy3fht(yKY@@0QF0W1pc6w|!{g&;p|`!aGOb2N1*bnH6kf}0j28O%O=I=hY_tYX&ICKktseRl3-$$0 zN4q7dW3@jx?aJ==?SqDQ1hm~umu4-?P5WYoa=;-%zHjO*abOLgl1p7lsU`y|C5c=j z0KkH0ekH?#uX+Wr!uzg0WggO=Bd#qh>&Qw`f+N-BF!GCE3;{BHV-CW^ej@SeRL(M{ z#4(?wSxaTS9%PO{GCbn+&@>m)G|i4qp`bByqpwBz=_KzW5&t|G;^M<%hZ5Bpi&eXR zZWa_UY1Y!C*!tkbD@BgJspT~vC0OA`eT>wXzc9%G9Z-zzuF%kuBdVtRQyAh$xbBk1 zZEpN)g)bv6o|&hIJb8gCCWS{@`BB7z#Z@Sz-X~~SODdA0$R)*NImso(F3`;T#3$fQ)_3Teg^DzpBf*p3#O z8%;sHojuB4FhJhEIB;IY0tqJ(hpf>IbbWEhsA?h`y+<{Sx<~kpaB@tVOG#ilk?|iD zgf|E0e`z}%7&~a}-m_}b<9dN`?)P$}7oH=opsb;>07e_!#Ja7n<+6q0{adnyPWt-# zAnl_vo1}H)eh1~gs^*Ww+ zn9`*Sdfb<78@;!Zv}{3h*A5W<$PJEW%fWH7^PpPZ>FwptZlT6xQ-Ls&l7Zo5h^~^J ziRtY(IME#$_U-kqa}B&B92^`*eC8ZDI51zMIq>kz-nLeZ(m5+oLUIo*W`Aw`t*CgP z37Qp|Sc!iROF_rwao(S(^t~xHXZL(MX?z1cShgQ5;yUNFoksuppTWDsf8GT(r{kvc zAsrHc4cb`sI$NnW>Mw6xU7VkvpPak||BHyP66P6{)$_=6=8Dkj98Kvs5M87JAEByv ztPTZL62(xH=QhsSIo;F}@W`)FwBeDvw|j#6w}ceunruMloOswbS3P*lw>Qtd|685mz;}gl}?%Y=ZDqbizmK+1Q#^oy!8=KP5@TE%&MP*9> z{j&5wm!-%4ule&pY~NAk((>%zMwct~kBJqhU>#S#F&)c`S7%jDw!y??(Sf*DGZMgi z7!eF4lcES6jvEQ)8QU4vF`}yN9An$hpul2|B^L$1%srrZm0a6Gy6pE+X^uMPJuNpMPK< zU09u#WrRm6U52u*Xbv<! ztak8$Ws1YtZbj~va$7!)R2^mBmgA{Uwp?YU9CokB0P>@ePQ`wdp-xh06cVPG{%?5P z2zWp}AvxohyJK_LLM)bPTeE{vAY!xe!zmuniSNx3vP9^x)v&C=$NenHiT}95wQ!aS91S#1?17(Tbc= zO;2ywjenTgug@W12Su|};qVSf$ENF`%+1Z`JN<-!?cLo~zqgmrvLNK{D$u#tYIJlo zTIltDe}BKUvLg*l>Lh5^_MyYWhU6aOlw9D#g0ifR4p4HPUswpPn_XB`9Djx%yy841 z^A9G1Xv@dT3%&@9t;aPz?Y^C){SL(aY#3j`JIw~Hivt{H`(X-vm;ezKnLLstNl zZ|B?o-`vn9DE+3uf(Dy%NPnWrwIK(Cn4hg?KlZ*~UbZQ>rjl6%5~I;IX;<{W^P(q4 z#lyv2bzS-g*-Ga4WCYN{azJoa$R1CQjb%A;mz0$3xUH{zIS&!ShTfR?_4)02{4L`? zRk0@moIf@(u`W0lpC`mDvkYo}tV+V7v(0Vo&ORdKl(D<*+AVF8Nf-_ngncH>M1>ZC zL(N+D?d2^uwMcgPj6AnEyR>!&0O_MCu?B4EH&n6>E!wNKJ|BmP-SF|9K`koC3$KfnmYtK-`1(&P`-#N#_UC! z3r?=a!%31!k=h-<=&OY!FzJa>-C=WuwX{JOGZQ!7c2G*uLw|IS0o`mK;c1p#SgW2a?g>@{3>~WT(`^n+^*s7PYk_%AH6lEV2&byFY}p?>@ole9Q)7NV znYi~#+CGo%Tfu2(`Yb>9v3=)4ujC^s;v-=uD$=TKNZw(xdSWxC0VRr)LK)zZzvAO3 z#1gVV^_?VU2fKfSl6}Fa*U;gjo%ie)R)?`6snh0d?<(J>$6Jw`RpdnrU72L>B}313 zwCHQc+6*7I?tO8~WAmFw>{Ll;CJ_T4BNv53&(KpI&;6!W6uDc0`0;G%iNx^_GWZ(S zq>raDF8z%bwKgwOXW`YOKY#3gpnOrV|-`=*D=I2T`bz=s*TZ6fWM&#<9mE$&vspj zxMNo@P@p`=HGgv3*49=~K$&EMwL@&|+o@LpWx$Ld_r^Ii7ViQ8?YerP_w0HX7`ts- z;?{)DZ5rU4v(rX?F{zD|Q8(fip4h5KB$xPyXQB~v>o+d_L+&mw9TO!fM(uk;G{N9& z+znw^MNJ1(q=B)yoZR^SzWE1y;Stw>b&m?ZWD~Om7-4RWwb|v#&*<(Be=&8<|1fK7 zd1WtcnWZoTU~8CBe|klW<7do}v20=zz`t$zdNPg}u;*@POvVFhl30$qkVHOz-dk8T zco@EB*K%!GG3B7eR+`HIMLi&@q@{a->WOxrkC$H}zw};-uoKeJjWX!PcUpIUiQ_ss zBkcZ06IQ1YnL{mGmS$8-=<_NO3j00KmABn8@dMuyD!^#!fEx+cf2SiJO{4kp7LxMn zCcRv;UR+kqtz+@db675R{J7U%Cwz`(Zc8v%HnX1j8EXn_ML#H9M1%6;mId!sq(L$Mg!xU&Z-4u>{Uv-md$8812G_Uv=C60dEg!*7b^$ z)t3?%6)q^=1VaHh^1zvMDQ~DHH#awqoCX^)*P)MYyU9HwT+9e^ZSOAc5ZR-kxZXodVVeRO5GPKr zud~KndXA$=f!2dESiA?mi`wxJD*&0J`;*Q-kE7!AClIZ@ei+gE@5E@8>_t-ef z*tUNod?uIzTbbRF%Y z)5C!*HLtggCF49qErj9AVU`wKas}`A~gUyozS zHPo2xOU+%+4rk&%QuYqx3zMU-_kJyvE2a;}l*5}@9uhN+!LQeS197kH7kx~IB)K@!Ru38`ki6nYd8y5x z;noJ~@sr!KK@shM2))hn@0u6O@n3E^-B3d##kB!u!GCm?h8|uQ<(T~ z$DM+pN)*i&gsKJ*g#PRLKuQVh5hpe>)TZVgxBA754CU|6{|-?`rpb`)+WPb^+S&8T zR`+T_lpO-d@;odS@VdoE4(2;;+Ug^+GsZV9xVaZ6pPZeg>?gr|5BpGu7&pce#nCWf zS^xd}cko!-Hn!&GeylE(%qI+E2G)1_vTIgsD=R8oo3&R~R-W$8-X=lzaL`{~T54r$ z3+oT&i)(5w6wh<0VId)qyV(gxJxchBXf$R1O4EOkoYX2uS-O&%%ge*Unk8`{e!C`i zV#eq9xXgPt=Ca1G6hPmia1G{KftJ|nxeo~h)1leV+f<)Fe+E;nKvnnAm6_WT$XmkFoU=C3NU_`UB1yQfNp zO9+t3PCz*0j36gXvx$?6<{_(${7@o!U0U@fK_FRJAa!!u{rZGNFv8bdmU>OFV}YG8 z|4Z(q`SucRzN14DDJUKx9CL>BAIz()psh)XXZR9l*+|}D^zwpQE-S#jf4F~KDYR03 zB^e~bVo?yGwV2~8UgL}y(N(3O3hgh;WUuM;9s7XPzGdaLj{T@7xt*am!CWS1&g$B8 z)DRqO1Kn)Qv#h|#>b3N}Y`WL_qe~9WJ*Yz;t_|M1==Zy@K3i!trq>Ay3O_!e&m0px zEl!3_wmE5Vqkg_x%YOOI<%q*h`_B9K{mWW#8gFtQUoy3%9f{)|^0%{Q1}7E9K)DY; zCbMs&GAy+Mkd%Vx-}cYOeBZKb*p9<99Ek`b1?$b22gaK3M)`^PPmc)T*WPB1^JR<1 zRX%&|KgaxYFiv^>VisZ7`o8f`P?D92F1% z0Zf>)TUcz_JrTcej8n`zQlt({=*ESCfr%pr>l4${&M!A}!>tO~IB*C+aFDM;oINrW z5Jzs;a!`OpB@5D6FgI0DS65e1V7eJ}dwVMgzUYG4X#E%Ib{!hI1ldSY{ae5F(ZPw@ z5j?_DbaaYr9e-DYZ6cYx38P)#-cnI`g4C0o8w)n83r++f7O@Y#mASE3mY>E=fc%%YG}qS z&8~u9t^5vfNhtrM4vY=or;^#nOPpQ7fM#AqWscfl$8v6bT0S6*Zgc<_DOsw}yT#ux z2CV?Lqw|8_s#w*RgeoLjfO*cHvd<0!R^O9~mKzu#SPzT!rv!NzmDdUT z-dH%;?-|W!7z-&ym7Y=X)%z^SZQGbpccR>j>^Z#?nOb&x?0nB zF*0+6R9A-c=%*^C(6i|&X5s>~vs?CuY;M~NA zWe?yXxJblB7d`*FKGY`BdUMZ0)vEc5@!t$N4GQ+FLt~7MTuH_EYLZPG!9=K}g2d7N zq+Z8hTlXz!6`$YQ>Qw;MzR~sf6}DZmRnSPra0?9dK(`>J_S#( z02vi^Xa=UHrbfEp0zrdoPYqp}c}R2GXs!$o8+%{{_weWls}(#KWX15LXE%|k&}}?@ z)%mAOcAYO^wtt-eY9xfz*ZrTg2GnDW zPWb4#_||PuIY*b>+|jYRbpaoU9^Px7#)*#%=8YtG@(@VcMO>U7g70|KrEDzr26;tu z|2D3A9`y^oR61QbA zUSt!Po!`Jbzo;$>OAI`vW;7#lWC-iop^GCwS!$H)Xt$cH=!up{@XwZd(Wij7YU428%jr}SyT8;Jf z(1qoXlXpcDACX~Cb|bAodhc0gGMcs=%%+pQP%XRqdk-mpo-t2_5qv`n73|7t?QTnd zx$5!MSI<5Fz$jPv&(Dhp5*pBdi2(IgWG&}o;u?!uAGWg93yEL*$+qSmv1omu3~-<+Gn5j#&u9+Y|>g&_Fe@Ow#PI%F1qb@8B{0Gh0%?R86=k9 z$GZGL!1Q5k#*GT^A7iwdaHqVKPK$#C&_w}Yui2sA)BbJ9`_sP~#cfDRi7rtJJ8-^s zE#ef7+N;wsrUIxu;9h9%B?%6!fOJaoek#>_IRsB*liQhYumPB_(<9-w|5;lbzr`(# z4n~Lt30Taf$Xbq;$_beNkEX8-i-POg9YP6_R6wK~BnA)|TDnoXyF}Sy8kkN8~+OB+KeVT;F*5l45qwB6*g zereqTpuA3yZVrBag@p@GhO{fX^_uIg@$>YthUYQc)W!44-DWuV}tkre4Mbfpsnn* z8#nX4tYK(>h>#AZyL(_b;pfGgYWFc!eH33%F3e#QbD%Py*&%s^sOKpL2`#Svc*kZ~ zq!S>PrKQPl-W-uj7cI}ZIV(ZgZ;urhR;HC;Oz}#RHWrnz2cLSdjIhIBodcv1Q$+q+ zIQ;3Fu2GB@lx2U69YyX?saQxKsuziWF+T!;*xqj*dZS$d6u{flF3&$KyvW>{h1isE z*%uj*P~!&@^))$EMaauXmVUFB=Pg->i^NrPQUUOv1Z6csvI+yh?u{~2nY`<4rD!Ee zun*3ebUPTQD>n+$nJI@)=U+T#wT}ByP;5o zm4`En`=uMu*Q@aElb$2pJUFGLCgW;omsSUTxs7cTC74X%;wu+u=J%W#dh?DQqHc+C zch~Zg>c(_5or>hqq(me5Nn5A|jiUr!UV#@78KwK|h@o0~tqfS@_v6=5rc6u7M783#CDHWu)_=V`#U3yO(}=^^o6G^u<5 zoN9;&Ie_EOuF}%dR6&R(AfcEU7*f;<$V7R}Ej9q4;R^5sipX978#nc83 zc_uF5llF%{>+%|}$UWben`Ul`FyP{dvXn1JY#8oeA7-K3B(N8DJ4?&TK8!_piA-Do zcBu9IzTvp}4xDPqDE|#t6_sfO3|?CRRqi_~#%H4V0$%qlJNEu} z2ZSa623qc=b(Yn51xr6kLiyQF7Xcs-n6*<^UhH81jy2GB$-jE}T-eF!@^kId)l{ih zEM?EiHWCFq9u8b9-&((9N;a|uuRt4ga0D>1fq~DPbp8$5c(GAX1lJ|>XS|E6-9_w7tJj*=_zSNPo(u1+wQEa|qWCv_5F!;v_CKb=+eYtY z4u})#O|$^1jtK^3c9Ef012yi)^UM2#!-K~WSeBA;RqxcJjJMq$s18A? zEBuCrmZV(pg1MUL>jws6n9kqBtKTUoB^sQZ&9bGQ(D8A;#trK&5_3 zUD9=1aV;I^S?n}X`LZnLGRv0F=kpFklL0V7v<}FYs3Y{@^8n9J^~L2ki{99XaldlV zf}^S^gB9d@DPgi}*1Da0dPQ>GM+QsHy)x1p;%}EUr)kJF|GpqX^E-H-NERtKsi49B z8uff#JTr?K)5PQ|a_0c!fNQ8WQ>Yv6y?#S z_yJQ*(~M0G8(Y-J)T0yjD);!;A5#d`pc)?c%tzm57KI9_Np4io?Xv_)G4XI6y!`?c ztKKtG>^Uude$i7taU&?`cUTzY%g_1C81GO>1`+=22U1Lja8e($Vhji+Iw#|s+G^H- zW82l5RW$DJC#$B2s-K`1+gZIZBuv;<>|z^B7SYG>s^b1435A_5-502+X+XU24(vFa zQq|>i+EcQzVIDa@JUkS*n;X$_T?-gW=6r%DwJJ@9<{mCCFCX?)TR@@GXmY>A`N+%C z#;#A_zBV?shaGG*I4~<^ST}Y2{Z{OIfU!Eul!4=_ZgnIkB}+5kKn0>82xph(klN3Ykix{W+VsG14uL|Uqx19g3kx25lXR7H z_fOqdW#u`u_l>l(^VQCqh%vkbncRuIkD)#5ZfP5^v9q@QOLTPftLtlKb^9%x#B9ni z?t+PaTiqdRJ(!@vc)4!?2ueFmby<$=GZMJz`&d%HSK!LT5Qqa4JRzh(PsuihNs898 zqMhshyVU*p(AD^mlN+LBood| z`VPYmc(%T~S(8h@h%Jn_47Gp7LefiUeRcd(BZ+(Cr8O?1>$%~1?Z`E%O=l4c<>-Ea zGUY3+>Vuh*M<%C9xT=&vw+$sR=t zx6eD|k{zDgqo(0q5jhNNTu?(m8aP~d@>hz&d&lT{;2k4synYbt+x<|f zaL9aIQy(icq3S}>YVn4xSdJrR;;Oypl09vuu{umyVy0x~ zNnlf8aw#C6{E#sC?@u}|FE0)H7Ogm1?#~85=K};_nj~(2uyW31in+0a@2|c8xp;Uq zDA7LvR#<@S%76f@%rYB+sGA)e|Jy{DEUfFoiCSDI;E;l!58b-cMJ3LfZ`U)0Dvjbt*HnL zcX&T;dy7#~z@BrVDCJ!aW@AfALOr$qbb{I`9`z>&Ed6>o_7)g^A^qdM+z-Nm6Rbe| zQYRqS$OmE5VEj^xds5d4WAIT%r`B1UV7!F|nflv`KxyrwAn*uie)VK}#tM- z38qUJcx+E5zxCDFcnj-)El(%K=`o=ot(eyeig;gs@Wwb$r_>I%7-;m+9^?8NRb5KT zx6kO91d8|CWcYebB5KrPM3RX0#qDCK!a@K9mgTyt*1l-6p$1e+_t53%YWXq1D$V?% z@dfr`F+I*9QsWadHd4)A zif8dXDgXX15_roWb`kjr-074^u_V{cy>Nj^a=VW&&_=b+_B!^A=jW$fs6S6S;3u4^ zmXeNJysW-3uOh`6wfxm!BjxgY&V|1+CA_qKX?CrWJCTxzNL;g%+?TX$p;RuPDJ-L* ze6N7vinL1^T) zryw&f9Myjn=v!zQ1N-sbp;~j1Z7z?AWk9)DDFX4}>uz|4P7e>N4hVyrRVHj_K~#&0*RtDvRlJSPUA^Mo7n4v2Wd+5OTX|E3(<(4bFkpy06Y&=o41_Sp5UrjT3A5Q z?!bk-e)=b$a0(BPI{+~NAo$^8;-k%M8CjZQ7nFgA=PthGKBrCZFX%&Gp$EAf%-S6{ zU5mXW&Qwx;dPMM@XJlmD-rhd3=QMIDAV`~pkkAvz{IWuj{45-?`i`t;V_q2Mpl~D~ zg5r0yw+D2PZa_CWx%Z|htrMD(okJLo^XIqQ8Xl;_;5)9|o6OD4p9mPhr(`BC3R?HF z8#+vu|Dwd9(KW+nt%41-l?9PpwC;zcOEG+0Cn!?c-t8_qN?Uum|1M|zO#_7lRn;#i z32AA9H{~D^M^*^Th+vCek2aJ6?tN^{ufFj$gktU1 za$lj5{mMcdPwR-4jjIMe{zRGf3ap>ZwpGn_O<66ZD+#Hw?#&~3psRD{ZSL(sItY@h z+hERIaT2a)F-B*Nc)W^;{QGuB#mu^K5jx>MLZw{)+Bj*3|9z^}dG|zG7;?)J|H;pl zzQnG7?V(n%^Px4x^6L55q6Id~&|q{vYWJ6y#cwAx>mQgKx$wmu{{HcK2xr_8*a{Hw z%Dvarm5%TFEMX#%PI6~`l!tW4(^Azn(QHcV+SsM3Zoh1Ro~f2Pm=SHqXw@qd``E+D z8a$VzkV`4$_18w-V?XuysHRgfu(m<1RDkt`UBbfKId5JaQ@rA&`{iOW;r78viDZk* zoSP8S$7zy}O5)PK9rUiwV9!}m ztFYDL*=r7W{H`V0i1DMzFvB6?aO}m2ncv&vv->HrH5g8tr~a0Anf~m$!J{;J6N9pb z+;Q6YJxcBt^7Pps9}@%mdp72#3k4{?=Vq)bhxOubFu_BB0OK#1PCCx-lh`f2PW(tj z*fCE(OjMaotvYh6$L0JQ>w9KOx{hM7%Pl1qCZ}Duloib*FN};OxC)of!6raJLx$Y` zR3kvy(8^H&QjjlC{IeKay+%oT`YK@P>w&t6#QXjzC_#Fb#*zGT~CE ztxyCXVVd*qa#03y@A#TQ|M&Q|#`;af&+;DbjXEu0dthSS;@4cs0EMmVXD`lx)|%I9 zskTM`vfykorY;yGA_z2W#Z4oJSBCA zxmDM%8~)IaJKq$6*1ATlP``3m0+uC=m?x-QtA)i)Ogbnpv!w0tn@8qZO`(FtJA(#N znGhvk@AJT_r69uN{f`C$yRRHs z7bX4gQmFkwR4cm``)N2aRc39mAt{JS|1OmByb{+_k{mECaxSm&jJxX=8{47o^OqE^ zPJ25e$5rhwyKLuu@2Hd6UsiY~yjG$Q*{G}k8ht4&TM3&wi)k;Wdh1kyUjr8#8w&tk z0f0y}G&Hyz&Kp;2TpukpfZGsf46xdNwav{s#VQl;mu6>?A%?QZu4y(F7TlhHp%5sV zqN-}G-G-Pi=_^!_ia*fXi>XKq_S<>#|CHn0`}vN_4j##V@Ej!Fr_+81mb|cjB1FMf zS2ze-Kbtr>`56EH_6PuZIGCUQ0a?&@3!+R0?fMH4Kk7HL{{VWg2x7k5acSmfW7^4CDb37-Y2XPp2vpJ3d;WYAL_l8D);78TN;emlCxWoBy ze)IZH00?VKN=kfveNjH6W3*H0)-fK;SMP(ngYn#ti;K&o^5*a9MqOQ<;ag3HIN>1l zx+QBtOi%t5poCP=)O-O_jl7D;Df3s#zk68Xjzu$|e4 zP+wX^$0Pa7yd{%IkN4xAm-uTJROLhepo9J%W8{Uv!{_ZA{ujTB zN44q=(8sf8zhRob;tOnR(f+9-?^t44#5uKRtZ+Z1z2!>aZ9m#vu0rz9yAxEG7awF? zP|^I3my_&{kmi3Y2$-Rh*j&l13?7F0zv0hS<~Lv|YZSRG-Tst_yJ5I4&kJSHomth< z%ul^6A0{H>XAJl6Zt;-r)_Mp7&6&+?4B?22hN0sTs5&6F<<(nunbE{A2NBOn)a9G4leSci8eJGGo?0@reULD~FUS5U!3(0hi zyQ*IGMD!U&*z$@-+F1~(ag5tmR2rD4&8-&^D;70n;6u`R-IN|itvVzL&4hZVk##S8 z{1H`sK29Qh#hKd8$uG#(k1*~vR{&1DJJxArMmz z&JbW@05nXeGt%7L48Sde@g<=3fCG2h^P~+4K+YXdtKIRO>lJTreSLj^9eZx`jG@!~ zh>N@0$%?3{sR7dWCQvj$kK{u$5it;?nb0)O%#;4OLwT7uOD$6+$|7Z%Cd0h$O6Gu>V$N44v^= zBY!&#ujkTb+fLi3Ol#zjMfK3_lz-Utn6O0~M$}v|{^m~)+3<@lt`LVY?r%l3Gp?SI z7+2kL)qn5HHtze0=H2f-3EL7^npskFx6b0czJwiRJ=7#D3)CcTlQln>YxS2QGF~39 zBp_6VP!cs6e^HQOCKUAH6DLZZ87|e;`zNteyMVOrCJdKOD*f2B@Lgih=L0E|Hj(_2JA-tHY`j?>z~c@%Q9|Y$DKg)17YTDF5WsLz_B;jMwzs* zVPkb5C-Er{{~~ON?=5q2g@T=^JO}6X-}{UX?%Nkh}1#T3!waC@x^j-8pD60}o>4&3#*Kai z$ce1HY2v3wgNVuc+JAQthT^~K;h*lwMBwW~@C1qKCyWdUY;0C^j8yx5G_U9S1OaB^a6Zod1Z zpa+r~!vmE#oLAVq%<|ZJH>4dr_gKI}dNd~({Uf6di6Sv!r29tO#(UXuBX=BjOO)mQjZ~ zeo7j?{X%96SHma#51ZJR@s}*bqjF?*9hpJ7Ck}(0!S-_n{`JvE2^DXHl8I{kC!$6) zt(Vqd&6?vcqkI`|Qb^nti@i)4L?xi_D;X#`$g8ez3^_WW3Br{jvembKFG~`RFZ(!F z8vBW!%Vww2eX1Vw3e@j19Wd+LdJS&{6K6mlf%*SVcUUqaA&ZaKvN*A(4<%SB%w zd4(T@+$1lR_+?i`Q($KlQB!UVc?(LcDp%b z(@O4Crk^t;GE$@H=oUmPa_Edt1w-~7qlO1rqAq!ax>*=tLd+z}raxrOS+Jfizx zzTK9H{#748DK~GPo0T={=TC3olLRbWn6Y|*P`ULIH-wg!_V;$0$JNmikL*asr=63v zj!Y~e1qB6J*_YuP%F4=OS@MpSPx4p%KrZ_~y|Jn~bVuYQHe?InF+SdY?g`9ra>I@V zxM|y>=Fd2mnLdz3nwUAVhNO+E-3#I$Q%J7WLWi!bpkE{mY}377~bA68P*N z?(c_(oE8V4oeePmyQ*y=A|@Ul8S%at6St|`j6-?&geZpPzgM`+E&CyfTSqT!^X40+HzZPj_Xbu%T@8(yMn0=N>=`E|*aww(QNGkVc=~3-=i!SE z4&C1W%4tk0wUG{7h9bKSaNoQ1;38?Y02|N)z4Ro@Ci>c6tj#gS<#hJa znGHnmQk49h&omhD5l_F%8&rasUgYZUKjck`-@3u6$st!X^7L{c5OQvbQ7H>k71A0E zqKWzASuOXLB|q~)MuPmv&pX4Rdln|IP%bXG$`x*mxHcHgAt-6q##-)#)J%y3_s!kKcWv~Q5MM1>(zHrpd?0Tiya81Voe+&S+-y5 zW^=~k9VypO`)QW6cltL--0Im)x866q`o_e>K!1@iv0~f0b<{FMAKQd3+wYXYJ1CWr z$dK$`*ylK`!jUJ<%Z7H&R8Phk07n%}?Ik580n=}j&c~?ik?jq)H2nm?CDv9|J(=8S zKBgi1jE|2qYSutL7#OVkVetP2Mn1WzVp3#aJ9u&k-k~+ycr!5yJ;gg4q~AUjv@|tj7-cYU8!+`?7fq@P9;iu@Q3Fiws^$ z$jZLXL76CX0!}5(TDb`yef-d_3j0kd;6>KferQ;ED9OwOF=XWm5kQU3d%Kh6+`z}h zbpw#*CnY-UK@jc(1qG|)h0tuf{*T1m{Rjp!u_UPYN-|P*ZBZ~w#>V9{kPFZ-p= zB|@xhj%ydRkq%4#7-{PZnuO?|U2_UB3zKKar5zEn%njm-D;wLXnDp0u7k|~ZbBQ+_ z(&~kw!RmNQnnxDe{S3~R0nPRA%-gT6q_P2y7~n%wOFb%2O}99C0ejp3q_Cy&SeI@&4D7SgGN zs*p$h5+&;3qK<`Ga1aNyLKX0vgwAFX=`##7#IUub=DA&G=C@e1XS|CX7)c#0u`&cy zTqM)z1}TW51{44CyVYAFD*mZ`FJuhgDR6Q)sQ9FkuGAmAi}M)~Zr&Zi!LpTt)e1%6 zytWxustl@2>P%Pc$Tx61@DLp+Trj=M-0^5b0b=%aUC2>`4e1EzL? zp(i>my410w@9B_*Nbz$)ASOy+Fhp(@(Y%re1P@3^`Ql_N(f{>?3y=v}Q=@&=Z7U=c z3Dr5W-E)lBpkij~hxb`bsai~V4;lUSns?-#az(RObk7DebFy^~PtU1%IEPKM!R9R9 zokvhb1zT(tA*4jNg6{FU%$+N74^9vnLA(JE=~tDc5m>zg@wf)B1SN+exKx}R zi?F9BZD9_uqkI4)Ub9W0?0akdJEN=&THkkk-EzBEh=70q0t?j34MZ=-WhdT3z7KV^ zLV+95Mu=emxSr}iFK~o*DQIgy0eCC69WN(b@To*)8P!mAOicDZP=43sv2$2>8ae8;;Cf&9v?)~96}>>n92JKnLeJg!ws!3|}jq5_g&Hm=?8sn7pS%?Me` z)wlfsZ&%Ogk4v*Jl?rsyqa)pGiD4q31%rH0F)2`TU-q;%Md|>ZPuKInusvcBh1iGT zx_SwsSPOQWm%#xw;7)3|7x1p(krdZ$)~F^-=KB9yfR;>8^l?mAot z4O0s!ro}P5sqxRVF>zwm5B%xHeghz?XMVY5pIqzLS58fihg9*A4Tg`DnewMo%}y!z z%!J`nqa;8&Ct&Z-6*|NQ!;?!>JRD+%EO86~vH};*?q>0BSQvM(PsL`CV?b(4z9W0) zlgXXqNZ_d&yU6J?m^9(XqRHL~GwC*}Hxt1f7vnc3xV-C~>33xP{}5g{~#}3{%bz>dlSQY17vBEfPM0Dch!%N+J-u4Pey0m1|Rr6gecaxYH zBK|TMNj?az`;s2GAGzeF5$7wEuf=Je#W8i21y4AmNAF(#yU|U1>q1d=TW|S})4J1^ zu){7Y3b8{lVqsy%wPIIq>4Tjs$_Hy0b5M_*KCQqo{MyoQj+VT}Oajfg);Fu?xg4BmTV^9nPj1w zDb7Kr<~NiU&%-x(8UhLAYF6COb9YNWTWacVp0%TFo=i^qUoSrxZ5Bwyp_t-N*l4=5 zL;NWQ(|dUTaJcY1mrLf!-K_*_&GhtEi)t})tjf6qM{da|$A+aRhkUCYp=8v}%?&v9 zH=zA$GU{Ux78%AR0n3z+zZ`pjSq7NLfnBvqqu6E1NmWB5iB{?_AXvPgv~pbbh!B-h zoi9sHGhs{DU<~ovN;LgrU)QlVTV)=t_SgbaG=6#<)h#bC0~w{|`=q<$7H^@)uGQ7m zpN|)LoGYHu`U#7Ri%($nm@MF7lX^Dt0Zdj@G`W9iSX$Pz!R2-THx&3phIx*^)rZ-5 z-z|(4gHhki$_iXc-8y??F|p^O@`e#RwlF!6*)pK}s37yuJ2LX5ZtLN2eFOlT=b2(hRs=4Biu;E(0>js9f{-fvKq}b`>%fxM~eX0z-&TjK;S& zw&6(f$i{<1#KDMe+n7hh?oBLfH6Xm>(7BeD8UhIuql^4xdd-0wMHv_K=g+orRrPhP z(?zn3b97%?T%3~954vb+kVIE8rv)K>-b4FmT>0HV#5CviWpem*tyN=HNUq_9H^*g< zMw3p9TwX~DecEpGHqmoFI-NRaHr{uXTlHE&+T}J2ZPteM1+su95h0S{|A}fkctWiYXoJHc%5`z zwWuTA_7E^8c+`J9elX}Da@kT=5!LNt8SO=e>{!5-<-L`xA~tB^i*yvrPg%phLp{{| zusQEsArL|QogE7vd*q(eq<19=7lh;t3lp^N7D0a@+D^O%na z%a!>3x#r#D=6+OmHd+?hD>SK`s=vsG_U_^`SCcVd@86dPYH!k*lRk`>S@afd7RTGD)(2bS6HP^1=od{nd^X< z2jMHDryD(YcXy1qp)>o3dwZw>LI5Nlh-1_QavtM&Z4NV6K0OfdM?a8-U`}`TUttcH-gT0i;O89Nhp0b5mQ&|> zb7uAvsE>dqFhzvCZ(v|xXo#I4Oj1%ZQz)~p?q)Jy(Yp36#F2Z+FoLhf{c>+7{E2V^ zZshj0vN1CTF!|Ag)UsHGe5HfRoSdA>%85;Tu-ZNU{>Y_8Q(gVd5+^>|(-kF-K!Svm z2s8tr?@b>ObyE#`&<2gbP4JEoS^PjleLcWEp1#a)K@aV=`W2~DkZ};6Q+~ho+y}0Q zCkUv5)pkm~ClWme>g|T_2uBcnQ35oE1}| zR()e8l=1SrfCX5x`BT8Cwjq3yQ&lzYn|JXkCVFM+lAo|JZb~Z?GYF|&l)0As zy#g(-fwi3*`A7>(LL&XcQSqD8m^SK7J;E^zYy#aV&g<}X!+ctmu~);LsA)C_C$gm& zPh+7TrI~p&V>kD4)1_Qu%m;#Jh!86+E?qI@{X(ZwZ=wR|tKQ4RIMh3WfrP*pCcCCr_N!j% z!bCBvjRvhNzdNs8h8cx)fk{l?J5^y#qztOVc} z_zvVeKp^m>-}d+S2l{C}0I}nQcfDxui<}OORMElb%$HivRw<~j|BH=E(v+c0AB)qD z*Zq_2u@mQGc3vI`%knAQFPK?3({TSLh`N59P{sO6{iIFf?`1Nk2=6y=Nj z^zp+tUWw*US!9hR0Q?Dj%q#3#zZbAMn6fWBp9B2nQfK~?!IIehjbo-NQrJyAUu`CSk zyBlMnrPm0Z8$USKDnKyVeyxLf)K_03J(=5(bD?^LLl1SSelA^Q_zMfRUB(AYHK%;{ zH11M5#g?0LH}?qKTIO~!e^Kl&z8eW-UpXj82ST>B>nVdfZX)nVFWnyA1ee@4N6H8LQ z3KRsnSyJ!m+7`|yr*^`BvA%?=ZSqObH}(-!nCBeP4WPp*szos z_rtTNg3&k--fjY8+H+$_v4LQSXiT+RXu=VYR-&R^;v`=vW2Mf|sB>))XIImXvOL_w z?e8g%{Z(?8f7C`reP13e(QSDIsWQxTbos@_VKu?F@HbP~m?4=*;1pYy)NMVrm*C2B z0&Ktg-4h8M&T}-|=vKKC1C0Y*8n7W*yiy6Xn}-0y-Z9{IpU7BX2K2Z($S*8BcW+v= zRYS|5efMqwsG@*?FETNaD`Ujw%f2S4-Qp3%pTQh#VPW5}gx2xRKJ4P+;^kWoEoZP= zb7~5;t25TkWzkMtP_V5;y8+lQrY0r~t2O-ENJq{oCHEZbK{kLiQ(ZRT)x%!C6bs`K`OmCgyjm_x9eWEA+rn7YmSpBartuuHZz20f(@R1W@_L6SK>mO3S zVMsn}EPY{-R#8>(JOXylqyjvIJ7TJV!35H)qmeOcCUs(X5;uhuQ4rGV_}p(; z545wZT-4tcFZ{hkiV=DO-I#oF5LbVCGAoG@vnxPibr<$DiF}GL=I1h5XkBNya z&xYj{7i-ezG}H%GuqrAjP^*`c#*TJ>H=-WoCL#`wAttNX)W2@H{==y|5O zRLYfeV*+~l`Ap7ro@-@7N*oD+L-^ru6{4E89VU)Sgfk?5zpwisCVMu^oP;AIG5zgC zt1@T*!^)|g$3LZ>P1kS|3cp`PMWBq=(oixZsuPo^N2S!2sjI6$g)3orogm~*1nVcr zP)}G?Q*zyC+c`L}_1Hnm^g9B}!;$4tUpzgI8_(q$mWa`wtH-@|0yMTWeIY`kjPnrt zQ(O{AhB7Lh0g$`;q)}BF8~4-tzAelS7CA&PNTbyh%8I? z@yXWp`M-b9ZlA}-$45*lyifX_SxMc!MC`3}L>fOp;<^gA#^8rT*z*)q^Yh{MLWFt1 zjm~=j8x4{ULGGsv9~K+5B(_3pv1V@iJhwx`wwDE^04pef*`n*Gc~aB>Wue8u$gnS# zJiXDBG8K;iHzr!(K00S^E@d`Qt5HT%A_l!t8JwAQHJ=K=*JFu;QA4rt5EMly0dCP* zcQ#F9l89KE)K_4cOmX#!DzL3xsd^%c3jaBaO%mW^jh{s?z_bDHB@yEAO5X4$0U4g~ z^9A_o%@L6-$*h;rj$!=Sa?5E@9+}MYmLl;lORj`rKaocL{XZ*vq-aK7tFVXHc-s!9 zykaoaH|3D#7w2IeLysf6?i-WbK(%x;{<{7~fDRmUm`zF{U;Jj4%f&vE^vw7h?vp?m zrOQ+62ZW@0y`3^4en_3ZmUf2)lXSS@IQZFSv<(88KUNh`H{6enPJX2wHaWg+1 z1p-a)y(a~-kp5S@r2V+mSX78MpRi5@XcgjKnY!^lX7y;WYvd55d$&d<{L0yt3@MEs zpRw6HAk>go1XxS4!Z&{k{2p<&R55~J+lMcHiRy2X&n)tG^)L6PK#-EOz5SV*!!v9e zUb0f1lKfcJs(E)U(7W)scRb=+juZ@r?7TCL_b+b#_O5l4N>ap5=2fheQ_ZvXxfGb4 zFQsIT!cBGQ7sguy|LxvNL?#pzmTAe9CcHp>6cm(+p#45zDC>J%I-O6vv630#ih@PIHAzTf;iF=EqQ{w9ac#Ti}l`b zpUrw%-y6aCeEx`D{i zUWwI4@`tzi+X9~5Z;Fn%A9KSnzR2CC#k}=@%Ovu>!Rslmg+2&decAmRlA}zEs9sHh z6%Dhy3m51?x#Rzlw|X2UlP%W)PGSv+LW|`lBjqL-fr5d8^;Ht;>X~w*-FM&oe}Cv3 zN$Gk05Aq|GiDw?x=Xa=9{~S*mbFgt8!yZ5yil3XOiMhaxDiJ5f1mVCqIa}>$%)anqm+dFr;R79W2#m31-Pbu;~T6${% z``>qeP#kn^q~uD(#D2FFbcHicxV`z*`3CPs`OWOUJ(mnMOCLEOCmzH#4d*o);Ru}G zX_0*oROY>x8K1^+IS(Y=)-8vFF5mXXK2hP##f{vTI-AStnRUdk8=Z4)h^9EfwoLIO z8>e}BG#Ka_3W_)^Xq5{~xP{Vr$^pLmqn&9WOrwa<5&(iKbejDD@?j zF0Zfha`V<HDGgXJ_S$ZMfQeuU~fF$EPUUpJu$t#eb${ zrto@=zh0FgjtfQ}q5vdNY9@8ggo!UIqy&-|9g!9|vTbQ*mTvC8RPO|$@5W4snyTdbT-xP(OFwjL-BjyR|aDO3SEtJ`V96EJipS}Y%l{r4GKnbl7s3YIa3N` zs2=Le1RxrqQDU8>s>2fcaa@l@rCDVU%*M$kotu99P-|dnrIyFc^tww z%_CB5{RHF=c!=o4dUP%XncN_Dwjwx8&BmFu%|zPL(O znU3jx@4`-L?n(_^6HJNeML8S1xb{ax0-o#JAhybJw=~Y=qP{?pEb7gU8s?EB&t5~f zhSQ06FQ$#m6wC~&gy9egJK*$MyP#Nbkanz$8R8oEIi;7zpA^@Vd2n?gAHThIE_e1e z(ti9knN|7pP|R0a_PRTqRHZUy`6_gT+6cYx!WMQH%p}t;Rve9%VM0>RUD-4%N3Yco zzfIwQm{p*~zh#ZfC777hC{`j%WDxYjL-c5!G3Vq=4qC9HShn54{&M^2<4@JY!M?sV zMB*OkI)hE{4y`Z4F^YW}rs=hKXSs`-5E_l7ydusrtw6^$4}M^n$n}?oXU!_`Js+z) zcpupd2L!(XlLZYOT1VH{Q1=&Kw-LYgK;e_yYjiO62=oIQ8`4ZtR#D5n*V+O&`L>@^0C@46J#poU_YGCW}JOCA-VpcF7e{Wt{=g57D zSnM|omf+Rk&&`Iu$#!}=LY;H?irL+-cG>r%uL$itJzI&r+XA-(1X}nmT2t*FYQs#w z+IUUhm;51?7RPydV8qf8@2P`BWmbWlEguS@_%=K|liTSLX={$-zM}fcNhT&;0wuRBuA>@3NsJD6n zQEQ4M!`t944XpZ)1|ogT$Aln4d^0KS0}}pXp8W2TMNO5n$0SQYChTyEo3T1IBOMlw#NcmUD_RFb)y1 z(iKmc8?mk*+#^Ra^|V$7=|()(GgPZF&lp)wNWZ*6u^;Ep%{?;xD`)weExgYlG9@LY z1%#VQ<=9UZD39Saku7gvNZT2N@tzJ{O^{S^bn=;kDO zMTd|gV^Jdx?u0uB1yQ1e-G29T)bwcSJ5Xz}PW)?0+lh%tj9zJ9=a_`iO5nrXWaj-2t4T4^W>GW>fE7laRjf+phP|3=H$>A%?4HCDphZH|#4e~j|dn&`MB zY2u|3zW(T1myv5eSro@x^9Tcn^;;K0cw2Yut+b_M0|t-tQFT|H>Wb}-T6A845>aJN z7na9Y8;kY!IWkI`PPrsx8NN#Q$d{&TbtYd7RwT-rT!szcffsVXaF{uQiw=9B?}u`H zL45qL?FKde+S!!Bf3;2CaOfAw;vu-JwAuahN1>K_G&U%7hyEea8#EANm#`RkI7 zj;S!#IH7s^>OM!>E(H@=!7;nl79QdIHWw4?CK`31K1>ku!C@&Q9h_ac%A29Qw6xKp z{1WR9M$YK>VQc=-;x=L0SNsYq_PbOA;z52JmNQD2h+Yp)`<~66}{zDG2f7APMAd)VG(485DJW?CC6t>(2L(aNc|#_#yct#c9h5t%VruwK7r6hl?Bs0 zna|NRj)9HA_Qn34ew9h81chAsYRl`6?MAU)0b29RET4Y-B#V~R(73a&Q0&m>C;-bk zM)*rt>@O`sLQXx)=~H$6m2DNsrL~)f9SsC}{B2DIN(VffutKo)-TFJ@WQVl9bUzg; zE5~dv99jo;yoAinnVVEn;G?nEUNF%01^@fa(Xeo28%>EN+nMk|LqoxIyLGhe(l?ri z@Qse+G3!$!ic1Czea-a12K(=jq{Hs$Y^!IhU%_dxz@GP=?q)@R=61o4uE&v`pBf~# zkuSF!Pf|5my-tN9I*2Iz40Fq{GMYF?m*2WN<nf9~nuQd6ZVMoIsBBa7}H z=o|F0PL)YC5*M`6>qc?*NZfQ(8@fkhQzb|c=QO_3{~cm#s?IZ10_I;O`TxvlAdZtH z&WS@BeuD8)sE{>1TPs5}gz8sFK35b$LS6!p)&IxTSw}_Lh5dR6>5`BTkQh3pyK4Yx z>F#dn&X(k-GHc zXZHsCIM#$j)ldPk?8(wN>dSg=e{>NJWnRq)i!iDw4LdU{tLwd4$dupBN!zC%Gx+GR zr1NvAD>;&56$BDr%86yuyI$TVbV{Vi<-DaGVfC!w*v@|6#bK0T%o-&GMj&{D3kkT@`FJCT4w=_C~;Qby6Z$z^PHYdG)RFp9cm)2!^y#aK?vzAW% zOBrrhx}x(KCvfnlr6IGEH!eA%$HcsJ*V)|X{*GU!!sn+g3logKQ@v`JXCJOnQKv%; z`9;i`{YgJTh+6%6lcj=2Dj+j`suq?#s`{| zwEt;O0yj}nFOJXPG1O`V{|y$K)V;q8`8kLYQT{&#yn-A6X|UF9{m{MBZex%5N*vr? zwHF$!J}kp?pskH^I-2DLO{A3O>v|+97;n}guOE4&%#4}!43m_KID^+B4ot&Gk8&)& zPUR6Ki4I5w8L%_2{{3l~lSIP?_A>p$V_P^RIEb}+T~a#j1sl&02WjF|dZWQ>bdyZg zEe=bYZqYT1cU{AhS&nmjKtK%5LQ(xsbINC8#;Pq%tHRE*wE7@?C#di|?CHFZ{a$ zX%PLcdX7Xf0fj+9GRud%PnHH5h7ZL?#0??R*7*Ze?-^!f*T?=(k>bW@O$YB#q$8{X z*>zkrHQfQ9O8vQth7HGO!C73i2Pdb_@o`9UTFPlcp_ro5BpUtIkx#Yr&V(z~RKSg^ zv#($j0ZCM0pteoh*3DV{GN=X7DCPrUIu198*V8k%%s0wN`em~TWmj*Slq!y)lvu+; ziMfBZbZSU!xO$@gKBt_VDMtwTad3Vgkb+idrd&P#@k1mAXtwSk9~~;Ql#9*Sd3G># zk~62|-#U!VTy8crTzatEz(6m}`pW?~x;sY{eTW-sCOrN#voaNfs7=)=P@CSz%Y{3# z??j1!tKJGI(b4RTgNkIN*kBXY2QHkx4A;J1ks=VP7>nPI8hwJgfa%epEEy6+{Azvu zQjY2rCWAYgNrZ!?PeMeqxU-7&@piet(kGdrbjWkqd>~eo^G?oNaAJspEVms3 z?x}cr=@20J7yA*l7ZP@MFmNaid?*(+q2%Bg9UWH5J>xWSJCr#X`Y)lp64W$;28)&T zx}_D$B#y=RB^D4!qyAf8yVXWfHVs95UqZWoL;61fJ@pzh-StnZzv0P2U{|bp)HC?n zsP(fKT3r(FoAe`aFLW!##1Ir@vO4-i;=Fe?c@PTru%JD*vu@O|N#@2~NHce9?DioX-&=V#4hy*695Mz7l383)0ud#$5N-sXgHQiebc2I-eR0u~OCi7H9 zc}?eD25#XK5^)Sqz?I!nk@WDwf?auuT}Q z7CQR9SH}?vC8eVSg{|{M^+y`l!?7QsQ~_6+pz3tVr0CxFk0Bj-qlm})87Yak|MR_yAI>W|dWJNRc`cp62q{Rifw6W=z^yI| zn$n+`$Ogg=lbm2i!`py`HXh{2sScyS+O*U(e3krt8<_ z@i{5)()I1PKNNx0+Vfj~qjNCeG=XB>Upc2&)}^58J&@rR(7gE3TGZ(~L_&x(^*KVw z-F=kA3k*!Teryuj67?UWr0kNAsr4#s_Zq0Dqh7TRz4wzeBQ*;Qhy$X zkEwFTiT{#FbaT%vaL?BwmL1UYcYzDlK^gk zMl~2fiiu0&z2i--j@-9r(J=J$5pdnK9bHRy+52t(DI?z#3b{dASAZ4`C0!i}zkZ~v zp0jPp@w<-_WXFaOZAEf-W_l=g8B@luyuXwo0$=HNbzfFH{zy<|end!0!jyg1U{+OS ztu2fkVam?1Y7swWIq$ZSE%nMZ|IY+bgcY#Iww!p{{LR)uv6307m!=!IVDEiPU5Wyp8Yx0|E`Za1UJV8zCX7;7D(@F#Wih#eNC09QQf6I>IwS@cA z>B&gHeQ9KD?8xQ7#THIK(PvLyoc&Dju_ApjN@!R_jo(V7Dk#ks^?fXSjTV0>q%mk3Apxh(z<+R~o~@mk z$)d)CT-?FC6v!a^qi-PZEj|Z(y?q2q7H+vTf(P`kHMA~wQ}UL2Vki4btB;SCtc$Y& zT-+$srThkv1isgkhyF>b6$tMeor{Lo(=62pRlF$dyoBN$_7TIwMF!uIi)yIzIQs3fgcz zG=@eBjli^#_uCwJt(Kz|*Gk-hw z%^@Tt7cYof-F0~w!a~t93!+}pqkOfWw+Tw8Q?KJ;9BWn~S$NSi&7`T`K(o!sA@faH z*+jA;9BZd(Hs{_j9i}eu{IY2v+>VK%@);tdCALyL4l#GtEuMl=?0D*P6!kB=3ON$A zub=i(*x5d1dt#p-mO=28$Fj6lr4vLcW8d(eb(HZai=^BY@`G4PDLg8F_koki*UxvC z**St6N|@{BqJRi-F~solW_taCSjd3UmS^mZLx!iiA(}j)v{Bo|)^UB%o&xD7;!m`**buxbHp;B?9 zeL-0<_<|!{JGzRTkC?L4s=n)+XXRCW9YXUwvtVD}d0+d1$P8nA_uUs^oxB{3m8S=( zEt6lAV&BP!t=Mn2sAA8QjuRcl32!z#Z_92|O(v@iu{Q(a0`!tCuaLsaYC9PJZaL8k z<36kXMxdm<>G<-E;jOCommZQWcPamMm)>`8|Gxnbab4=1@)KF`_gcHHh;ZecpXpe; z@2)@4YluRtq(5P1=BH$hB*jPSQA<9TpM`MNN~k^uZPt>CrRb%$6aguX41IgNmX*@n zsQjI1RFevNo)($TekcSazBDCoc%%9hiO)^_clZ7T9vf_HY~tv>?Ezz62e%$e+N^;7 za|#`w$c?uW|LUsSh3jBS@2M+^#5`Gob%k(kak1%Y0K6D41RCoX_pUcQ78mn$+n5KqI7nFI;82X>c~jGOeh|}lZFASl zw1vNxyfQNwab?63Y@;ljUful8v9=B-WNwrU_=sgwb~q)e!W!FFngb6l5GL^;u9Z*-70(<+$Kb}X zkZ_CFcrp6qc}EZC@3r@}^~I)t&trV5-uI+rSBM20pZanok6H|EcneuuRcRicHR83RiinjMEea z!-`o>o_@}Yo{;8x8V2bwjZ{N>_%-fY^_Tc4Ji;8;U|p$7v=gQt8CZ<}zAWGDfjW8`qoUKFPVh^F10tbX8(q!>VPyAe!2090kT)@m8=CuL?)c~2=5;giOX>aW46=xv^icM3z0ht3d^TX){K7R zkUH7JCH%?u{W^Fl|J`TkaQCCqQ>M5&7ej72cqX~zl?{$g024Vu^wrT5kI4P2g3QNK z5z^)6*)L|At>J<~M{%x3>C}0I{z!YIdG_G%xD$PYm!uq_E`_T)9Uz4qi*UNQRi@CS zgnrF#x%N)8dTDcf+AjS@GI#h2TK(i z4E`BvuKcn4DSW51R%DJMAgD`}B(}iu$WT}3ImY1Q)m3Qwv3_saZFsawt-hW-ehUC| z>|my6Y;Wx>^segy+sRw26sq|7eA1|(ofYZk)#Z>=tP2jo#Ae}g=C>wXmmaHTZ)WFt zoap+X`8df^VFNOi1G-hOt&P;adFFgMNjsII7*^2wyf>7q`0^tDsW>b^BG1a%=B6Ac<#imOCU7V6E>1~`mIG1h2mDz%&m7QkP}@ry)hj8PUxx?()FV zyM_`C@zW>%+E4uVVS6j`(()>@?&?d1Wc66xK3&J7g^Wz@COpT=TNv;-y!Er;t)J6& z9ClIr%E`(w@u2cS;=KM!B(%^KWgS9?j4}Q(j+bl$M`HMSm6w{(f;&~gr6_g}T&a_! zSL|A1W7wl?!Z=n>oc_@o_lc1@Z0fXZT3T8)ugV`*ZfCE`-)x;@?znt+3VMpjjAyMY z0u@jxX+D08ki|JGtoD(#Fj({%S}Fh!e| z1@Z_DqBUdm5)C>2l%^6vSirEnfOLSz1Z$c|u*3m{YQ3-gg8tWRUG zcNmdT7h3%O#n!C@4#GSZS295$P|VU~sy<|DcZC;Ig4nU~$?<6DvouA| z(eo9Qi8MIL*JWV^JLZ|&Y@AbV;yj&XN`?HB<%`BBkWjs3;!Isv0lH{77ewS27B7yj zX9`xTE~}n_W)xn%UW0=$dntHrdb?1xfVnTdr1%ht`t;|g5Mu1DdW8Z2giirDw<5Lp zooDSUhDLAm3T<>`a37FpWuHwL&X>&9CyY7(p*e13v3#!nL;;0v$A=N;LZZm2Mg@A% zqfaM+Rz%2<)&`;xyqO{`8WR_KSiASn)ZzToTj}96wU4~G3?bpes#!XMB%!kst?_9o z{b9%*jF`n^O7&DD9gOG2tO`4n|8a2)cL;bTet+GvJn-|PgrQA@Al;_;E_`p*R4DLm zR8BR(6B+7NdF0+xPHsE&a|xu6t1)EbHyx6X7f-Z()m)-B1Pc?9dGplu%6`YOwhh(T zD-lvVAp+8?$$&wfjP<97qH70GU0rXKsw4A*-!6!qeN1CP9}Dekx(3E+*x$a|c5CU= z5~~-~KRf`9c6=(f6G*Z^1bKP9v#bhT%6~a7PA(uQrg093d!+zO%lnna8iu()4VN2!q8~m6 zeo;#4QomewDK`@>ER732Q`T3Mwy;|C%pdMu zyw$9=xP&HGWwLKY41?Hm7S_XPXb~TU!um`_Z0@%cN=?MM%xBE9L+kCbWx=B7f1_2!+)L6T7;-B_Hv zs_B`ZHV+}XcfL%3MtRdbyvl%h5%?VAj~0E=AkLjut^JN!o{|s&_nV8J_x$H9l6XQC z)pPaEnNDF#-K;RUD-%jpJrrY)HFb$TlFAiUhiPHSwcqA1a$Xh32`kgOqUh4Ih$sC1rzm zlq){W*=bxdz1ewpR{$1JQKQKuUDiFXB{W196i7v&z}WcDt4XSU>*XJlND#aW%!;+% zCcOa`j3Ql;t;ftkSmwP3DS7b<6eZYnj-T65NMq9fd-hh5SU+rgw+rjtuQTn}HlB#s4t&5*+ z(Pej&TOFXBoPs_SAdr!QV`CveQatyww;zxPlGyc7!4{-iANAk526NN*utyr@QaICk zBbh-DsW+tRPxYw4RVc0hAv+uw-2Lyl;kDpZ_x{+lQa3+%QlT!lKlq}isi$#`f5-v^C_^ul@H@8*YY8+aho5!%HYe$!PD>~TYxC!ca1x)Zl z52EZwDIS01EV<&ixvC(|iNW3XnINvDl{hXnR!SM)=2Qm!VD(&V2`m)xdeV899;c3Q z8;Wox$Au;w3>?v|Sxj1W-gIeMD;k~{CPbtV4mc%R={E5$h1{Kj&W()fMfo%BcnNi) z_=r|yhPLteUIiox{WOG-z7IXhq!TL%gPOk=QetE#K7}TclkI= zzWpa=f)6pYj_UjHj`IlJ4Tsi9#}Ps@D-<6w%kk=>5vR}D>GhO$r2?4ss?gaNG8==|A5lW1hu5 zM>~)X)X)6o89ZL`rg`y-h@1pVD0j}XAsbn8cb^QL&}kybag=CM6rq~MjB+%m3ecm| z8(y+Ixh#9{Eb$&8W!sN%TcST}}Dn z*{_uyOz&$fHixW_!D7-_3^l`K2R>3e%)GuR^4_kd->Sj!oKR9ulZM|RP&2-$FU&s- zAL5D#78u;`Z@A*APVSG4{qHUoY8s?5iM7)RP5MB~BxG^%uBtjNZ4g-a>>WRvWvM%) zlC^`=hiWu0kFb7yHjnlj@Vq9gvCE-vA8VW6>e)_|xEd_ga z>=|O_?A`p*Jqk)^Q1DMaim!d~y=AfxlK9AIf|PY1t=mdl3dq`E^p^qOqt%iAvMr0I zhNI8Fs-}rvZ1sOgW8i9E_{kj>HNcLv$D_9B!Dr3Tfwbhmxt+jqxP2$eJ)(NkjoDiC6_-z#3IW`0@27OS!Wc*LvQRw$A z{{9Wv>Cm2n^te@J@muRWLlGtRS7swxWOQ+6ID8vYDqs3@^x6B1b7@j$Zer_crKmCt|#F%5HPE-VK0=?W4mkh2kI4 z7y6x>BmSsW|CUOzS#6@t;&*BoVWh&S)H^ZLgrUsjnIGN_nf^#cj^Zx(PB?4D8D`Fs z&tzovjGEI-hxRz*%B@hsqN(v?%`WTO6$7IBzqL{{PXt@seK%) z`_G}bp}e>(jMSZmJdxL*uo@TY-rk|;l1BsB2ExYRVPygk-R zdpmOFjm@ACKVr0)U-1`pQ9AHZibnr^*r0%k^_G*W<*ink|5GYzI zEO_t_i$G$q%P&|?xuViCWcXO^=Y5}@T=jv zZ*eXz;PLaQ74I&CpEk#6Ca+_L`07{5yiZyJy^N16LTnTW$yPpHq`LS=o&OnDG<%ak zG?;K8#6i^6E@&}Na3rM%11Ro9nQ1qokzrW4wj!zNQ~ z7c1?S7l1)ytBW0l*~*8?v*)HgU%e=4_v%!1mpeOjl!*r!k{ib=Hz^ks_z+$$6t+g+Y zKbqzDnJ?u!$?S?i5-{%3%23}YIA-1O)s&?0rIGzB(WUL(_aS&`3nYWG6Q5#a%t5=N zajmzdWrUSpf}Ey-0Vvk|*cJN`}9pr0QVmr<&JGR?_jp2YJK z75qm=aXbY(lHY3bU>y?UFtM3dKgYa8LkOGp^v{u@!x_(hWK`O?b5GS%(tsLkSZmcJ zrH^M=?UE(tHd->XIf<@&WbOKA2;M(b>fm5^2TV284Cw!!`mCey_S3(_B=o=dd1?=J zO(VVUE21PZeT=c7pPNyH!4M6ZHYm976Dy}YI7 zIMBI6hO1dBs5=(*mD`-2m{V`c=(l^49r=#vT@yix za$@0OhwsD8$0hFTeDltBG>Q4eb5H& z+XH(}>PD$Fy8cm6A=^%HSPFgiC}q~iU2!$pAar2V|5oMdVybKtuM*6-%V?VdbFo=7 zXGXc&&Og0}H(_ZN&ey9}+ut8-Z=sn~nPE-1(n;pXy*-d3*5`j)~xR)gNcn zc-u?<_;2Y5-gbMS57<7`x1J%jzW8svt6loql=*-J+yB{qvP<{Qj>i=y59yHVN~U~Q_Qe2c)*athrS?CDan|&@d-*VW*^r_EZ zfTQvSz7YTbO;<^JJ9yz2Xk@fvBX*t*8cD+CHe^IUF3I!@R*Lh$c*j4|#eO0%N=FRs z*#J`X-Kip=4F^rifI4`5I{0ex)I&|ZHN|Yw?zvDj0a*^Chdrj_VJ!1`+`VYD(6`uS zN%$6}iw5BqM&=8ML{u78c2kMQ2XB>|RRJ!zjaiqEx1Li90z{+ZqR_?bSd8MQ?}$ly z#mgt-*i@M${=KAfy~Go_SzH%ZjSP*U|MHymY{h3^E!77PIawb$d1g0SR1h1dks=~U z@GxE6Y794i|4z}`{?&JhMtFb`PB@VWP4tSq4;aRewm$k({}x0od;>Z)@jKgWBnfTl zEc*h994zCbz*E*^{#sl4aMhSlJq_(Q*_0O1w(#QOeN}a=wSA-r#|_f++_?|aV?8p- zm<#-_*a20onp@;^nE{@s+jIR&lPLFXhz}L=Lfr1C&MIjXXp%+f*U@xaOIPVHe4Z=^ zP@phE;#Nz&qdkf)U+GRp#bE!Pwelsh)ZvSTqpv<9O+M;n#jzi1*bB5SdZ#Q+ekq)$ zxsm7~N1#gw)x2gOCPW1msv6(9e(n}*zs~ZGj`!6L?<)p9hTT!a%oY5KZD9%(GC^l{ zIqR;6H^Yf3DLvn0&s|npP#`&ScaP`06Ly_@Ci+QyZAveMFqp}e2Nh~0qdf*hh;v(s z#v`<$k$UJWHw)AG;!8JX6`?7XUQ|Q!t<&FxWT~(tv03>XV2PRTN#R=mwoZ>j(;BNn zdPJ|o7m_=-7lhL~F9kF&aBYG)uKO<$ek>drzA{Ay%GO0iQAplitcy5_?SaZ>*Uggu zgO2vmdoBbRytT1!^AIHv-Sf)o375%zvga^tum0HQ%T2V0qp?l5Qr8rUM7WyU5t`a!)8tho^sJUHC?ru>QCPb_y4mpGALxYG}g2o*WjIz`nRNQ zNl94z2T-FN?^Qz&Mi0aiHpgZ9aD{bVZ%G&6t(%sA;UKMOZk(6TJzaAfHM*mNM7 zI{xK%@JZM4cctKqxIe$TyFq(>B(d?$-yQK_!0AtP;iC$nVIfjLi#e}oS4U=UdVTQ> z@#NRvZGO<6$OT$}r@nvh;~e|Zb;TQ%osQoTJMs=G=DD;vM8Va(mcwo)C6ez2!pEvF z9d4GE!3HMn)u4FbCV>o&m%V#!+&PJ!L{jpT@UQRM8Hqhn2Rlc>B<@lYQTe z@IOVf53h}rxhmh0GQ>3Wo)U7XBX_lb6*NA8a3QDCDA8aiAiV#Psa#fO-fkT>Po0PV zM+hGxLhTG4D|_av7il*OpPtPupd-XZ*AP@UeA!S79tP{@IV2uuxMgdT<0mPgJpLQv z&elh-zLx=e=@fD$HEmTbjZl{XKJOQwb+MtZExh-NTpgbtx3Lcn^t`q)-=m_OmXVDZ zm*J6IKAU-tZ8nc5hplcuta>v1!$3}W+*$Wp8coKb2nTm z1(-NOh%o;rtf=C9+`Ot9Rv} zRLRdhqqFsJPWlh93_3>r3>jG7%`iUn6TgAWQe)8HRHb~`Yi+jGnfc8ad6KYYLt}3p zU!%~kB9(IA36eTi0=KskH@XE+SA&=D)}^@rB%yzeu${-7W9Q5CkyMAb2P{kchYDd! zpg@_atnehRyG4ihBb_5*Z8nk zqC!6Vc0PQ0%UuiVFlFoq2>)(H=B&tvX(o~81)80D2h9;F{fCAiZP5_gm~B^)?zLps zobR@@r}uWw(r34zV=#C=CC+6q!&~l!c4f*75E%X7%XG(3s+a`?G>)K~-d8Ayp}=&c z0OfKcm$H-GMvfua{OFEaVFr(#D}4I9QyZ|w5*{8t(ym5m#X|-J*?@;bb@T9O$pxZR zU=jQTlr_PB98B()cf|OE+@kuNY3H_tkC&>4q;ff2dHnt~{V)a=LD_@%;4W8~FeYu} zP$BCjPFeMtCm$^~Ws~ql^n9Qux_%}J=eF98PwiVsfkKu$roJ?efzozpbZRlHbZjOq)3j454-Z7* zhbtmv#HhslR!u72%^aTj?&1Tl^|b2agB45?#}1~ZDE$3-dL_~v7+~5r7yj#&nCpqBdWwUY(L@2!0+4MI z%F@Ftv(tt1E`I;K)a4|kTX;qM*R5zu`6aImeCJD^pS&+Rt)n%z$M(_to@CP>W+sM+ z5EI0!>)w%Xhe~>5Q6sV6KE7uBY8nAWm&79;>;90r{nmWt^=gK>2Cb9q(fjGKfF>TY z7#0-nR;&yw!R$>q6MOciMy01@*Q_ZYbp(P0Uc^5#II^S&K=hGVL~stq|z+4u}el zYxVQcJ(SV*iga5z$m~5ccS&;S-1ggIHolZbdkTMiAIXlYc{TGp}xDDh9B7 zNZ7JnZf@?ay;m_u*HDk#pVsG!KGOd0&g~!s0MX{Le&S0hU-?~TeShN0 zHZl7s|N0CdawH0NJ}G4p4aIfwgL_*ph2~@wn<^nq>jbr78j(q7C7X*g6;Hu*h=M%vsa$ zy_nfX>OU5tyXTF!*PjV6T;0J5Lx0Tartdtw{`!)Di-8>c>%qH+3SoU8W<>q6UvBlO zNg+d)1PvN+RKt2cbS+!*&+M?;^$`62Th}-%(>{g;LGviY2B<~%&hXd9tDhl|nU2p- z66Zq-YsyO3@cy?te(m(3X1j2FZ>KjkD35~fqvP13qLkHE<|GSc(=R2FrVm7X6(-jd z8IT}0;SYZL1d4Ky_XBzekQmQIt3py~`EU-gyB6WJ)MW(7n027dPRNqz+t5Q9kDWIT zFH$Y9KF_hJxY&NgeJEOtsRi}SQBvxVDSMl)kykPFkRID1jsBOU=#--KWN`_%TiRL~ zocf}Yi6iko1^*}_#)gK#Qf%F@0N#h0jJdJ~Tp>n8UX6!d&Lv+U5&R5a4!VtIg0mN+ zTEW+3#&dXMe^WO^fhKOiCGl`|RjZ!MNKXf(OF;j^g76U53|nyL{I_F(!=fKO_iPK7 z!_Y~9_-gvsuP3m>2N(o=WOZHL7W4jCI;9LqNMiAm*|a_^>S?b{razp4@^VX zW{sH=M0vm0P3VMfq2du;*gXCEbjPh<=>`;A^Koe^m7FBvV zHP4+unDxK3lyUB0D5s>`*c?ebWtxLKAo$;G~m89lCIdK5?c28trGo=-IiNj zdI9ISJYK{<5hE%NIcK&qXa=oNEu0YO1L2<~T`K!DZ{B+}t#vX?3PU}opg$)kp;uEm zxAQgY$b(8mJC>+S#v`^QQDNi|LS1=>5j%D5cv6(`JZSjnm}Nj9dcXvXrY|94))}+p zV=}S)Ckn19C}N1K6v;`2vQSlD5duV=?EFsKkcLn+qJWM#J$}H9F**pu-LTjuS(MHw zWC%OzD967{pR$57sZZ`0TzmB1&1CC2v1Xvjn?tDn)7cvQMBQJDRC z>;dUUPT&QYfz>a4Vq@!!d!h535F5?rMWz*O zZQ?$9n)_!dbpoq3Q(kLZrsbNf;IL9kDT%^=#n8+Jl2mKf2?_Yumm8?k7KJ2IoWJ_( zQ(K=Ya7ExtnQ(sk02?DK?osC6i7($jlZ0EjD2oUV839uaZUlnq9^5|P**!W$DQe?J zD^?oKXlz9iPqth9@H#qL9x--4w3rEdR7*QUYrJ|$0fsC|LQbwspL*&OFj*j~l*#^1 zfSgCPDxwEDhBKv=VgLB}X&neJfb0UP$K>%W^L1q@n^~M_3-I&;ajwowGBSv%wEAVc=%;@hSll1KbQ~!HIrK6BNadFpSURAB!})gL z3=hEj*eFO;L)_{kpU5ZAfeY#ms0`~Z27%33OjeqHlnVw2XL2(jO8Yl70bN&ENJvH< z8IoaDU0wYOBnR@8z7bStR!+iqi;v6hn~pzmA$$o(7MNs2pQLG0{`q7c0lqL_=w0lF zK)=K147&pX;^suwk2ASg|69DrJKU&hywvQXLkVCtp3}v$nnM)sgCDa=s_p+hQ z6{BQ*eQ*Ea75n3eOOAi6ggpGeDxbGEWyg~7@@>mfNJVFCI zBw_Wt2OxRuI{AhPdH>@;{4_>2;JW=+{+d2WIk}!G`b%W2AG%5ng5DUX0otOzqEBpG zhe8ClLN6(C+|VQ|HM#eH_bVydNM(TPR|JVVFE#5$rb+&5*=OoCY%?~iaWr!IP>_NY zGnuK!eC>fNn)==a$cAZj99=U!OnbiTTD5+k?qDt&E+`4Ne2C72?tM5DLPv-M;hmLe>>nh*;m_BCF6CbHmoT7%fLbkcxUO(`5MuxXFKl*@W}G%7mrm>iw!MpNHJI(yhxd1 zWu&Q%nKE%vG>QboCqH_S*g=vlvmsE}*+L4kl$zi~oOz=7TQKccC!e;Bk;b%;o}yeI z2~(q)2NeWfR>^XI9#E2kL*p5Auxy(gVRfS$=xD_P4eN+?x-;gyhF#h7*k$k3@Sv@| zqrNm!l?h)CNFgK`=Q@0zF?54@lybkB+Xc?mZ&_onqtil8F0VTQBYq%E z(jn+kwD6umuDS$0ZJL!yhj_5L)BogBXYe?4c)jJEyO4L0VkA8#gYvTYzR={M_&lv&4tW%GbH$z;0hsvT^ytdvS^OB|H<0dio&2apwa_eSrayK>i9G^p}=+VY*wFaC;Nj4fvoxFcTKk5N*15cD$<=ODg6Iv z@ZM12({7DMP^(YnYJSxR6O5IH@r}V%P`ng-)RG`y>T1yB(-0Cj>j}l={KKPR6kF9q z@xP?N21j9MZQi$vw#(h?u7!^~{q0eYu^PTk>+g=P+557j%&{B$NzZ*Ycg=UFN)Wptn!X>hBEpt=f&yLyI z4=?(i7nD#ZakTpm_i#2JxVmOIy8N3|tp6QIY;zt#P+y8t4`x6#}dhg>^a3EYf>Y6vn*psoA`Ztld3A_3*6Fhs1f^*@;A94>T~2X@b~x6NRj|EFuCH`Pc=?n{OuPn zUXBSVqL=o7FkNXR{+afbXYltA)T4&_C7|q#?-@*P$8d=_ljKX`#UCg1n(DgjMkvH5 zY`H-gC1CpEq53S19HXpYG+ALf+sp4a*vB|D4i(@}v>ObO@2*EcAa`!u^`P=53X4Hz z%W;Y~PXaC0i7clN@;+-U0zZslh?K{Y9+9>zN)O~1V>|`xJ*$BXP#80#YmL5oW-mUs zoB)2NOl7+bBYq5rLss{3Po;s2b5>(_i-pdtk@rVtw&C1Ur>Q+%L=$bJT84NO3x4Md z-FSjr)KnZ%J$s89{M!5Y-v|iE@HN4u!0olK=oVLww+?^y=U&~NWs*O8mQ@M~DIW6V z@-qLy4*A@cKf)=QW*(C^XMT|<>c8EC0MYeY(nTtuvQtj3XFc}4O>Zs?oEPTgd}NdJ z^H=$^K&PYuCJ@pFl!A>35c`tGwJDB5-Oey9M9B9Yg_tocUX_=8$l4i*m6XFCKnv?F z*jQRc$HHb(%`rN|fWjikj(ps?1$%=ejtrw9T!%iU4dekh^wVulis5JzRHPi?*+T>EP(n@8IBo zTj`&F?*?q~o%nLQPa-+eGBO@_<;8P8FA7ZVF`_^c$p!IoqL14SYU1Z5i@Lgkz!9ah zvy(KYBZab4+OV{N#Rm9l``z-itKSLb>owt^;!^$v`H0Hw1@Hun12FlMc`p>^2S{TN zK~G>9x5m#SK+wW&fMd@WIHN$Cb@a~(c%~8QJ9cWIZo&B5zx&q{aE4en;$VQ+{dX|< zue|K($yeNF%@ zj0mAmPW-A*HXC~s+J_Yrre{A2MmK1UIIdIEF;Vfg!NJUrTjG%~R}4AIV!albc@Gntq?u?)m!4 zegUGTF#KGvc9F*gTTeX5;7 z`6|u!bIewSQV_Kp8}!;@~(|GP%=`mJWx)_B{1r$>VLB z;1kQQ?H_WZl)!vkGi%9X@*Yr4$&^I zSH$DP)`a*GnUA&qQ};vJA6uQ4x|x8dk?B|uMkYjvl6gPOoGN*S+cL%o2?9qZ4_-yc zz3s26z>}C=7@8;O;?I>!^o&G+Y^cXX;m1m*w$Qj-v}rS0u{*vnFeY;X(HA zT!|6we5n7sbCoq*vodZXnS}i8kMD676ecTM)B0V=C$LC5+CYOzrNZL;>=4{Cc?yk3 zT`H;ad3SbRt_^RqpZ--j`NYqGiCq7Z(-@KG4QWEA`LypqH0az31X0GkkmbohMEJ_7 zt>T#3p`n`jSJ15q$~Y`=7>O>i&$VlqYbxm!Gzj|v>ijt9R2CvZyl*tYCWRj{XC6NQ zw+k{~!8SuAfIb>tek@YuAIkQ}8yF9-Cmif{5b_9Y*OP~aiu$i6inZl$0um7bBYRCj2 zLKIL(KnMuDqsH}jKT(+4--ai?bX+UieP;#@s{zQ-ZXUTO5Eg>!84y$bL-)__l`>*b1K$7^igX}o{(h4?kW055a6S%_ zhe_}5`<39kieUXZ^GL>m>&dIV<^s%8ISO;T967W%_CzHjmDBMV=Y1a6de?$-E~n;o zx?I`cZF%Tt`&7cAqj^1pvxfTQe-66A4K4W~FCX7Onlo{i&UTKIk55ZQMRfU|flKFG zUwYq~`53%5u&E%&83Z{8K(<15E9>~e;p0HV3oz~orXUa>kSFJ%9!kipJ1pirT{LQx~<-kd$0k{=yT zY2rl?DLlVueHG{tI`Zd^jo2Yp$#k&D^vU(=2#zS8k8W3;Y5kOAdkky5wjA!rVz)D1 zTp}D1`sh~VX8ntwg^#=G|Il<5KvhLs`w~(jEuo+^DBWF>mk#Of?(UH8MpEfUxD z>F$yS>2CNp@4f$yGmZ>+FXx=S_gd>KbD2w9j7{8Y4&Tfq2Fz!Eu)6X5$MO-M%bL_) z9MKaz98#8jtC%!a5$d>nq|*E_WYt=0YwNf_X6|k6?O8d)32*@NitZ%mw@n45Sv>g* zp;+Ul;$rhpr=^Fmmft}*Js-$%>gwu(RDy`r=l_>g=4AjQe~gN#D1|t8@EYYS^2O!yMWIs5gDF1e)Qu@l<^n2G1s6q1Ibb(>DU=Y_TzY-7w!#mNV$(i{La-Z1oK$nZ?OOml)eP}|;~wV7jbosZ z`sGd6s@>p0H9L`|?wDGQt*;|+DvJ$I{0SY)p90lo#w5jH9MK;P+o;^ zID8b8>tE;M)cC~Da14qabScpSbMItFluu?$A@8*+E$TYX?sUNV|MmcHbaS26)*x^m zyKI$pJD^;uPrt|{je(RMJ99Vu{^_f1KIFU2(7z#c0j+91n4YiLBv{cmw;nIIhY
OC=nsHskJtZL^}+n(Bob3?ozydjl9k@ixh9KlaQ5`{vP?+Y7iGR5xTG9N^*Qeyy@ zj_c%*M`&bpZe8Z^7jH5#%n73`qqdI9=olA9*zb9s+meqF4o{<>vWsT$utcFa6bd-K z4~YmNAnz^q$gYK<4K+=gQdA-1cur?fDZ9S@(p2CsmDF!^?*jXr6s}61I*FQDEm5-` z#Ix%kEw_P0grFe9!#NQ318M+xKVTLMb?^BW2`5Nk335U01#lzm2~AnwT-=7eLXO0c zi490BV9d_ozC2p7WyH7n`EYqM7ev7P=2nn6R+{p{!`sKF{dDm9El9GH%pG$Bk$k{m zIbxGHT?JNuQwaqg7Jq$h&0zDUAkIgQ_P!&)7>5!#)}`-|LfZ?XF**R^^tx7ap6J@^O7Wb8ur~JWuCzK5VxfO-VT%6mU$wc{;tc3mnW>Y;$-KWGZz22E z%;DQi^DRyOGm@#20=`qp^y4B(46upby7E*ILpH%p31aU?Ax#3$E`_Ofn~K&!xVs+TbV6gHGhtQho);mwDKjKsFQxRq06$iZnIzdjtTH$b5L^sC)D#y(PgDhw z0BJ-Uaa#2J?Il;ba9c_nZVo3YzJ_{jt&od@Kse+eb?Wv$ZuhZ z=8l;k=7fi%Ksp{u&)7K{_r)Z+j+Fw)L#wsr6yY_r4DPQ&aEak%vCE}j{2_nkX$UK& z051mM`lszK<+kNKjn{*xvCn>sZ)3twkHSOj0-Ul5NqWK% zk}G$Lo*p{;>$4jL;$70dy1(EyK1*E1@qf}cjH4FLPI>`Rh<`m3a_gX^U8Uej&&R~} zFbDU%QP8X(`MM*!30c`3e*EYF48&V5wt^4e#mp6T!Gnk@I+-{Q+oBjM#XfjdZDkyk zUaw_&V`F{Ym1BS5!o-`oR~Ki69yJ7;$78tPI9eS&Ry8|HcRMF&VxxI=?SadAUwJGP+;#BCvk#m7n!~ zZ%k=?=*Bk;_>P=obC7o6>&A_XD&n==8E03=ubbd>V$G|`YcCpAnr!ZI$ zkV-t9#ix;{eR?|O9!7Z1GLMit%1&YSnQUk7@-JSZlH5CKS zcQiw~^rP2-zxDAkV;5sJtzo3P3+ovyNnWn_5*`8~V$6F1n>vlxasJfdpdC4J)A})k zhldyQ^G+D}Ck&o>k=hUY28clYXJQjiEx0pf$+6zWn3kZ+B(I+|o;LRHS6Vtva;aj8 z-o%}dWhg(+Pdlw9$Ym}rynW^4K3DEe`Ef)9gyY2^KQ;>LeKyEX^4<5hQrRY;h9yw{ zRYW39t3Qc>FU0vFTI7XoqMYvH#$Xx6sdQo-(S!8zj)hPDx`-_~1j6_#=sCg@1$e}H z?z=L)+NyA-cBq*M=Ur(Wzr7vaPnJ5`zhFo;{n}~gUjx^-BwnqV1}ErT%zmZ*2(}C( z;xO77sj=C7>hCmCwNx54lb$gRB0P8TuSHpQ>7FhcCnQ>%0 zGrqecoA)kCZ8zbwM(UAVbs?8TFNew&g%GYc&%7t9XJutf-vkDCv%Q{Mx5D~hKd?Xs zXxD5}2aTMM7(b8PTr5KtUxl0C!XKkw;obi&KGZ_^S-sR^mbGk~k3iwx8wWzto{t<(;=aYBAG& zIGe%pSziNtfOL`+o$AfFTQ=(QF3INky+^BtntmTJn*9@|l?r&fh#R?OkX%Q#6?_Uw2Ejc$#cwEM?AdZS!usliK^^5xTq`VnmII z_PR;h&t-I84al1&dHw1YL{P0L?XVWNQT)cgcUA=15w<{rTyAIjVCC((8|1swR$1hI zz+!b+U5hKb>O1@Ty4~tuA9X2W55!}2@`9Vd(7tu`4-11_P9i&_l}-u>|~ zB!a}JOc3JWyF3>c*0OgTeH}&2%*=qr{2t`8kMQ4>fh?D4P1_`jeGtkUflGG_MiDlQ z_z>dXy?EO=re^2h%k~nj+V5hhFp#dj+CjPnD{%Vu@dP;kOFVilkbGugS_$~hrKL0s z3?tiT)^pXHAjH(n+&rw?fOiBB2d50AU4U^&f+)I6%aTDAD?7W2ii&J%{2x@sZ&t&r zT_HewKmnC}gF+b=5s;Q+{P24?^BD_h^?C4sP_t^hBpGY5val#AE{+R&lY7TGjP#9t zrWS$MktoQKXgyq}o)#`Mi5XWttr&}9=iQ>P<`718W9N5L=R!FGlz5}h31V#OX?@LI z0cD;NL^&Lm5-tAhMNr6J3VSK<&E#9M;XjPReJJ1sH$H~#YiTJbydY1|_|W7Yc%~?2 zs>y%fPgfA9bhELd@$S*Yr(KxMs!zYzHj4Mmqxn~3-2n6W${EFU205w>1eGm?AQCA) zaN=_uWs{e`vsx1zr1jXOH|B`J;7*hzCfY{TYkPIIkXPz-B(LMs>RJm*#)NQ)r7%Z#J|=W1STO!rclpq%kZvR??6(-Z zM2kzR_49k|^X?A}8{rM%+r!JfH?ZIBOVJp|w9{fgy7!uf{QaYsGRS;1E70m96MyXZ zwC}c2vFcg<{0rkDZR;L(WK=A_3i{L+#7vp+VVC$LnIvbw)JIvxi9mW|;nJypcATJ1 z+;C|RO@`u&bA7-_xL07BYU(7yt)coF1_nKutyEU2}Sgl4Xru*an_8Q;{-=+s;%lzT$H*8*&!^?ZK@2l7|V zSxLvnM5tZ6+yq9?Lv*+5UxDb${*YOte~CHO$TxjE;Z2TM@$wPfm9DxnqV9dOuhE;h zQpLJD2%5`bfY(eg1%7Xq#9D9FBnk^r*!K3e1m5?x&LamG4mJd>icDME@Q^M@tblvT zhkR*8X)M!dw6gd|BWG)p9n&(aBp#z9D6kBSFKT~>CxpuBqiG* zHU8C`;T&9)IC7NUt9@9AN-lvaQ)XV#T564@>k(?RHr3@Jfog^vMjrKwT^?h0t=>#l zZXK0IM1*513ATRD*mVV;a-7|y3Cqwo9_PIEYxCGYw+@_yU=ji5E)lw|AkPdCX;uuY z)RdK{Kvt78NG%;nW0Ptxh{O2;Inj#5;0(xvdW<@USPR*upy+;^GO| zZg5D9s?>04)$9P=p{nbB5l&Mfae%L)tlV}!E|o1WG2MA(uAn-rYg9`Ts8X(R@eHzn zOw<(+?Xl69knjQ!|GxR$f?P$mzgyd1HRR;V3%6~1FE`%O{$~RTQnH#$-;2Ipi{mL6 zWT+{vmT}^w590bjnDQ&5C?_;82reCKoK|0J{jlQ1X{NEIWNAskUpG;ym9xR9B6qYT zzf8m8Q*uAShNm!WkbE@P>JG+VgX&R|-}!GF%D#X99!rjcNh1gE`tCIU{alvOC5~`~ zx6#=ZYtWV~TLH@hZ8(@rST^|zFXQ7esd5B9wHEUYy$?SN_H-NCYy#i|SUBS{Lx z@8Vg=*i$izHfv~7FB=+cZ0#!2BV#&AVPF+-P+bMjXWZB8$x`bsTr#9uui;QK0i0n9 z@TJn9wfDW&H{3&J+^_Nf%Kd1VVGo)3z-ySZD*XXj3`K}IGZ^)i=@=dKdJ4Vy>F3_C z;C@8!$kStzimu-8xV0{XiSteyLm~pJ6vylLX)@o=e{-2{wvK&^j}QFjRZKxh)E=Dw zB5lk&cNhnJI>ItE)VnY^!4#Hu>u;{9SmxQ^zuU#xJ#M0TSH~^dG)$z1)>Lbh6A%=B z2yn;jeL=XHkI#@#FRZUVy()ov)nia~dwa{}xOFa|0?0Z5zvB5ZGf-^>fOTPXzQli; zrQg3ZDrS&$61=&-OvJNqvAtGKQqT!M#X8s4;(+7?rfcn@1&O#9clA1>o?3*&Anx$w zZ(+jAd5|Q6?e3`>0~_n)jM~${Lor0@t2Ahw2N}2jAXolVBkNITzh_(IzA8z3!?|YfG2qu(a%I+QLge!4W~Qv zsBOk;oDdBXULdRO_27&H?MKE-tIBjd#k#Br4&KTYhv`tzijPZ)ft*sw7*D>Tf5X*o zdS%R^Bd&-e6dUh0A0;9yD<&2^w|m}xc8Hb$wXJzms2qt1QAiBvJdVq~fW&@Fe;wh- z)|*ZNWyW_p+mhva33z!Bg}=tDzw)37S%7n)Y13qUwl(xjkO0F=fN(XLPZT84sPY3q zy&4ZzXe^IBlo!!2IF`q#=z`t(QyZ`d1d--uX)48^!8|Pl{r#4Edv^9JpjKos8;9>2 zc|mPMe;h{cGLpY-G8@YQTB>{yCIPAgGgi_-P%5Aiavp;-C z3G!C&@9&>E5diJvNFRdyb>e<{MrHpZ3ba||75 zKtWDpuRUmyo-q8t!s?>;$_m=cQ3X{>|6yk;IgLuw!hUOvaoW`8T(WIv6W6Ul#lDH4C8k* z#8h9CKR7J0ca(fYOmXD6wOyp)T{50A5Jyw(0u)s zP$p1eEHuAP%^jwFvTE2~vL0rAnLyrr@lpKE3%PYH%jigx*p;%+^#>OwUsHo7#Oskf zFG%-RRu10Oe+5hUG-wOacBlql-1iPYJoKkq`-e>1>wA>-ROSSEPS3{HMY+e>>rswV zv5#wEzkhE(&W$a`B|Ar{$k;SGTvy!A<$AU96TMJ2wmv@N%X;nDOFqHnL3+Nng_(z! zk42Q-0tfM0|9FS(YYi>jXj#bc2U_9qL51@kULPRMSm1qJRkbCCZ_sh(7qC?S>o9Y{ z_4Cftk~^ruYgvP8$BpRoEuFGR=A$E(iWN*`WH5Mi znqUu<|L3N}%iobf-D@w$e`BPq{2C1ElOB#k1ojPy!2a@|mtAtDsk)|Si>C+Q?(BR_ zoLZzKr2^cVehv+;6Y9F`iv9 zb{jF4h<;HmJ(?#E(Gv;SE?p#~fHp_==l6opvc$eM65M_z);`8sVpILmTFKlO5NN!Y zjV&jRa#iA(1)D}WzFo%wv`_^p|IXO3$SA(M-HZ_edDEu<6mldL`Zq_RyzjRt8J&2H z6FcjM%vV1otl#Y{!q@{ShD`MMsCQmM-xy{m7hgbf+$`W1ccrgG=MSdCizz-{T8VNV zS*}Mghf4FkfS`7jsn?ivhrbq&CIoS(FA=_gae&8a5FQ#4_j#|tqy5%kDg*=TE77ag zw9b^IPQ9a<1EsC4x3mrsU^M;h0o3>ObadXENva?eKuKA-4lMR(zEPpTgSoTw1-2Y- zToM=rp+Z4NIhsc;*4P-V52H6?iE0GEUjn`Cx=F_ zL!RmN^Oir_Hj_2uH(8jOpM{oR5YcTwN01xCAHRv_xHaewnEKB%jpqzV(6x+P)CCY% z(zdvrtj*P!K0_SjPzzS?l;*=Db8SstWzn&@xjAs#Hvr_>^~}};o6P6p&((iS`V&9A zWw)BGGDL)!)oC<#NKi_)YPDSrVTZhoO8%5vH>#KPbQBg;icOEUbkMo_%8IY*56?x? z(WL6uKbZ&z$>fdXSoo^^$3KWsy}?T=LPDzs;_=5%yi<1VmQ0WaE%W!8RlEZj=*#g} zzPodghN!l_(=FaVucDpj$Rq>I{)Ij|I~EFX!sh?ERZh)S8}|-l6Q`6BfAIBLR9eAO zXI{w2?5sv5fpTIcEb_Pa5-|)?sBI{P@z z90}v++HQ9%{A)^zMNC28SKiIG#Zg!J4b3vbLf0Q>w$nLe?xy; z?Q}j;@r*X{habMP2?c)Z{oU*}tM^ifJ)0$_vdn}4u%N>tPEyE=cOcW32Y zguSz~^*V~2=0(04(e1=x3Zz4y7zsY&j2v<-E)@IsU*`}TGwUotQ{{4>`;1OXT*^qv z)MXB-xc!IRF^C@ztz`U83?}U>CMJ^1FmW<`LkK()3~?kAo*dHm-M|(|5B>ydLh84f z&&n?#ORp{_R4X7NHrGFn3?dgSEOoEPp6sZMCmx{fY#PCWR6Ift%9F)A>hUC)Bi*I0 zJ`@5}YAOq_sxC>>Po}FL&`G zKtk4U{L70FVs0Kx96D91`t!7(Mzg^N45X^j9{-j8(5W>W1AY0`!2({G$hpVEvzTM> zt39aE8&-T;zJJ#n&x3lSc}&io=ucGbNfyF%fPJdoYOdP%>2ayWwMC1*PJ_?5Kk?>l z+c1*DcDZcI!W4Y?E%a?#EX+ng&8%zj+;6c!zts_Ff4V-7GyQ)qz{UFAh)5fF3~|Kd z?6W*>e~?NAU+eAtZS0RKy7Ht& zXg}2sp7dK|jeCk|LM{dVq45}t z1-o(NUX_&Bb2f6^yU5UK+WJkC{JTv7sSTdbZ(gUGeExmuy_^~1Wr@3xJXDou80ZIs zrh>@7vc8M&?xFC0T%cRA$*R5XRHUfRa@5D*V|M8Exux~G!=#jHdSUeYe~KUUXEk?y zZChBpf09PT>D1}{y}oc938pzvzQ}fR(p##yp4H}izEZ<5cz%nk=NHNj#HIHfU5ws} zRTQXd_0>f2j}9RK@)bDwjlF93RsXAUsfzVtBh!PkHZweIO|Vnc+>o5me_pG)7|GdD zVwo%NQG!Wv9q0KU$v~{*jM4PlsKV4*DXho+ng`X2RDqt%-gPfcPusabm|#pqa;&h1 z`iqPrOS*J<#&%YQciUI{0lq%I-dSr7)vulW#?QG6MAsASIU()>GQggOK`=okd!6466LbMxZd!_i=o z&=8r#VQqiTlm8k6QgXGg?sF#76De&dX2OZ3Ob}dUCI*O`#PHQ!{*i$s%zrS@Wk}Pb zVf}`&spc(X23qvga22`9yl4?1;y-Ua=At;5KfWfFSRDBa*h$G*Y&H84)`+ZcrouOC z%+g5ZF73l39K^5N(d42c^dzJcVr@H4Q-d&YOe?>5bAj~8f&Tty_Smx+0VJ$OiRD_< zd4y*35x|w^0Gl8UP0eR&9~jI%ADGqCBz^y;NKWB_l=zeml} zp2h^@njyAVtMglSx9O7&V*fPBkc9N3n~61znZ{Mf$|vNrL;qf$>HHjBB(OdVjsApg z)xhLhHt_Dm?=P^83VzTvnKgJ`bw3D_OUf0zvo{_-6w7c9qp#8OcxSA;y zx5vhi;Enrz>q2jXb8j?SFUijZyLk zo-aeyRRkv7Z1D_)uQPQjW`?F3#L%bU-Bt%_-(Mhzk-0+rY*#X_)0zDT`Ff*@_I@>t5A}bzE;nF^>G_&6|`PLUI zU4t6l+}ML+{1YfQV7Ec(d+W!PEF0{nh%+Ug=qDFVfBD`gK`}@8#cHj6k398xgzkM# zeLXG&WHS2PufL~SH=Gb3!f-bc>&43C&yre*lKkId9VceX%^*_#`h_?YA{b{V8Gs)t zNPPbo!eiUyJ_Y(fnv{|KvyV_Lbr&f^CDXA+rl?Qh@rn9USCo=C-P)cdDzxbe8u6a3 z_1)X(MBH8h1=KNAvFVQU5Z$&b*tEQ#MMCC(0!Ap{g$uU16kpvJMQNVN@ujF|N8yMARXLqij ze3dQ$pv^`plaAsTJcL%Kb=Hj4#mQ-MW=8HSBMhX#s1yeB_j7$THFVkREB1@HSVleO zd^iaVkTK(sEFvlzG-ie)%7lZGDovS2e1?kqZzCPZxXGcUQ085h zcgxDrHxApZ#fi@flME?kQj_pf3k&~ToY||$l`V$5p$XL|h^4NRk0YsJ~ltJ#P?I5`u} zSQq}Tf_b$Vdj^g!viX05Iv*WS=Nfc7N{0rc#I_ zGCsJoUpkRSUaFKbWuEF<@vv5m`eTqnS>4A0!Jyp<0rHv1(#m?T&t;Z6yzDCHWq<5n zgWiq+-!j~6(|0-@GKcL`D8E4vQ)*d3_$E!u+kaK$ZD;$A3oG+wY^h!RKYlhK8cJjQ zUM#H`$CtUzBToC?k(^Lt&^2T$a8XN*bSLm|K3k!kdUFFW6!`E+5>E^1Sem+6KzuLF zFM`A+Nws)!rc3HK{m;;Ic}datuiyQ6{frK>ds~EUqmZa2Y20y`x97(8z}E1{H`Y`h zuIyNC?$zI_x{ci2YhycOKYr3zP>aKdVfdePbnW0qbZ(xyw+Yp)(?&ZcnWFtoBBenW zQQ)=vD`;a=v1B7xH(CnVPnMRRk2l+0tH=FGG*cFJUQaCN{_k|1G?>4WL!n>zBK`BR z?zTB)G2jD;Z;fyY0LM?Jw88ws0Y{=bx50Ge-M0}{04pkjWJqIUV{A%kyCy9_sne{p zcnzT)ppiM;=z7GfMK{c>WDKuNecV^NPDlU8`qQFxf;M?+@sSA)R63mn_gOTC{~ zX%+Z|R+fq0Y8(8LU@|K{T2d~W$Vlq+AG5z>oBQcgXh4fHQwyf_wS*!tM}VG3$sx>23G2-oxNv_3(kI2N1FlWmJGJZPcqS%=Z{ zZ*=82delsr%iE5Y2W;Ash>>W+Aox-_B>S#c~tgj`9=2MRuBv4(>gjn0;G9jDZ|qp} zV`Eju1Gry0?dFVAUSX=c0U;dF&CRUZU01Xmrg7NnoZbM5%TPK82RnN|dW~}rOdXm{ z!`;l!M`vs6gWHQe+tw4Yn?A!sCvD%?&r3eb8(ATEXhiSx;Sjpsb9PJ}g?`%5^-gPj0i(KE6WZ?yW-A*VjwLH5M?iM8* zj{J@Pt;kZd-pJ!N-K_54+8P)+n9jB5Fr^i!lxMWHoc(&U(lq*q1GBt6&`V#5ZIN-; zOO^T+BgB6+u<7iKN~XZ9XUz^ZE_@XG?-c8J(P!0_r_n*0X;wnsQAH)P;|$5t0a|ko=MSI>@<5F)RtdX;(P6|&w491EV(Sk2>!k$wVeEDESbyO+CyLY&SI(7kC@ zJltJ9UHtG}`swRyV{>TTu$0WZ^Q`Xx%gy&;#PRUI zFJse0>FB~TG|9MT?;0tNc4vma^mc(oDf7*Zg#JiHLbR0f>Fn}e_aR@D+p>N525qWq zWsoYQKaI!sv-GI$&yQ#2a-JhYs~7>!G|VZ(>;vc%&{`;!yFQXb&FuSSp2Hai_83+; zGbarA`O2+dQ`~Q*Lld0X_$s_|cUZIWfCXaRe;@ zlAesx^SjZ{n9SJyO+`J6S1pC!xFU`}#P97e-OZrEm?E_Ni94B1`|gU8knngT07CQ53m#Y{fA{gppxYP1oI)VBmw zL)h$if*MJa!GB78T+!K1ml-*!g#pK(>_7Yh^cqy;7bg8*Q|q>dd1O~~S9;jlT;Fkf z!9t|P9BpJB4c1!p!)>mU7%U>)Yi_Nv!X=GDJ<;WbN~;J4H%qJQDtw&dj|Bzyf35<-*!(K zm|9qnir;vKNLBzxqVKU_5wQ&T$b@tOxW=A46WY{OGs5q=@dtA*?$_SM<>e(xfV_^* zV$4s!_!$?`{#7cCX!H zFmt1uw}UelYjT%kn^@Bvdz<&4+)MN)ldp-|x<+P`HZ0rE$^%TF#(ZqHcwmUBBHA3a z>xarBX|)Mwt@nMGvz~fq7Rahto?fN0Ot}pxU%qtL(eIP4A@58c@f@iqr=Iw==&oH) zww{QaVT@FshKg>^yp4_`Lp0_Ti1|f-Qc2*pAxEHXYCii-$Ds2bRrmrS)k?3a8 z5x{*U+c15W$*fA9o)Xns>1qucCJ$8 zVDh+d%FnEEkzbNdJlZldk>8JP9M1tozmD7LiyLS{pA#T~2;8rtcXxNYyLi_ znSl*d-qG=wLsMblw(8H@sUeOP+PAXO8JtXP#KJw746SI6G~WTrO9ffQ%-WZwM`&b$r`BPf z6KX$wXraVuA~^nxdP2W*;Nj!cM5rZ*3l@DyAZgOHCdq{`_*ijBVfZhxwt^;XhB0Bk zgtJ;oKw=pm&qD`n3}{eZA^9td_q7l8HRan$|HdEG(2zmrB?*C0V=>`;g5V1#3Sv~* zO;4_X>$HuhdOewBp>t?<*-;(Y`TZsQr%dhPjD1u{sK^>G!zgQ$!Hx7!0k7H;{m0fm za%lfV^X}2y?kP#&pb1=80b4-5!5pdr;T*)kQ3_8q{^L}r_|Ec^-gdKP%DHblou3#_ z@XZfV|5URR%H`sjQUsm;Z~e=|XM~?;R@ZCJS!GCXOf}=}7%3^dvu?3h^CChF1fC-y@>*x0=a+q~#<4f1_&KLCp%yVYN< zt-LjJi$6V@nwl6|kAJ1xwl`TX)B{unYzdK7Lni4=hCNfy#G@(I0UacWytX!7xPiI( zZX^NA#x3ABW|8*+g53PP23O{&9wTUKwSZpyne(vE4g=wf(@PdZhotEG+<@M71^5_% zQ(0A68Ai~>3`ReWzx0&Eq?L$2 zq<(y!+MWyLk`_kK&}Eqq4{^J$+p?Nv_f4=9;x{6s4O*)r-Rk@a3aTpSr+)0WnSBk+g%Nt zG5N5x!n|IZKH5?nb?D6_iriiC>RWsC1Ff;nbjA2ilXU|u%a62lsxeotjRkV7YBG5K zkzmNPsvG4<+|hSqQeCQm1G9pEU(uvW@ewd zFuWIufWbuO@b6z~P;x9(22e>-^C3LqqC8{ zG`GVyGdNBq;wsAF={O@b`9L}#xT~DE|LJGL@Y9XL%>10X1N4<}(I6`HxNlFvJ$p57 zFPx5Btn?p^D`U|gRKEOdV`XN`f=WB%cg8@IP2SWTNYM=lOn+jJ_Elo`Y z2_ly3GG9C1pZn^?i%Y}aG?O7(rP7f1h;ig$#G&Qi4u0+iZ}Kvj7^5-1ntLCOT@uYU zoTi@av-$ER;gRZ52{i*j99nK&9Tk=7-}@zg**gH@I_{;gLLQ5D-aBx~`idZXlI2`& z$ZIGr$E8hvpRxS-QS$1rG|O|`0A4DGI*b_g_{#zz2NGvh1HHgX60=_rpm!2tR5FAk z!&APVb(YV10nrnzEG46>lBfruL4 za>K=ku3mg(EYTZ+dS4%+k>1dSo{VD0qYMTHX7{}wnVfhNEWsCc;n4=_!>pOC(9zxX zrEDe3Pol_%s7Npa)dDwtaz+uMlWCKUEd#XbNF?Bld0u>g-6~tif)%D034V5J-gQY1 z5Kp=oOI6AxZ)u)gj&{fM1BlPh&yRT-S{~HPr$3WrNSgLaDSO(`r!(~`AVJ*S-B%tC zUBN`a*0W6q8XpNN4Yz*h5Ny$4a+tqy;_se~2{)`nGG$Y0tz(VpkEY*i$0{WjkFlVh z0eH6#%>8k3DUAsrcD+QdT7V+;4A|jk%9>VXY=zbomhL8{c^e3@p#Qf_$TkQ=Wl>5j z%@PACf&0-q!zXrvA(MSkTD_&LH5!KCZD&;ZydA{Ecnt3w|28qP!57&ft}%!HeOVW1nmA8Cj{BYfFJ{^Es;?{*!Adu%(bUig z==?2nocKZM^T#A!eDV0aGCc_ofjlVhJ5c2L{M6NXJNfes3Q7tucQRv%1SHgcyyecr z>7#>2w!UTl1c3zVKdMbMG`P&cO3wK=_dD`O*H%QrSf>FJ@E!6Jz3~nNs#2goM~Y!s4TLAKOyG%n16mbDij7IMZJt6%>vZs^X* zuLjvhAfR28a9t!^gjNQNn&ilgr)2;ROl5}Is&JZqYIA(<>qH94ZE;aOY3-<#*7sju zm%H59UN8^OD^_|J$z9IPGT~L$?B2hT1B6>MZ!^?XzN^#_GSt>x;NWfM9ahfl9vob_ zxHOrJ&<+d?EY|!eFtD&E#-FQeL6LHs8{Z8Tq-C)~Y-!4uTIOZpa}OL$D&4kT@GQ$b&9>N%6*NGH8Q|u&8jFW?4OGCyHY4fgIBBY+f1oMP4FNS z6Fh9-C^&5KP=d_Tl8*{BmNFPb%YP|~)Q8EswA>sO(*uZauD|B`KzdcADGR7_FqPB)GZIhWu~&!u7``yFo_fT5^;p}ARyrF zcXe6U>W*&y<@ck#;b7OjnA>&JnI}L<5?ZCrHW*oY^<^IgiV<3XA&iY0g`f7PmhlEn zSwEVaDxuBJBtV(gejw?xG0GSCN*G_d#d zyOT+66Go;cykenz>+=5cNMOtMUucxZ{HJ)c!_Vu=Qq~$51QG{EyZZbsOg@cp4kNF) zVgzOqhcD`9y6T*IP^w1^coUxagw&jP4v0Wh#iCqad&EX1mt|F@26)H&uJgU)bKl?m zb*XA@*3dzPhxED4EG{m_$76Bf8Pe)Snx`fA!o0?L6ct1&(~!i)w&L01AKm#`wrDan zf#aXyFCxJ8!8O(yH8X3rHzaeRlrIZose|qLM@eptX;yO?e7?IIu#{` zhp+eW4n)<{n(_;pD~=1rwY1wCWku<~8ML|7XOhM#hzO7S9w}W+qJw!Y z^XM&(D1((Mwv{z-%0>%K2$K|BTl>au(+PQtYrL)Y+3r+DZX{m)HgGz7;O&aWF7G0a z-3zWX((1^;>b_~^*I&?1XsD^RTJuciuY={j9K7sto5?DXAh)PVO{PslgGAsdo3X;3 zqdHczY-GHwQIElx_x*c)Jo)sd8wl7Gq*n;-)hZ+W=|*paIw0y zgTs@-ul&nqquuKn)X=1)3$zwCj)tSOQ`B^1DYaZ8^%)$JT00?kax5OF>%g%h8oEAX z{Inc|oxZbHdC#1>M(VdDJG$TdLWW!5I=f$_ocg2&-;bJM{jQ20%`)BCbyt@jCHhB0 zd3@6~@li5({@u8ewu2uw*UQ)U*7_e#ZsAj5&7AKN(2&5M!#`2ltW*)yjanggiZ!igdaMNn=+xYIB zRvc*G*AGA+fLa(l=Y}~!E=iw)Q*}O(`Tp?G0@lxW@*U@zm2QS6b9Zv4Eu&?T(y!>E z4vt&x5RdtGE^{aRn( zD;GA^ChiwdSicIpzfYIe54BAu#*cxim#{UGbRh+L5MNq{%7%l|%V6&%x;JUaFBfw% z3?d}c&#OD|5pUe0T0Auu!XB3Bgy_*A>3cNh0a}`hHU`-JEV{h6P)BDi9EO2!vDsrv zR78}Ff2l{nC*+ymb9G^D&M_UF28E;0>SB$Hde6ME+YYF6WDx%4+ z&9{~DBOIp8t+MTW{tOxT-aR0bElHMA&d}DEt6Nzfh55EGc$bk7ZU=LRVMrDcZYkrl zJ=`0N5MM2G-sZKQ1Mn?8XqpCBV^5Q8>eXs?~*L;$mI_&mEQ)XU5AW;pi}^E)ax+ij0DSqIyyP>G6S%jxH#u&}aL0 zrM_qVWJKUe>oHyb>jx#QuAFC-4!9XwT37`0k@j%nqt-VxJZ*9OjMJttOVa_=Ind6b z0yMNjt?H9Yq`dq!p3o1{i;q|kFa5`*2R?Q_$L?BGHYsM-RkYK9zz?t&eTg^!8Vjqa zNF~35?LycP6{1!snQ;eARaBA-6g1OH=1v`<(;uxdI{kPOlbQL$XO3VyUoj*(dz4B% z!@uZn#Ibf(qmVF#VV?R&5*afWF-x9LNd7DxL>8xe%Ab?tig%G7E+SmMr0FQ@lOZt{ zNnnvciuO>C%CE$^6hsp!=|nM+49jwm)v@XHV=bpPqu$$~6%mXVWgGP(sV~PFOTb(2 z|G0YCO_(lNmQYCU(O0n#*g!tXW-;M4>j5x1?asc=%L!HQW4QD}g zE3c-$F-5Fph=>`lB~^1!1a zZDoFZ^DN}-tOoT~Nh+gUg{*t@;)1AanDEM9pE@|ZK$?EO{y|>6&~ZAFIbupM&Rg8> zO*%J0@U#WuyWKrBU5qb3@h}hn6j$Xn!Ik+41ch}k{mMVS#Qlma6oBUYN&0)f{sFw1 zF_rA?n~9pj4K%7n#x59*H;7IDN7Y+K#nDCEqJ_Hz z3-0dj7TgK$65QPh79a$7w*UcxySqCC3GVI$hhVSr-FwG5uYS}RFdDjh*V=0@nQPAa zb#eCy_5ucYNA;eG;uXPW{m#Z1!&sg`cyiA;_0$_YG0G5h(Fof*{W37lMXMDRtof2%zG?JX#ljKK<5WmcBvAnrGjD5Nv4DV&& zdNM3oT6ineD!nf zd>kgn#9xIcEHAv)dHK`((A;XzT z-3wnhA8=#t)N-OG($fil%sv(2yptf$TKq*c!d~0NGLfxf1|6u_*81Am;isJKsS&EE zNk5DUp@wt=lYX4q)Nuc|g`vpYP-KA_iD-8q0AuiqWMWc=ml&64E0*wDoI7_$)6-GwAOlN=GHDWLCpq1|`j$jA z2Fp@;)P&7GOkUk=;k=cJ%B1nHJ6=CQmfbxI)g7G#lfT47raJeaqpvShMqz8zRivV7 zQ7guR5Z#;px^8&U-jaCh6P@+x9ip^5zoOJv>u%U{;*n9`(0KOA5EeWx1WD1Lbabjs z$#0PlxAfx}IGC|MK+zqC+%E#o9o(>~_s7vO&5wS_#P#FDcVN8m#rZVc82OJ6c2rX@ zGF$wTX)%YUU#n?(7>vdr(cV zr}?7hI@kFPck9OqQi?Bm@ee~dUtP5Z)T2NM3Q@4m*wRw0nddj{VS)z~5_X$j9&}J((u?8O6$#4PTqnP_d-HKL8AXK_>2PG20LIUA1ptbS1lj`|3;=jgU$K{3yYZFOgMl{0wXQ%O^zg?eN-Y?@d{E=w84V}d_G^Iq45z} z+#T!azy}#B;>{%q42R}}Hcgc(Fa$FW!bLWrM~)6oEx4yj^HtkP^0O%QK1lG@4B!>Y zn&_uUMRklOEs;;grq#wIYt2u8HG#oG<%f0k~f$Cnmb(jfUAHHr$a_jZoTjDX6Q6yfe$y;uRC}r}@%hpAx4h89{1rM0gQ=#X z;(T_0OYz|!zT^LYeccy?zZ3?!5aCEZSA*02_|gAn2mZ0>5ur-wvLk^bxpfv3WmTPs z07&@na|$+@|7oi24BgZ1UwXaX2fW>b13n2P7Ut$7mzbtur0|K>zw%_2wQI_?n$7ZL z%%)jqsXz$_#T)1HZPTzHWcfsN%4) z(%B<5`R1Y;l6VEmVcb0M7K=Fi`i1J+TO5R0t&%O%y123F=s6U@&ZVUwu=l9&PNpvb zSrW_AdJk&QJDeO{{v9Y&8fjmN8}v(qgCh}~`8vECkPR7c?U(o#QbR*&gZG6zo@Ly# z*%XMgR2v(kD#+?bSbUGoe#;5SU^qBS!Msc5RnqxL3HNtpt;T?+-Ga&Q_qc-23HlCI zVE+#>{Wza5@4cN`L4=`*>MXQ{InA2{d*C-Uv5>?%?_xm=06>Q|*3JN(V^PA?9UK&7 zH#|BiGHx(5Ad}R8iFu{cYa4Xf#ReN9`o#=JNs$(E@cVBY=nub68YpFlzoLW>-ZVMH zF_1dOD6RaqhJ%zq|Cyhk6nVYkLCAi{bP-(`>i!UxWlEfyE)fb zd@DaR4{q$#*ZxI>C@KC4ZRir2LlbV=4r&??H&LC<9qlRe3$W?5h%?DTqSv8h z>K{|zX8N%w?n5XteSf6rcZr8d<4)89sWDI$_j~beNb&vH-QReJ*Z$55<0m$rKT3d@@`kdPJYz`hBZ;!ce zEufA@Z?Bka0&ffmdANTC$IZbZa;_HcOOPfy18mAHIfx~t;;%)VmG)9a>STWdXLMse ze_kxnQqvT=o+c}PrdK34>^~<>O+$j}rbA^`>`;jimDJJI=|tc9Q3=GdrEyVy0D$_| zd?3zI4NvJWCp^YHYxwOK=?o}mLw(L^lV2Z4tm!}WcUFJ@G}2q%f4oJ@!iJS_M&9b@ z91y}|^>Z(=qNKv=G=`N^#fzPtg4sAiqP8@@4-=Epj;GAd2NvM{U~})B6^Ms1f^sPd ztra(0GOS;Q4@e;JLSVx0O8u^f6C(5flwQay4+S_AH~D%S_R=Fld~YVb6z{kFmyL(~ zp~H|iC6T6=$eQCHmV*R&VMIPZX#cL!ZCas-NHDBoqNh*OWNWFfPotCpIYB_#4Iw>| zwexEj)%zcsW$f(bAP+qZObb1BBm`NvC@{#2A3kI%NO^-@?Rk+`)w#|9QZL0pt9*>} zeYw@z3Yj4%`?%QkHXH<%j7v&;6o+t0$5yk-7}f6%Ajf4 ziZe@LFRlTdmiVBt{W^Z?eK$r9d!gM{@6y8$xi5JoImF;gH6Q0pbk=KJJ(GDKV4N0O zqH8uKN4Rsn-`riD{?!H?a8wb}jXE{XkEd_)<4-)iP+=q=!aQ$-q1b z5!feG@LX<@ z;8&R%b0(}8rt)8?_rGtre5RmwHtKgZb=@`>{%mk+QcgH(zyw5{68uW|G#G{VuUh|) z*I@178loFyQ{i@4)z;S+bl#T8`3H0b$(Yt0JZqo7q7V>!Z3eM%TOMkD!?=?k0C}7C zu0g<^$jmB{*0w6%6Et2jj_TfbL%emtYF zmAfS9f)=@4d_ol{nH!t)`LQ+Je9XRn{FgqO`!==i2hK$pJmwocVG-W+LRR0C@p^WHNtqcJZ*uB(MH{Y#}2;j?=OL>tqpWsEa!y+i~k-8<0cAfeL==^Qi zxJgOI=Hk+%R7633T=dz{-+AaH)ZNXXa2D>CxSEC;Ce;ThbcW6DQHnK<%%N%BSv zB?h0W$Cj=DN>8D^ywU+)$DYJ1O&9qeOQy7p>oQ#RtZaTp4PcJFg4|6fTBc;ob^4Y; zgODHB|6WWmb8N{r_7At<4O=eB|4#*03Zoa^$qAYk>iRRW zi4}ix!fh#er1N5}l>2Cu2?l_!SORR;T5Jg7L8XQ^WqQFf=H%5Nd$fKy+)ucd&i#3m zx7B@jHX$8*JExxNmP6FM6LTgiLmuzUTMmcz`cP)%J4xGG{Vo3|5s|@#|M8{13@47B zFixBd+RAt3R&Ljt}`6)XQ|~#;?C%Cq0h{j@@_xY|>(miWkVk9{E`P-&(X?(#%8fR+)R-h6vMVFBpJFU!vA0+x8Yx)(vH!(;A z($4cZtS+vtb%3PjlGefIOJ{eWFcy>6W?p^08#t3%78L*j4eu{D-as~6zuPjSv!f#& zH%DjZOK@2HG6?On@j|76{6e&u6rIxF2ucVkB`e2f2pfE{gE2ahVBIk z%)aBpO+0CzH%T2yb7F9gfRwht%uwkfOPPOm#mk}iJ&WGg>!jMT>%vkH(w^A0+eJy88W|t)$Gz5Q@ zRFm;&gYLkf44)oRlJbaw6|6?5Q`ll}p`H;SdGxsoF+tB@x6bhgGZJ*Z9B*hiT!;g) ziuV>;7Y&!;#~tUz3MPV5Nfj&m62&5R)V64Jc0s|*+4qK%=HLRCWn>cY#$;w?;p5@O zO5_VPIy%@o?mrHsn)`N0Vq=>}&3KXXadYQ^^wJ=A{mVsH^IOc?*%<+V3tVC~^TwDW z#}NBc#LM8H(a_V6!oq&#QhYkw+IhM&RQKEh=jj<47#`2>{r?UUSk}T_ID=@oJ~Tn6 z*x4iPyZFh;uboe8xz7_D&*>@^CbveBN=Hj|P%tpeV$4Ea>)86Sk<)lk1rrd!AHw!B zuC~w0-X2?QBKJ5i=*34%Ghow^wL*J&Ya*4$OP)0nsi`<|;acXZ&;k$F0)$y8+>IE%tQ#O0bCdrmn*8+EsBmqw-K|Sb09z~|*HlM2Tj)or@ z8XH?G8Ng*Y_L%}17HC0g922wv4l@;4_c@479l8YJh|ACw35Z0{#dv~ce70`&?I1>KMBuD`;Xp1V%3 z1W#!_53oG5eAwi`1L1NPNJh`2-QCqHK3fZ2!ZYig5P<+h3cA^RP(d4($1!o z1GZ~=8V^xY5XPam)|WMN!gH-56@6xU+S;wi%F*^U7_BRH#~W6ZSr|D{meT~Ms@>%w z$M>Rn=guG!QIOI7#>&&%yXH52#hz!{$A#CYPBA=`qMfBC>nfCUo%4vdrgMTik*e%b zamBJ|b;q;jY>kk)hJae8u9JKWDm+CcWn3LN3l^VGizajLTX5#Px`P$BHIK|x%xaQX zg!WMH%L+Pb{gFZ({1??teQdbHte%ZBHA-im{$++QDJY*w`1Z_=AB~W=`qWFZ0Nm>i4h~3;SR4;W1hYxK zYiE+esb(Qz?DS042!uh9ZB}fT@ktq)Zf!cO%T|$;ajn z=RhC?#s_}4G;h~LCQIT_xWt3Al84vU#Rk#m@0FBDgh@(SYR;|i(!3n#$zvyr95+60 z)*_NCN5PVuyu^l~x5DnWTep!T*_Zs}mPfka9xz1Pl8D*i%TcC&&&=WIXv@rWJ6hZ8 zoHb_d=}TBq5ltu^2oX2nhzcEez?bvhj{DO>rG0GIbx+q@7z=@Cwm`s#1-hwgXk0Lq z;`8jhcz#40>>ya-v0Gby-Hz-si;9j>%Hnsw>kfK}0w9c|-m!1MQ8+4x;Oc#O=7b{K z9ibudK5rqxKchz_e!iS%I(xB37W#i!0PZ&XWH(XDgvFKu$%KAv>0LfH?+F%h<>7H! z|IL~>NRAa9RKSTJ(7RS`UgJ3N<9c>?j(k2VadX|dP8RfcBF?cIVcs|`1e~~ssTM?T zM8CCJ1b5WyD)w7&GH@&bo4!JS1nd{g98Zikdzdc)R;=`f@FJJCw%#r7D->)G&z3&> zcc8)+?UlUv+KIRN|8jE%va4iSvfktKW4crc^U>CGgfTlf4H3h5Xbj9qM#gPdgi=z4 z6t1KCS2L+N6I2c4PZ=KlxaH=-@EwKDgg|%v`maB3rGvJ7)g{ATS78Ym`E0472VUE? z;i!?KbdkkepsC4Ge}okb`ir3_Uc!W%{I)@YtUdAEsJn1+&H@KGbkhEnpf%lYX?@%j zvk-PnQva#A4IlKxjg6*QxQ-iz3ODPJscrneX`X)yd5B!LA^+FUd%(reHaxrq+4Q49 z)`T+dwl!16jG#wN>9C!;IqMZ-#w2ABFH`S4|AMWM>xPeguRZ3;=lSA`Dh!wy3S$W# zYH>WBf;||ESVd?+(lTQ*Y9lzGEm3rto=EwW?(ucHTUlA@t=3f&i`Sr7QfW4adaCs; zk}RaMqU7-lgy`+c*lqZwvADS8E0A*lKlBa~HB6|fx?txt7>yVlyeKUyo~`Zs6siv$ zR53?QzCu-8TN|~*TRa^8B$b#-V`sJ zMxt0@H++^{uzhU|Hw{{tXD?2(#9$lobeo2x^2L2&^+A8o6qEZmZ#2rxqfW!VYNo;V zJ*TB91Rj?_80Od^jHcn{$T@Y>KtGW%2_ns03gS~oW`qLdK{Y&Hs82R^!Ei(dkGtj} zI?3|6eMwrbxfw{m0(bAgNDe)U!~}d-wU~339iF2dc=q+wNb>oy9u7SeKQGrt>(ufU zlyPKpMsv8<#L0+e=cpZZ@syltT_8h;yjU@+sTo~j!y?L+mxt8aPVwMwjy6i2#7zkT zgL+o{$xi8-5`Q$553}=X5Z1Q#E^XQIGRS~Z_W9p&%h#iD8sha@^Mb*5inB05 zaK_`qq^z~$k`LEgA$fT!{2Ky8M{e+tj{OwyabAMXr(TVTl8TDIixexsiEhQ{TQ#*0 zfLFne9Vx4U>M=#s_=2N0L-q_f@RtMrwZQ^jFi4_wdFR&#;vKb0)po9Zup~RPg!Emd zwtHA{C)bCG0;D&Y^q0v*&W#P#dUsPc8(e!N?zCL3u2h^s3??k1hL#@%_j=`L1& z+a2Sd|LjK2yY&f_TFo0aDMnUBRAk^RRNeV%u$}SQ0>F(7ojaa&xvh5r1YbL75!B9hf-|5BsP}kQMJf>V^n99tAN5_i*8`=9DaGQ*=4& zpr811HnzF8>L4=}0}qxw>a|UHn6?y2T0Dzs8+=Fd+PbQfuY8bmCObTp`=F>PV+DI1 zJfw2YYTZYYRT+$NYR)=ZL_%xYnmt{a-NrbTx~gmeT_l$=jp)LI9aQVkNovkqHA-mi z1zw)114?Ai2JC%@;-pBQQM)o%`!ZL&COoKU_IMi9x<7|XMz8ez=2BK8WX_u5uDT&K z9;v+pGl&ftyfLDn5jV`l>*b7}gmYy6q6}(g6eO!IoNpB13wyN1+q2Y1g61BF1 zASB3Z^7A1jRY1wlfSaAS$+ZU4CyN-pwBn2NBLZApHixDLZoP7D9Ziq~$NBJ&3IGpX zq@2b3vS^AnK19L1Ja)Vr<+8c{VmWz3$nS;)3=UF*M7!@n(Ml2h648ErT7Cgc2b=P^ zAA1b$21eM-4&)gx2T!sjg7e5_+&pd5dqOaxJ-cUu@`hKY?48ePD4|%ue9KXAk15%f z+g+dN0jJ%aflVmGjK0i5#kT=BeS#dd8N>-cFAjC=wBra$;K4cIpv#lkFjoA-|8giM zsYITec*s!-v}84l%rfMuMu9*d>ZcBATEGA3u} zv%_uc5bURq>V7D|eYq0-*eI)CV^A-fCAkZY${WK9HuSQ;l-5~E#r~+5(e0|m8?@5B zz?EN8$eQgHxE4c07M)EmuUQJAx8?N?cR;WX)m1>MgG}nt7mKv4WjXk$TK6qWN8fA2 zmS3I@3)sdJLJu`*OADxSRy@{MjkLT;607jmo2MJ6=Aybt=E|G{zIRinX;vO3s9IUQ zc2H%^XIlvKU|T}xsApp@L6fnNCTm((qC}V0jr=@zMf3=t%Iz~nHo@~_F1aN1Di?d@ zHpLT4(edJ$rMs3^mo#-iVqxY}k~EF47sfPt`?>|6S7vAC6vf-oeaXnLF%ibS*5bZb z6U8P44cTD-U$)RXnrdorQshY=UV>PJuDKLv z#ay@6JA>5e?HTVMBkng^1Oj&BDQGwqIrzVvt+n-;q;M+Qf=81Zzex=*KONaHtWWfRY{#mE!5T8FR+Bwj zQHsS;GZrF5&Bsd?V>=;%U2$}w(ZWSFPc{^m`T8B1TOwYX&RJ-Rs#So~K>kSl96Mie zR*y!Lof(n^#}RKM1Wm@XLnFx)xbORER$VmLzbn}aq;|MdbJer>!x zS%bqFd&U_jCn{CTs+2gkm=N`3+Zh?xRBDJAGHYz_`C8;HF=hTAXWb_=vsK)DT9BNI z7`&dYm0w00&oWbB--+c7PX)Y|Ng`2=+{~$6fQo;kBp%OR9^5tM<65e!j1hw7>YV8r znJ3CQf>1zqwopL{m@Kg8KIcSSoSG6sP}^y?GW_=oXQ?N4{9o*TyfI zajQCghV)=svDyDya_5wR`ict^7`$f8)6=J@WjWUJxlcu82)EySpVMe1Ra+GTk~Q%M z@Now=8&dguDQl+t1HZ-puG+Y}FD*b7GMPt}&;Nz^R~S63khetUCFYGOTh&(Av}w|d zAw1Kyhp|xiHcnW27P#=aNoVo9J1P#Ss;vd3I)D8-OwD;bKD9ecfPhXMsdqLVD;B<; z-tfEFc^ng%x{Hc7AH(`67vOrh81Q;<4Hm=>LB+F%cbcr^?}qj%-lghnKmdUUkDeVT zAiKR?Rqlen>&>4n(^e&zPXkuvm9yP*tMoc>z)$B-;pJsC7rD1Ta|MnMloVXvi>>xJ z@GhcU{neaqJ|FisPbo@ZK*g*wnm`H)bFuWeM}RSGcXH=Gsbg+0;)QHs$5{BL^od(G zx?DUtlcC<_sdTfEonMfF;L|*s{pwTCozTJ!?*BRjbqCC~JbytyHSl5ltC!}Tuq2rP z01gdc#{vVapVdx{OGHGjy^p34g_nkxt~GGNWi}ev%*$FTDm^JoXZf_+t6 zX>4S5cGbo*L8E6(n`KbSktS~`fV67!&<>Yv*isv+1Go>gDlKHid$HOG;)aLu813Xu z_7$lu(TJu8t9aPI-A13Y%7(rp4G|rpL@5+4>;?w=BBXTcrk>}%o^em#uoMTlD#k+p z-}>>tMKNECD3<<5eG@XT#L+f*1G#gTr}7|c(Fzy1L5nI@W#Hx;-KtV% ziOiJt&)72N0YqtoyJj0|BNkdZhZ}xg8fOQn{M`vDA9L-oAlJl<`bq~NOB<8JLZSia z-%1Z4tpTrQf76yVzay0Y`I=;I4F)5(0spzOrf&uQ%!FyH>RN!Y&>~93Ky{bTtFRaV zPsYl@ad6oT{lQqO9wLy98eR;{2^<7kD_Pq75@pSh*uL3?e>5j*d!b5U zx4uFj&qEYD&FBBla2WmO^qV?A%j9WFPV$O|7AIx(d)AhAP|)#4Xu1kr1d$Env?w3o zAvOa6;8PT_@Ml4uQz#OzW1?80@1;qqHVqkkF+ev%72)604ZrDO1ws+$zkV0KGj`l8 zYoYl+6Lc~hW2>LzSz$dlIxZR(4Bz$`!T?f?XvzGVn59>RMoy*gGFGz8+)}PSB4b)ep`@iij`6YqH{j%q#r*&5s zn;SFZAGRJYYpAgQ%Z~mn**aqkdTg?%j#uPJnvdT1BSx}WCpqQe)J{lTFo6}&(Q7ua zgOYQ{L9$zJgaBv@J=K{+ihrKmBx|8|T#b^&4r%BfGcf-7IQab9Jv`jZ_PxFR=Dh8` z2K$5_Hwey#vlkExq>*BYxV#*hoOB(8uUl$&9l~i^Nmd#wEm}Fl0RSz(@ z)fOb7gTJL^3`X92zrb2&r2g8sM4GAR>w~wKt+0!Y`Wp9!YA8_3I@jl3Kq*TQ(}3?V zZgyT*U@LdayR&t)xO7=An*|@qYItgT?|fS_v9A0$K|qWUPKm=gqb7Pl@}}J~Sp#I< zN#8SZ@feA|o~9`1am#`fEeYm8Sc*VpK@+nI#r>r^M8lV{kShM0tgu?4mykYYd+{=^G91nn4IQ{ z_O)>sQ!u+_5&#$9fv_b70_1<1Wgq#ANCJGm_xeWFwufYlP4Ja^pCqA7lh|NId51eohy~W!1OzNsE32w1%gQXG(iOf?B1Ey79=FxcEv(Pm z^%I%t2)pc>d3tVuzyo)=_r&tl6mNgRSWu9oKELLQ?6~lyZV0gU213}a&;9+=ckg!~ zAfo-^Y5tRz1vc>YL)X*^9TT0t^j+INP=88et>2XQ*GMP%SQPNbU=* z_%mZlX4x7###PPUw_4J?UG6fR`2Eu+`M+n};rv%;xR77T9Fh8=di80wbx1+gs~p4^ zARQOpn!|q6LL0Z1Km`Vi(~o|-<0Q!$p7GEWc(Qu>rchR3+T>a}#uFv1#EyKRA)obf zW-6Ar*)nXzZMuCMRMD1}8Vm~?;ylaOPo<5}(AbL=dHt2BEC^j4=kdo&pM%5IYzgun zMDgLGLw-N`J6%AOK>1HL=y{Szk2hz^49i$OL1K^=JqG-wOO1ZB)22itW^(8c)6?P0 z%k&@6u_Q+}ScjZL(7pZhR?ZZPIV|e>udg}!k#SkY;Gw*(!o&Fa`F(xiqI{u0I4#;g z>dm@m$P~4;!j_eO)<_nvqa00-^k^#2E_6EzsjsU~aN;>+& zkE$iy;)DuZ*8u{Vs8T!PnS>DmQx*1f(v~o$tB*(fgA{K3AJ%ZTbvOQ!=+T!a$c#fu z!;k;K%oTXO@;N60d452(@KckL5j2?P(vSg$trFV676iXAN6A-CfYnF5_b|)6!zXSi1BGL{jd>%u;YySaORJpid zh2NX@=B_Ab)<=%g%9ALF_H}~0R)veMIuqZH$er(tWJOq|hh;`9QRrd|Y7Lg3)`iIG zTCkuhl8(|{s;u8&nK9_lCH%=wx&e6Bz%Ua2YRjp+o}T!ip!n`xH>nhuAeKMP1Oz7p zna5*tkr42>2J`^_v8^zed5-_!AROY$@=(EYWukG(qyo1U+udQo{f6tkupAwfm92dq ze=?=BmzOG5^HnW5>A2Mg=X(QRAqOq?WNJ~wNN{AXthRRi8;j`rU}OXmcmdz@YfqJ5 zcl(aiGj>1gx5v~1-fe*vVwqUa->EJ zF5ouh>V|UrDqZ!qcRJ*wS7?9#-oxmEqO~Tfi&yy18AR)DU1!~N%k|p|0^lMe{M1rc z6J(CB=J0mvaSwa%LqrFIR!^h8quzOrB@y@H6WhDoV1KHX-51ym=7|P zyT{%@P<2|HvT%x$GlM60=pAh}0@y;GBpAnK1!Bw`X|Vr`jGc4U80!&Qy!kaO$-Ao2 zvc)J1Cn!0wgYn_l|B0h4&FUVn1H6Hubt*)FO+B2)a30EwvGHfh1@qqczHev#MiF7>!!XRhJOt z|LhGj1yu^(0HG|Lq52XK#q&Lnd-Dotp0s=-xhMw((|-#b8&o96NPGT$Jq{maYM2cF zxPM@25!G7eq#GbV7LKe@GbK^aMq&NEX^e=LdOU z7-JOoy%KePT;#pjkkB_V2Z2aWIJ@aPJk#28M!T(T0(sPAML6*hGwOx#;GJeBy$sDM z{;Z5`%~5__LMrSilO~FK>c=hdYdxkGgMIyn?#sH@vg#iE_lf)RGZwU#*>9q5)dIc+ zbN+&EtPG(YjrlW;9xK( z0=iXBfWRO}l=39^&53qn-!ebXf3IhTd(9RHA3;;-0Usm~HWg;bC!lA{I#XF&OM#*`Y0^k`1sUH5Itpr{J=f4ajscT zC?TGClTY;+Yi<6t+PyeTV zAx-{7?N?hUu|tc!M)XLTn8%*}U{OYjo$y_=;tuCF>-?uzs3w(sOfl_7o8Hd`p^x{e zH7Wtr6pmJvc^MWr9i&T$9Fh0E`>qJxKUMaFjx$tBKlxA-MpNSx(5ERyK?lc6RxeQ+ z8=If5w&c~;lBdq18khG#KtNKqDFWZ$8(*tFXG*}bu)A|waJg$^56v@jBh+L{std2;~ij}zuxbDGNQmd!h`=p}M| z(cWbdJVgJ0>ed%cXE7t`_*z@3%5VGh=ScrTp~DQsXL{DV-o;yC#1LjCFV1GG@VaSh zh9;HJQL?3m9vEO&y6772k42}GJelKu@=p_{hRTb}f1C3J<-cQji}hM+BP=&JC!XuC zlkX?rER!Xe%pY`PPFZ)J;VHz<}WScuUf4ZL>4`1 z`a8TBvNjhjLMtfszXk~|VH7Pl_)gz67Ro7I1j%G|0=A-$?$=db50!FNT7uaBIcoX4 z?$?v*w?efKb;IG13miBXxKV+N6nPu$fWp4#?i}( zK3(<3OzI6}Y<}XVdD~o<1Dtfdz>LK0J%K-gaX> zx=f!(NRTsSgw~^MZt-KhL4D(2m?(%@u7WU0L5#90roxQYQyJ85y;J_*&i?n6+&Kqk zk|<$2>n1$FxBTzcK2t66MS~IQx<&jbp*yc5o0Df1SlUAb2d5sHD`&=0AYN~gAre%3 za4gTyUv#J|_x~;~{`%Yu=7}`lo@;f&YH%-yYM4=55xo+BQ0@%c3$bh)dn5TLJ7>yL z_C@iepOf0(e^H4dTktoD-$`7ptUWdL?}S_b-8i16xPBT~;9vP`RHOBK!#Cp7uOzo$ zhL97Q$LY1kX}{b~4o=YjhS)5u*&*>*bKr6&S@C!e2n23@?3{az*cFUx2(hxZ5? zPu0gh)4EkV)zkmXoAYM+l-u~^aKFc*LN4e3geD(uz94e3O+^fbt9g2TdVdJX#13JN zvrdV#r&MZC!*n$a2u(3W86;}{NX|ODz^AdDqxRx7VydgXy?|AzVJrJn0#N*HP zx>5W^xanq-+flqkqu9=k+CamMO)5jO(ztVR*%S3Cz{RAsT-3)ctg2?tqg><)oC*X1 zPH^1VI#f9a-@+**J$i=OK3@#)-p9h6T5R>4b>7K6nQ8minEu^#q=73=m{{p(iA;fs zk%5E=G?OC8RaAqmx*ZQqJQgB|ERA4#Pn|eLboX{OJ}$n}UPvs9QT>D_)P=&*5o-m)A3`rc7##^u1_h<-qbfct|^7~ieTk9rP9SGW6W3#*+9s{k1+c{ zF`Dfp{rifb2|jL~bh-45@Bd)|=)nrA))~a0F{9X6HmQEcbryxIi){%Epad;-m%I>Q z_w>4IAgggX)Td>y{9itGhyw~+6&0az8(b7Lzq1|*bzI07*G~d@W+m+zZHTLS%E6R1 zPY>}QUQVl523bE%fgYd9Sspvo0vNVpOqn#qw4+4i%r22iJZnGkUBk)Q0RaCczNcP- z+2qg^5#RdC26BPIriOW#>l2^y_V}_x+=$mrtL~E&;n$D$Y9%OuS5Et93+j}4u)8HE z2;rnt8$1=&-xP{ISDP90I7<zh;ckD?p{>0{T-lx;qEYB-SC#1kX=Ag%mj(rDn_IYPC z;D8O`zYre_c&@=N`(SrDy#=4Hgx}#9h)xPUgYWuB>p*-wI~sN8Pp8kFOvxGyfcSgJ zG>_snFHx=FWov-SCd@`6$m9 z7!O~M(??CxzE_J{Hf+U8G?mj|?&3Q3m9b1Ht29_;W80XAm(uH}^JSVYPnkOhaG0@$ zfjH;YYyj3V-;Voo`QVry`X+EK?)P?j9V*BhEO0o@OFMXsEhDpoZa4~79I>`8n=gaXU&?-mD!9Io*M zX6QIF6rl@T7OdKTIkY;uHuegdio(<4Ljk#ZSFH+w@mv;bB85PQ})#u-HIsV7Nj-R=~pIbrtb| zaZEU}bn~<3e>iy3{Mqx#Q*x~n9~Pi^w>hks;La+XkIS>4umm@Txv2L6V$&{8zBE$n z-DBuBdQwl1gAJvmBr&mLixp)$2^5e7>B;4(JL_Xdi$fAM1Zz^$gA4GUWKF^r7xZkE zdtU9Asi6yVY4Hjr7SVIPPp{b1RE{j(oy2fSju6}%8@K3P+mcbHoFT|VOh%;gOV1vTl{6JNk4EcA3VWuaEHj?xJ-7c=ymNFsk%eZvNzwDR>sy1xKes_29$G7q6g1 zIjd$p*}qhFdWYZEvFuP)qu0(eKX4NsFX2LNy?SSNm6la>qwe!}_~zzh)<>>MV;TI8 zNkp`IjT;|q*s)0>{;g1uwhz7irA}7#fA4)!pQ4i*V-!)!>BWdk5>-sCCL54oJ+5iZ z;jeN>-&QfxID^CizIPO5)QW1}u7mTz2EjQZg9=#pfVyC=x}*$88HDUYrIfiCZd!3Wnd@4#TR9~tl(Da4mP&ZMkZIc@9^ zemQ2;>c_`;uzrtGfG|zQf0F(0nZI5c2A^ExM1Xs`0`w-RI&r`iXCP&6WE^o#={SuGUc3x(Er>j#9?|+yA=L+7$~X zY?lCO85S@O2?r$A_8d`8#TzI(2wxB^94gRP{JNvhyacd`z>i4Ay3UCap0s4=^U%|g zN~o{0wMNd9eFO?EVVkd4o|EZlo*a*A;%|6+blY$({7zPUu*}Gyk8Z>|306IJ(&md9 zpOhS;`O?5uXsfTH(f}sZtFhr!nDvLS62Piv=P&9-N~Pham0}gJ2ToatDF&tul#H$k z^2Mx}S~La6R%!EIys4oq^+?>9(g#nh@Pr>>@sbDG`Ay4*nJa6Ff@om4KV-k{DC6y< zo$s0humBAW1pEQRO|oXI#JgT=uWA%%R0)n@e7lMe5SoKTClxXMX`exex~|zNB^!d$ zoF8A6o!-C)0HH`VGIu}WgNm1NHo8XSA--FtM2?I(lHOko0$6^R9cKe`AXg%?(-Zws zkHeoOzU$1k(UabKL1Il?B&sTL)>_oOADYIP#FdT#ofmVN%bfoLp|3g9a9td{uQLxb zZDw(aue+-yd;shFbUoo2)#?`G7JIW2goZbQ7tnt!4s6VW`{xh<;yUTL{J&2(O~ElJ zuPAo%FFlcT$TzXR{N)6k$QSOyxi5$>umxu%VLQ3d&k+ckgwAs81KR8h<8|du{)Sbq z#-6=dwmDX@+!tV|w7$~$vTThAZM0e5NEbkD5D#yB5u}lR$`3MvVg9@$wx;HujHcE3 zxHEs53VcakyNI-_z zdN$Y5g}X8f9)fj$E-aUX__1d=f3Ic4xHmB+wmxaS;lWq&Gwu4z<9Q*$I1^`!g6HR# zm{k|9qMWy;YYrL?Gd>N{pXeVrl*%z@h^i?>}C3vp-KrsUW*ymd9Ogt}5WlyYS zq83>SSit2FEk3qnKVojVXrF`M(#nW4K+Q!v=0+-NB~%Y-MR=)EZVwn-+-!myGQ`!p z$rv5C*jJjuYmy9Gdx)ACvp0*k{s3itH$hhy6H2zn;~$r(?T;)xECdPKW^3zWU=)z|`_n1}nOi74L}E8Y zAivSvhg}5e?oay$^L9VJo6?r5HI^*X{ecF|qW6kOEldyrtO>2J!#@=^!^02YML{X0 zb-2Bf>Ty@I4cOQzCIrES&ANH7ib9wKmB}EsG)0@1o}Qlyfk{4;JBv}acyy))rp_7# z?$^=u?BH>4dPkKt_nfB?WMIc!cVJ}0N2pMY-7#s)<=_6!QVy)wiId06QFGk7@7dyg zewK(0aDfFB5=!!W^|b##qTV^YuI`H#-f7S@wv9Hn-LO%^#Jw9-I@j8STAPWL8rmC+>^6{0nJh_4nr+>@Es?!&9o(seY&W|;)a4H-X2CzBSC{YFs)a=)M`+MOgQM9^u(*Ny z^WK&-vw1$WB>dpfaM3++gN)bj=dvfDgf}ir<4QMwjk+oqN6kkfPSvJdj> z9wt1FOiSHaP@i;iGIYZjl%$zyd#w0>bM$HDby0s%l=Qj0iEM3sVB{$KqlEjg(Ldfn zT6=gyVXr3eAox{Pj%=TelR_~0%SaN7`Xtigy@l8}w(6#vJ+tI_f)GzMhXAcIE z1b>Rw6uf#o^kZ&(vV0a?Ray%~lt9|bBKRRKA;H_#4@ys^gyVyOaetzWQA0qGP`u$T0F~P$nhf$5< zTV7We+rs#^(OjYZxKp3XoJVy2%J7tQrsi59w*M;LYt{Q?oI>6$@TRYd_QlDM;sX>g zNrNal6Z7XKB({J5mr(fJ&zl2PV%J8R>q^zkEC3eXVlt$nWX7<$7dg~y{VsX35W#%Wm#kiG>#-OlzX9fTS&GLplq^-@u6Mx z>|s>5jmPy-nT&w!mjectN=>cxd`q3(6X=;d?s$9X<6ZT(9sKMxl*GyR92I#$a!z1% zo=^xc8VI%Jh0OyVT+c7EWIzFgm&L?(!V$y4qeqKvx@-%|gx)vDKDTLn;_;md1>0K!fo_~FSMNFU$P@Q%=Jw4m_we4FLG?}O@ZxVoDJcEf&lYwmR-PXtzw;0Ut zn5wfd9!dgIe=N<6p4t^vXaF4e>-?w9XXF^XR6J)wKfubxrPLljN$Cy{4pkclA@|8W z>wb!h(4C#mpw{#+*$oC+Unym`7xJ>B1j?JJI94wso=N-d$BN8=e z@rBGjb|=@6LdS`n6;+ei;-7wn*Vm?B%h-+t9}c%c+?lH{t4NFR_voziI<3vADj5jg zP8ds7-*Oh#&LH>kG+OgH*8IX({6GtDSbSBLB3*^l>tKHnT?;0N(vNeA8u-Oo##KlQ z0@PPdcmc1LX7^8BLr9vUWBYl64vjZiB{_F=5oF=ddPWPyke}?Ol`x{qzBVRm8NXMd z^Q>v8Ket&a@O4$b}`!`zsl_YdlJoTr<7yxns> z_yjnjOKECh`6|ZJ0>A@Zd~fa~CHu%{RMvD=xHtHJSd8hOyxQsPV=DC6G}9Mi=j0|V zHk*<3*DU2DYalFvEL_CeT;e^MknJMMzaqymJ*+%855@k=i=bOl1yEo_T;otr-~vF}}BeYf0q zrc3DFBm=MZc%Jw3aAB&i_%qlR5@AMt5IFzPL&R$Wbk|uuIEi|ayf74_(2an`slxCj@|04KOw5! zvqU?H9D|Q-+84M97MbGS_2ZPEQ==t(*fgF>7mF^M>OV@I(Uf?|r8M+gRnzQ0Nu^C- zb))cMAvgu7*dp1h7p|#m+j|7JEHVV{j4#N8H(BqFncjKjj5W|1+qq(^oe{2lIJ1~5I78a;rr;~^Qnh|~+3CF&oKmmn z_1v(;zQpIb_9=P`*+SyZ6e;#799>x79`UUI#OL7o(UBuYP;ayC)8VSN3$$h`H**!$ zksbpJr+4|p%=RBR3jUJ!I`H6c3*HT@Zdu$3y6oK*d}zi}i*YKCQ$JeMw6!ATP6$hl z)Vc2!I};-pB%p36>Q=E~eZ_PJ;k!@?;JWMa*TJck(md+Z2w&2WLJuSAAP>HJa~G&f ziHoe=)=>BhKhleswJP~~fs)GRonB$48P#Jt!RlTu$n!es`kIx>!}smtHY7(|!=|-P z9#pPuom^?)NF6C12VEnozbzg~7mG|4yuA$0D|rlQ(46p*PQ)y-W4(=%zRg>?+g9zh zxWwQ`V@1Wp`RMPA!rYDV{OEfkcd5f>k6j3}e%xb03SF-VHL=Txz2C*lJAj>I#yClm z!Fl;e1^K4sZpPzes!59S8w!c!iL|M4UW)oCNhScju#Z9f&mnT8toC0SP~Kct=`h5G z5Sqx(oLa`v@gW&-$j+ePz3F#=0zmmpRGjhVi%vWgP&gWce^4m@Yup{Y0r+E-Z*I2< zBr8$;l=;$p>mns~g<9p7BQa22GfO|hL$^tP3kaDXPzIFbtu!s71z+P6?hOrsrW{&- z9D|GWtvIf3tw$J%4{vMFw8{)cRljTp%WmQr_UYUQM>*v$k1JN$Mbiu^b&2@-`OSLO zCDCDRMXvg-y~%$zU&uHklqz;fCAu`Rt)bp1EzKP8bcc|7Q7v z62_2BNgRQ)h2uIP!&R!k6p{COIn~B}pK@`v2c)~rowl5LR#xWB+&{NRS=rcE=UKWN z{Y9B{etJFaYQsI?!N(!UH(On=J?H$oOd9V5)PplaU&BKQuN-K-sKAl&2U&(vRPlxL zg|Bb^tztvAK7G80OB$3AZH6G`XwXgK52WqJ@J*hYI>X2L3*!FJ{$AHu=i~geA1ML0 zoBi}@o=)}(%lgkf7tiLZtHZVrNA#z0{)0xh7EiTpE3%E}iw=81jeBWt|D*5Mqo?PG+}vb@Z?)wc z3=?*ekV@d;p6h^gNK#X&Tv+(@qJUSB9XGA-zHB}A!hgk=MYGZvTOQgVgINUJ}_&-``{map|-nj3j@C<->-?j`*swV=rS9#s*IO5 zy=$>VWO4K+*2c3uf74Q`EjaHVmu@nOlsOR~XVt%e^K{XH&w#J-etR278Y24MjkEl zx>qM(x|L5V*!>ab53LzGGHXy}TkGOgN88$)Ai{cDWn&qQ3846g#fk&xx2`iyxmev) z`H*|n0XA=A&Q7NSB^jZsYB5#Jd0Qfc7e_|7^Tn4-b}boa0P z^kby?|edDIXo0H9E*@x)h zi9HEb5|`g(lMA+K-^K>oSlTvT5HGrfEe|%2LQj%T2$3m9TbrinU7>c!KFIn{KSBaj z?uH609*3LG?2lwEtzXW}T#_FTspaZEtsWoOjn(>;Xg^p{MG_LM_Vy8HG{@??mgFuk z=F&`cLh@c7f9X#79f?mHhEKGJ;*&d}u{di{RkJAW!?}1R$RB*-wtYN$cB-s9S=J^& z0&w5?=SleQ=NM+7ItH&!MKi!uSl7Go>}c%TXYWoV?a}ydF6{ujyBnv4 z!~n==WH~OZldbPedviMT5#T*<5k&9;pPc5^Y^ujI@Kydp6dMM9$jRdBhc{K9rMr|h zWUq_h)|Zvjx)bV<5PRd+2tz6$C`hfhLJCVkfhYy>$gNR|TEmX?lw}~@^bkz;Ry2Q=cU#f zI|Bm_46L}x*7EVM)ktL@aNtORwjuWKmrwvsaqW`8uceYSR+%#yg$8RHL7$seCoH|eKE<_Da zTW{`rfp25)iC=dETVGDJIl(*FJ1c)Nk5bb$Z_a9ltIz`F1a()tNzzA$Oulr+#dZ9c zLE-uO2pRds6Guy>ZX#~dbf3yBwsvz@Jj?e zVQ<~D3350n z(pXYos$*NC}GLQfZ@ zbaP9i zC!|A+t7b=KLz3;$MCU%TS5~3*nEenWjxW$aN<=<4&yMM$Ol5c1fbL*Hi(%-mKsX&K zQlWe$kz`H(;pguP!LWiM&w3v1!(Q_0H?5{}0pXXYqb(W; zF=f<|b?hYnf6uvlXXsyX;Fs$kC>C90?#^_;lH^XUqHD74LVkEeZ)>Xa;&Fr>x2rFE zyvt~<;;D||`O@n8sVHb2_0cDmiV}SLrM#ud5M-&_Smie*Cr=hOOgtZbt(A4BTUbgI zSg6h;NHWlU1(sHyfrMt`?bc#w@2v1Cucb$fL$;08)vA39QLJu8jkvjDQ^{qTDwc#y zfo})12c8_>F9-n;r@vYc-*Gvm(=)%mN0&uUrl2%h>pENeOWk$nBh`+sKv zPOn^Mu+-c_Q%f4w*V1De<+TWQf0Fg3D+bn%=RyDnKgMbW$zm64!h2wD$e`YBROXat zKm(9@VsSsPVSdk8h$fKd{S=9IaJbS)F`4RZ3=7vGhx(~MVla#JYmN+OsFDuCmrn9x zkdCe|p1tNTA(BD>s;bc-J~W__QV@v(+zV%3=6N>nJ+~*YN@)iltzIB`=#%#17!H?P z8B0r_Q|_ zXUAb=HvNoc#mn^rDr&I69?z`=IckKsc&g5Pmxlf%MJmaPgL;xl`gDwSdF!y$&b|(! z+xrnFPH@)p&U0%6+4C$=*Yz>M=d}|wJI1I2R}QLExcpaaCZ<$AyS1kV1gTLmOYbLR z(t|!%SB_#VA)KPH+1=}zBou$CyMkrt%*sDXrzdwX;^-6m&$O4;CAiXjIJDun^tboh z*B$1~uV|#x6}K3LXC*3fUtMH$w;LV(c_f<1PgIlrX`6XAx=8(V8qkC52<{TH^PNYU zEGqA1l-pV~2r*SGjdz=NXXxQ?vGT>}skcu?m3;6MLhmJ>6Y%oH(9j@kDeVNUtDgBE z{O2%KR+MHg%jlPgR&!~`=`HEY-eJ0^81cx9$RQPgW<0BjJ&BpO{56LI!EKZ>7~5Yq zRbsR3KU#-ZOsaW$+4ZDg$|7@EzZ}kDoW&VW-0K-G%8J2a9@EQ@4LELAGPMXEm=w6F z%I3yJoFHjL-)Eq<9nWas0{Pw&H$TMC@wM(4B}Lv_xP;6YZ2EtwdCuH`L^R*wg`<3u ziowH$+wuWJUB@R<{$Ijs79bH(fO@A-2?Enp=q2bU_Svnpmap!9ln|Q1M>(z{F7HH~ zfe02s;v)M~VH~{7lPIFd1>GR~)tQH30w=}jQx?L{FuYz@(iU=pp3E@Qm&~{vM*`!C zs5~Rn^o#0E)`(l|fXAnYco*(tqg0 z3uHQMlP_#7Nx0u=lD~p?r?d2;D&(U4t!4wR)A*PkQf@^2ELEPS1;~EdE=gfP5cYFEA5U{OV%e5Idqab3nISh;e)dOS{8?Lk|{l6bKR@ z+g2P5Cx0HVU>((TC9?fPAwnQO9BNYWyK%?ygec|Hxg(df=gUmq{$eKG?)mJ;qSi0O zocMpaxs-f#UwVp5cT;eGwgU2QsyRHbggEfsHK?Vm!Q*AUr2}gzX*tBBow3XEESJkc zEWwm?!|)-Pq9In9hpASWFc9gd{7#?RTv;k4vmgxpnUByU_u-sYSJgV;xoOUP&R!p% z4jo)}3%iyEiP$~U^$%8BAJy=tT&+r5AMiHHu-aA*T&$Km05C~B*|l%;m#ddnK=?|#`-Fr;FoGM1nGfnwoa zF8Lk)5v`?FZ7fkO2P@#Q9ZN?$|JGJ5$SYJ^H#1T&MUhCU=*OcGgwSckGF>=zz~D+0 zzN$9VC-kRF9*-@t!+zVLM$EVU>wURX~Vi(VrlT3s{KKH=b0{_&mYZ%MvFB-VQ9P?tb$N z+C6o)0t0X)K5nm+VU^kGm8Bb-v$7Vvd|LakG2Q_AG^D9vJuYvO6R^Sp z+(Ww-qn}#n=pb9W+4tQqdfada23CttK|-uf*F?8)rZYWO(t#YJi< zCG>_mH9sl_apHMli9SDgv~128e|V&!q&Gt(WQ0HwR0j){z%L~wvvjWzaJ4F$TBqrb zIie%ldFYiN1Oms%Zh}f^7oH6pPLZHhv1DGz6;y;G2DR6Y4j*;m3l_J{T;}WM5sd?i z35&56t6}ZR!)8X`FY;O6E`6SG?q142`}kzSn;E5%#&$hDKCUFP=viV|)YUp;Q&2}o zw^MGw#=S5N875$UE{_#|hb{ysd8kNdPRpLJZsxXmaGU?h8Xv1cF4j`OI|-HuLfRD* zSv5q)kG(RKMSw&TOcXr?wB8><*6aDu>kXY5+hZV)ASm`ut1~*u}%lt*NG`I;M;KS*0^1;Uc(4 zrPli?qV9Q3uH`)X4OhTJJZ`6TOCpeW%&Nt1?dI&ocUF&zslvf8EabiMZ!Ijtj|e<1 ztC;U}ac+@)!#3z;6XG<{HjHT~hw<=8|0dy_@p>Zw$CNn_n3#aPvXbR+g@>uBdjwJI zVX6nady8aM#5NL~vC1HJM=1%6Zy!&_B8(;r{v*wub}Eso#<^h%0L*Z>Ns|(!WmXm{ zF_31G@LiSIDk9Lsy_21KyNoSkvsr89ND>DB0wHVb;pd|GSrQ4bCLC=y`bMI#{m0Sbg9HSPcQsTLhefV?u2So}B}u4M0L2*w_+ z&%G!ZaYhxs5M*Q#L6TXo)X{dCXc1Bcy7~y+L*UlVUQbLG5`RCA09XybSC512D4+O^ z6B#7l)4)B}y-hGQ3GaHt*fc8!1%sn-`lf9NUpKuY?93C zLPGFr>c%Lm(^73x^>vu8)`YmWa2TKBHWDztH~7&-{yWTXR$ss<$14pU%!blQfxmSz z+v~r7KeL%P*l=1Ce3;a*#svRxl-W;ey`!qhkdes0a#ikysq4}8`~5#YNRv{syESx+ z-1}7sP1p5veUYMjP%Jki;SfV7srSbmBE+gu1b}c6^myK19}P{_Wf-VxW5#WzB%yc8 z^UMsYp``~==eXFgmB{tF-d4uJMbBy@mVGM0h)XWxN-5()4TmeEE`Hh52+>~EOrYxz z-CdyNi8XdA`ZyGh+df(lh(rN96Vq zX<7Sk27TN*Yo7rjCIGue}GOsaXi2H`S{FaLw_v@gCi} z#+$}8+Dx2lJ`8+tZ z-yhR5>fYRXAkJES?NRvPz&1!9u8lmJ@tGOVSiQC+DCt6)g`_AV5!Ea;j(&JEtBzU^ zK$PZ2s92-UMEFd)HJ_ZC$41v#xm@#RY&?3tFuGACX;}P+Dphb=q0YL=FRzBK21zX3 z4QB8l(t2j?{YGKP^#}nEA9|SN=S_d6VvT9$Rug|CoQS5~RhL~1EPqHpKc!EYYmtm6 z4Y)w+0dI?nrr5u9a}&IdisW3f zkxgHlIJ|78dPFZ6q1AtVj%o;PB*aMbtzU)!E}eJGj}uRcot|L4)Z^?^?3|X@CT-W_D)nEgL=-*!hf?6G zmc#ZdKma6gLKAqYP3CJ1iMdaYeWT8ZNXT;R9C54&DQRh0Y#d1l!1_(AcO_Pg6c%IZ z9ewJUnA+Vwm(-AAB?W{q1}44)$D;jh^G@k#ylx^cF4FMW`xc$75sUSyyj*i`DU^!T zpCPk|JXzHHR}puP$f-OERXO}%nn=I_>eJ=Y^Ey5K1X|R<)8oSCDxXRFC#JX`yIpmu z5?9atGUQ96#DLMLjSSX22!OQv=#Q0NmmdHYIXwFg4PhKfk|Jdy4L`+ilB_;DG%DAy zlez%D!stB=o1b1RY+3Qk1yno`Q2} zTR;5qqX^y;QecmEG=ZG;B9zI0TseR1HR5D#F|}p7^U-fi^3mUviWP@8Z0Jy5UmeaN zrQrqtWMiTH3N!D@cWN$8=Z-{TXY0+o`GI`It?4qZZ6iJoqhk=R`W^M0rx8P@9o?mS zG8w;mf`{x!E=xt*un4%J^R>`}Pz5FQ`!}Q6uu4nY2oY;NT1@0}cxf zKBFYzDWO-$e&h#SbtLTH16(|k7rmHRp_I*VK`db&MgSFulA{WwcA_xA>XwS@n{s8IQl3kshQSo%% z@tx$nkN8C%HjtL1dV-Dc`XLtvMtscWq~(rZh43U;F$_wPWFis;2@()v4Z-!rOIsST z*Ag;*wQ%0v-A_m-89IDa!hrJb^{ zn394^h|A;9xHH&dLeGB^%Ai8j6zyu<3HF?>z+bSMGa-Y=4tSYE-?7Rk@1n!4F8 zDfZN9*d>%v;P(VtDM3>HS$+$S2g0{fbFgyzkru2^r$*y@tTu;YCXp9D$OVGcDjnkV z<4;Pg?EY@W$x8C7;NRBEA%ZhGJ{ESY&*iM@Id-IKMI&>)@QQR56d~?aN zRPc(;PBwQ7;6f^a1cWm*0)Qh`m9m4G#rTyb zUjDi_bMq)fHODkuTj_SUvXV1?Kw-hFm*2tB4%+X(bDE?*iLRa6s1uh>d5wxr0Vqm6qaTW8$=Yq$K$8&Mh{|G^_HlrTqf zYd0`EGq4B~A$>(-JZ^~_5CJy<($G^qFzhh9QLMhs7z4m}BM|Gq&nZf@&!%R$RTrux z{`y8v)A5Vb*=CqeOBa%G%NMZH0DKbwdE9K|N{W=Dd7o!SpUEWp+++gaJ8zz_04U*U zzra*=eI|$U<<)h+Sg(>B3y*{pqQLRoU0SnRb8&cTP2z?T%lvD)Kzr)GB&u6B#?I+k zdzF{=n%$C*Lkh0-yVQpOLSAmXD+El`i-Y)AyZeQ;(Xem`AqtGgkuK!3#)n<)x@BPn z$qK}_zN?>+Z}`GraL>drzR9cKj57Kla*Y`I==M#?rMy0^#l*e$eli;0YdSn_s&PZ2 z3*JL^rn<7Mt;L?1EqE$kt#->kDpown1UDj2#H3w}U}Xe@S(rWt$`Vn)j}vu?znr^6 zgj++juwDfp+*>}EsbY|!dwKbIU%x@Oq%K@sjQ$Kvth0smHMQ|tqi=iZ(6A-{uOh)i zsFE<9VYN6dp>D}xQ*!8tW-d-e6UAs2zV&>G*5$!<4yb|F(DoZ`U9hpPz>@-BZh%kj zpCjhcFS<}NRD78mvS$*{OGg{a2QD<3i@f;HpDdOh6K~9p^a#^Fkpm2A zW}c5aBzn{={=ZoZWcjX(7$-k%BaQYvp*FvZLsNXWTFK+=R2((ZMke?c;t70Dv%7oE zR@H9Ozn!<5&52HTYXmt4X){;JAl~m(t{yGlS7^$97!)MSa&sryuM5D2y$?vmNpv@- zc`aE-6^9izA*lZown0z3>=joB0J z5q1{yg!s#z&veZ-2Z~m^hpd=tx(ggoK#=YiKynfn&M(eS1BAf5j~VlSy!jG$+**3@ zuH9d3;@3_>#;jTm&PJC`0YIS__fvA8P6F`NB0|eF9@bNm zlx*`#(&ZnRIGMeV<$Qvm47ug5rbe@TT)nqeX$jpT23}heCQyO#gkj7Qe4rga?ip2m zOu>X+yT*KoR_;|C*1xxLY>YQ04z!$)(^0h#^!<(VW6b6x-4~0w-TNCV^hSZLcS>e~ z85i35uoBx#zci!Uo)$)*J_2k zuN7>SSC%p%=5mS|Y+ZUMAxDw&+!YDCW-$+&y;jve1)6667PYLx{TBXWC&P~$@0h;= z+nvtkVA_=%M zF>L+r{6ja0QPoOOX#N>vb687DZ<}YQlSN#)R@a9=@)k_BGrQ*hqN%lXdl$U&EAC?c ztk3hOz+1i`7m<~FIrWKg0Vucf&xt?-1Np6&NE*8u3=k)k%eu z^%qtmm8*L{k$=4l+LlukDwI<4+@U|ya=0EQpMQgaAka(4!cEb3~J!JBVivh= zNWvfhyjttJ-Q8Z^D5k&m$E#E#LwXZH-h`IjlC>}wbs9Cv50+}ni;ffI z*DlSgOF$@YC#7zcK|Bj#Xg5}sYH1fq%I)K9an2B4l8xuudl7Fzu_-B3#Mc_8>tugV z$kgkymUqFKhNK}47ou#!mP~*zbziOw5f1VF(wDl+ggo3(anp?&EFH@YC(Wy&R@ZZ6 z%ZiO(--L$B>t<}4OLAq$awT_1Hphgfh!rXB+)ZS>5zh0EJ9{?yiTh?{%Z?Z*;> zyJ`QPZlhxjL1j%d#hgCXCh{?Hqr_8d=eL3J#LL#H^;-kIlAxj*-t$Ph``6Xd?C>$7 zxjW>?_eA(Xa-#$Z)Xh9z-H8TNmeK43HJde8@PqOe-&2AM(#TKy`>V)}ZAbUD&~OmL zUcK2=);18z#cRRM3jBs{*zpR5w(n8@l(pqcSRVL61>kMu8e5n?c=`z5o zn3&TNY^W}b9U}0nN7N}+%ge$kHU|aG$X1QTe7||{F!}P(`biNV3fgTMeT230BjSwx z&Nq71+ye?agAZMQHBpR{vrJu6TJ`rz15%n469;hKp(f;}KZMXGm3=w<@*4n}^||RX zJ%7F?Hl0bSbD%(b>hGf)QWe;OUti3-m|+1aJUn;{bY1^UHD+6oW6tk3LkQ5WTT7_^ zc~s06>L=mQF<**Q?`KT)Ib=X3^~~=#tP2IL#^8u0qf0tYuK67%C{`5gl9o)UEsnzi zq|AlJY5*1MLaWmap~=6EJV?-~SZ;n@`dzQ2j*K5Kprs`Dq;`=5atP9QiW~ofKNU33 z?c0Bqgj!^_T8b(4EQzas)f!JxYV_u5yQZ5&li}{UOmU0E-{&Kv#cFeX9eIg0Zq_`} z1CaBV{z*wB8{esTCg%saRT~+#&EQEa(^oCIG!S%c=U2@2Ih=Gx9OhgIN%9Z^~DS2S&`-%3n z`0u?XSttKxQ&c7=Rsnu@RMzDKajNQ=0lJ>@+HMvLQty(p5A+>nYX1-)g$>qyYZTZBk-L4X z6ts2G(SQi28#HZ;cJzo_QOp(HF-Np6W%Xz@Y^9qD%!M?BsKE@xb5Z@{BN-B4o+9t< z(V#&v{x$Wg0lBUsVdQ;*1LOfL-pzB|6FrFd_5O$RkwYT!$vA7NbP zHP?jgos$ep-xZKm`75LUFH?MPAq;pjtdU~lnN!sk=WZ{} zBmElR<6J#+Z;zhdgV(nan6D1rHiyka-1wJe^|Xj1R1rup5$}By4jSZ{e(y1Lz02Dv zC`LK~g`}DY+wpjVncvXjeN+wihjcywj;8?=DARFpvQM9!+@#(=e~@Og@%q2B0B(Lv zsD{P2w)s!-jsGYckbu+bCM>9Dm4w2x6Z`6YkljdIv*Nz>68>Jml|+F1b?+jGcJf*X zJxk6#FO8Sk}M4O@9&R>2j@^(t1+~ix2 zp=@~Q8aY%eeky+2#{OE^Lk8;8OpD)e-k(0H6OT+$YlQpt!AuLl1&P<36@KF!=VIHb zi$&&V&z3Rx;KDaP@f@`qV`gbao}<9>0r7?E zigwOu02t-pRx{Zh@-bBI4WY9v}KYL17u!Lft zmIMz|H=c_fS{1W<2T857Ptd{h3Y(L$SaDaTZ%!lkGMB zuc}Tr;X!?y;nW^Sj+x`fS03i)>+hau6I2W|gG(u#&&S`NgZy)a35gHq?-RnQX?{0s zIpnoDYj_nM!Z~536J})|n@zl-G{|AdMrune z^V(WBt+o7vrl6_z^VL@CgWcQnUt8~GLBV6Yhb+tVRr`GeX!omw1ZXE?tn#wL9WVsB zHTVI~<`)h6E&;*c{jkqMOPF~ky>haV^mdFP2ytLoJ{4-H(V+Gxz`3TK2)-zf4HSpw zX6nytT5>GwR4JhH43E~6ZKSW5upNvH9R~gzd-!{Q^ovJAkQYN*`)2-INCiX|XhG2_ z#aFW#5t2N@-5ienlIb%q__}9zr|z=o4He(McYYzc+8e*7BXGSf?>X9T2suSKbvxp0 z?H6Z2Z5!!wEN6Ilp24B3`A{o$V{{;!bLhHyJh7m9>Otuv*IKYBYPp{;$OFz%*3A{I zBFy%iFhA&GIHag26@7bu8R>IdUo&8_q?g4-!-V(O-P|H$+Aw&SAd&n071FKg%2AAm zo2F^3ekKH^2a{Y3)t=e$t={7p*^pb)9&BFwwTyQAWtMMsGoEKJF^Hjod{^n7d)?lw z*1sm`()Yu2V`@povnEBorKnw*d&#Dct?})L$V%`V!Q~>5XyR?fV_;8eOXuC2SKBg-xERR}a!1d6auX(*+&?!!>=@F zg<3a-h(%&I{4>#vUwh96&#mgW{31Yv-sNGnM>3=fH;1VZ4QNE7#ZK=A&xq70675B@yccxN9v6XjN!VjWtm$iGSO_dH|Hl!K^8Q~+e4|pRNk&8=ywHowZCfFF z`5V_!y-}R^p#wF5b2kWWvP+yLuNP4Cr}87Pb49H`X1B0I}zz z8KabiyuM^TpOuvAWz7HsWP3h#>|cWsp1cfhY?#20jpBR40EhFAzD8=mZ&)BbLx1uU zZ6h4y`zMQ7FD<)1P*ow3z%JTCiCrJ(vZ8$laPir3hggO2g;*M63>L?b{d(uyH`b{+ z7Y;G3C6o-GjU6?PahMXJT?CUl$XS5|nMFlv6b7vhl@5+=5}(!Un&*1D9zRdKo$$c| zb8(!{#{0`~wS|kD_j4t4@4x}jNqda3@txdcdnK|u7P4S)NWi`EEQXh0cyY?&viCCJ zuI6Ndd70MGE7FDd%t>7Ef?enrD2U`1UDq%3~hvz7HId6cs~g&q^I#8fFR(!5#|i z&-oH~p*2KoUlvtn9TjR425o40-+pGZAf8s8`ja7xl8<)hh!S8^ZboEN81-eaJAyNf zC@qN))9tP#OsT6y10Z2M0Iiy?R=ATzPhE;{9x0SOnItuZRS3=ny+n18A1>l%6v*eU zs6LAwuEqCSt*IqEVk1hcA%qynW9&kYb|xGRgVUfVAfT@3T|Zp={J<<+)yZL$((Tq? z=}c(IeV;fgV6Q@N*6(crPEuz7D#himI=D)T@O%z(-*xP}c9eL$BL?~x{wiJPX3DIU za)~8;Kf`3E*H>nBg4By>8D+T4CN<)f}qHAZYj7Zodbzd$Z|c>zug+;Js>!UqY_ z1XHSr&j_(!*n`g^+~dV?L(xPj31W@R!$pxcsJiEhGYtDa7}6OQ8-DKl5v(b?pI)Bz z0|ZF^36KaT-VbwLNLCH@Hwzb#duuo)P}y5 zGo1C>(An_fWU~GmV*4b6EFuc95aGY$3?SBvRGS}=Au9^Ua72_l34WdyuCd^r$KhJn z&D2^mQu$mD`vn`TWX&h*4o(fnaJqZbAOHyd)dV@l)L?od$T6hO3UIT0*{z$lezaaI z$n%hseeWf`@3e!%J@T}4OO*(T+jY8mxY9G@gUfSwbh?$*I^EyVSKIpeVSFo0#uW^1 z?T=Wfx-CaJ=q=e1^+C?u?I1jML=0xA>Lrgq>i6Z?CsDvRXCI8_(5(C!ooOREMUw{Y zD+4wI7BitHq9V(Gv?Ek4Vr>X7jpE@{Ue0yg>mSUl%oy7MGyf%Q!iVo(MMrd+O^w*TK^f&IO&NRvDVLP_i2>{ zvea=F9{JYW4N?6SlmmodB`#S}`Q@|WoYli1)@rY*MY*HQ%t!4gn?vFQ!xnH-X$hR- zNN0f^DWRVQ4~EP8Qyn?>RPqr?p1+$L3mZpl!*prI( zhLTbhXwXWr1v`fHDabAi?sDJ|-0gBMGN(2f{?8dQ@Z}ku-w%iKgq1Rm>7{Mx3fxRb zIv;lG;+8b5^WL_qHBzFnRtIgL@4_GdNEgLU#P7Sj=&6F-)F<6!t?G)Lj>%hj&BY}* z+5aOI8u|TSsZdLt31d?|Tc0Xbj4m7pZURG|ievZ(!}hu%0-HY<41_O*eySv%e+J5C z!e0*I80NfJEXc3F-YTdJ1B9D1!`n%=j2a+eB04G&U`Z8vgZ@AmX7^)ILBS*9Fp;#Y z#X%T}PWS@aC?fa2)ZSP+|Af^bh$#hSkO+8Z7xR!n3;{#Fn2JiZj_gP_QhZR{$)U%%jKx68<_VZ^JwY*dKXV`XxW_`{qU2~}2R_0CsPj*X<> z&?aMk@Eh+vvTdt|x{<2F%x!0ggdDMJp$jfMwiO;fa8F)Qq#aYiNcX@nPYvlSCXKDm z9q8BakDN)Y-FqD4Tk)`1ZkxWm8ZwZxy8(l7p3Pmd*NZhuy-m$xOR9LeW(N_(Wxge! z$GN@8u>eJ--x69sGMxaxR_&dy)D?8Y&lVJbPsf&P9T6T)j5Wtt%(h_3(a7R&7H&i) zcjEuY)msPEv2|a7jcagsceh}{Ex5b8B)B^P0t5>V!686`26qqc?iSqLZ94CL?>AFZ z)pe=<=U)1pK3mpad#|>_(zeAv0PsF>XGfnPtBSxY@cX)ER`*dx#x%bC$HtzIjS(HW zbVFG({e=@hUqMaTRci@j{O=n&#Ib=&(O4MpAw$q#jP8-dWxtkQoXGa^^fkWnr|@JA z?%_RZ`phg9W7&N2tA0lkeTjN+p`uu6B?7Optg%2Y!Op+&I1M!Lf7ERBud+3vBRNqGB+OFy(G;`iQ zp^m{xK_RgM68SAFULaA7fUznK16$t!EW^JTT^C_}hgS&6p}uL{$>atr9!K}5By;py zi;8H`M8`3pVPds0e5q14;*o0sY8n@BD(YjO?9I2*;^cQI?zMLM942eFPWo4-TCC3I zf_2n+clcdqmP$$$Y^IyBQs$>a)5~6X9{qCd8?Pw8;`qh+_fZP`Z52r|RWbWm#p9bp zKJ@dgMw+|7gVoyDBh4#M<5@2R09MC9zU`+HL~Efupi`91npe{=m?Twl zOz4=UZFGLKW66gsr?KrxaJH zNFoG8oej$!A2=%c!m|YvbJTP9%^Pk!Mp#siJiHJx4D`=^8S%&*>rYRDF}pD6(p05Z z=#u0Fxf{9KB=H$UR2r!MSU5X&TrFfKI3;CNZO0$GrZx~C`B#BUhjsXsakIA&7LX|x-5U38C|1voIE8jfnQCL`d zX7~5QYag4w7d=vJ7XQ@Tk^m&|Xg^;z@m*7>&2w~2<>ajRR#w~Z^GcPt(!P31V3dig zp`kTQW%;~;#a9Sk0{YqyC~shq1zQW4Opw`l3Gv;jvr4!ded9u*0`c2_$WRMC54uPf zeokrY4XZP%FKTGA zv~?=3;W_qmf$T^9T)w&kBM(vmLB8c=y%zTR?*oQpgLmu3B9+4?Hq)v&nkX{cw87sr%!`IYK4Ga3m?uq(1mWpQyWwj~zw@f<$;uF@e2BHL ztZW#@$Wc5>U|o%XF?uK_$`qbYyiGJapdS^!=3e(>`K-3ZFovL^4EQMD5KZte`C4Xk zEs$+kWcV21dLds#0~{IXkT}3<0Aa<*obCa0i5{c*NSq`eFV5AQdq^_~sUf=h;Bt}r zL^*W`Goo+E_hC;#m4SE|HZeP;8NKC|JbEds1K#3@@7u_;9XfE+B0=)~gKBH;ZxOqc zN&!{gS#hvYX8G>Hw6)yvc)2>!$Etsq^a2WYo5>ETCc|c-UBqbnUwDcIli!Cng||y& z3*{fS4;l+n4O4+i)QFC3w<=RK9kiO-C=@HHpzEHD*6zJB9n}yAkUCuW^wg4^{JHtG zt@g){^@QxFi(GN(83T5%=hfTR%bTTJVqt$!Z0Kb+gK?urRxMGph?$-l6r^dmD1P@Q z+6_6>8WEzyqy2GHSn$<~oIoQA&idO9_qWNa_|Kmg4YW?m%YR~6ba0HS^zx&L0m9D< z4*pM@M*SSHfs>P6tbXU1+t>wx7E$by6M*B+^7^ju0O7kmDLUqnD>M5rgi@X zZjE*TEoKlonu{qE&G(rRwf$-mLMPr)zFySEt*NRizPIp!v0_zCQ1QLR`? z3?IpHq?rE!&wZ%J@{8f^E*gX*au27>IRl7aK?9<{S4PkD$uttjRlgUY?eXe5P2Kld zpK75z+w31cjJ4LkT|iQdf!!64d~M-AQ;!Q}Y{(J38_X4cHmmVS6G+KAWc)_5?28Rt zjY#w^cXh#fXED?|dm$a*+>S{|tv~{f$hP#;1l(7FRyWm;*;-%h1-*v+ypsuu2}a$t z6K}A(r6mzca)9{)7{unL&$f1QcvA1UD&}wK3NqG3q<8CXV80of(0%$R+}ntcfBzpx z5JcHVwVRfM{%zv|)4Ilv$qsg`K4oO^ReCf!@w}22#wWs)wb@C#_1t+UmA|_2i!wwz z8R0HLki;u%lUH*BElNpV)>PGXpjlKb2nkA3rx@@slRW2RVC}@ z+eQxU%2nq5NK-zxd;2&=sLnt)Lm+=*%R#b#z?-=+>*eiOqI+Y@U= zt>{ayAtgDT-kQ!0mNtA^l0)_13MS;KA0IuraE;tfN-OxKq=Xy@T1Dr3+`njRcrmp2KIZhD&mkatICA9dzic`oC%x5vCP&`CyXe&hz|J|iE4@Ct=qom}d535xZ z)*RmNRwpJZC*mqg%G*Be@&OI6;5L6pVBP?)=Q>(%s>xofmeD!bj4dR{<-DW5o5kn>CNo&y z=La=4v@|s}pr2kM&IfXH(E&UnBL9c_cDsdfc{MEYO{7sAIX8(E3%u*!ztIKX)blVo zHO>*fxwZ&H$vzfb%Fec`)~>=PG=%s)w^17!q!f@)eQ0#_E6`Zt#L2QW7o!3Zlne#v z%30|dR$hQHUvj)wCyjLSwj*!elm%1c8&EGYDRFBXcOI4G zz?I*?$K9df?)q;})W7t+zkl>8{^N;sZ9^*jgUwVi37;PpVV6M-aX35{HQTrB^M_Gt zBEBPtjzNyy+1(w)13FBrmw%lq1iT&!gFOa^pLd7_mhfRsG$P=WEl&OBmTV7g*?R3$ z9-CvI&Q1fK;ed?O1NY|L%M0gebh*fxi;Y;n@LjL$x!d% z69g_~pyLH94BIXYl&WhroST_(dC?zR?@(4ScoU5VgFqS{YTSW`7CJ7ldhKqZD1qjG ze`&<%97g0b+V1zKTPhzNEe~CpjwT~DHC52<0vX_SCT1=hVSTzktzse-a&;X`YNiXJ zOJwlqXYGI7>myy~9X)n_eJYB5z8SEBSf7rVqNFsl*e<{l!wUUTU_m0s5!Dllg1oHT zo^koml>eRA!FG^akYi!$?P6Pj6SfbHE?n1Q-ts=ukjoF1FFL+C$6t)qJx%U>3oVI8 zK8&ztp83!`lf+o^enYn?^`v5oB(a+RKJjso(NB8nCOhL@!*UPAdRDJHXN4PV3&=L1 zpg75lDb2womgdH_bt9VL6F6UZ9(&A>P*jwU&GJx~S-LQ&eo-c~u20t*Z~sI!;OA#H zr(f$uAFcB_*@8)`CvCwiY^CZ?(*JL(RsTO*Elvr7aGmQNXFoBElG5hZJXeHUH|@b5 z31mC~f(=A#tzC)Ul5Qza$Aj z(Oj%rC^8^s69E5@I=iu$-K_gox-b3#9jBMH^0T-J0>;Rcm+ZMv3Z0oH_{#xr@@Fo9 zoSCzddD;nnv{^LKkoVchfcrDWoXM`l4;n2sa}(jZ>o+}8Llw=jaQUB_g2b&_einNf zSwzNcPhY+xw-L39q#SJM!?$6cU0wNA(06>4il;yO=dD)l>eM_*_E9=Yj^0jr;WZ87JktWbJNL0`ozm4^iDv)NPVw= zsD9!~wN=!2bv@=-;YCCSt6=L7E`Eem4|UD|GOhoaV{PvK9NK?ri$gF35DE~Gyv}zG zeVZ^qwA5wqVY!N_FubU|)YtHFGY0V%5-4LpN2Ach))o{_3H_9t+qq#T9mB|ZcwjeT ziOEE_8_2F%165sJEhYhgix~wAB^HQ=7`b<}aPsm34n}5Vv{@RjaZ*dKiVH&}Mhff3 zf($_$)USQVun`V+ro~89lKqjNc#B}B(#z3{7fdx2hC-sUG~R_)1$AT1l!v1JR%74&Bbh6I;Lb{L<5`L4jW{x6E^sS-*q>+XctVG{X$4 zw`#M0S;{!egPpkE_LZ{$SdVPmhXsAR*Y_Kj8}~x7sY!#9GR|f{$k!$WhN($NxQPLqHJ%nBfOgLFJvDjqmNN zWdg=r1iEjzIFYMua}FAfGQt;O zpIc&5X}6O%PkdIEb+#V02dzWJbrwU!Z}opw($k0N!85+K|(U=Wy*?d4UnR-F<)UUwcV`iGms<36PZpl2xJVx)>+mNxNqqMYYMxT#2 zPdi>ah2LphP%>P4X%%$21fe|k-o$i(TgK0r-%oh~gp6>!M4af80VM1DJ} z^Q+{i)RNf@Aw*755h*}NEtPMG5mJ5vv6M)O^b9q6t;K>NNiNLl*L1mmN~)@noIzyA zLpWQ?;B|OR87X`DQS-7f_QKl_=-oH`M_}e(fe63ue^m=vNF^9$)(J>vN&0%F4zIm| zy`!Ut?J?31b|1|$pa2MrY_!|W$964kHmfg1_V%_20jXcnggyM7T;;Fs;%H;Eo_BBk znc&QIP&Ap8WMx}6r|P9rM;5(ZUpsO%Nk5^fRyhh4d}5x|6s-T%__OB}HIbOfsKL>Y zt$}@DGB@uc5E62m-)Ry9O}7)4Il6o=RsM5lRDwhvjesL8L;U;U>*AG|5KI zH<*=Gce&Gf;}1&HPt6MHJ;;2MY>}pjJgo$LM@A@nYB8k*3b*$>Haey>o8#de?;L-d;aS25DcB)&$C? zs43PSPL`<EJi$A$n8$juGDJSACeUI%)DdS%yRr;ROX?F=uo=DOiL?Evw(WK^dsZNKTf8 z-^d_kDQP&qiS3hEpiu%Rkf6h`C{rM)=V0OnjT5L@6Em3W@HGg}59FD5KE1U0myGoC zZEcxrkW?I;68@kQ{+1SpA!xhhT3qZcxH^uYRbk-Oms!8FWm!Um1zR;(J1)-4bijsP zZi2e2UoodpV*A`!pzD>6R3ebGkZ2zu9296GEUFz>Ks_ zq1}*!*Y$?{PwbH4r*%`8e)_iHw%An&;L?(51a z3Bnze?%`GM=fZ=8T02eV(D#UM(STqH2oW+eL7r0<%coDZe(Qjqi;~%&1&M- zyp6)|eOJ&J#VpuVr#(J=HrI)hn6S>cv-~ri*pU3P{|xbWF8{x(p;w~5E%;B;59wS zMBs^p)Hg`n?H+xadYC-NjHQh&c3Lt;ASl|n54FD z$fKzbH`%SBfiCE1S{smw319x2g$fuLv>Fg+T5jsp)1ir7Tux>x-eM`0yxpVth(47W z)nlq#`Qha5nVp>{vgfKdJ&ZOz&`@|rSmb{~C*UHpgv%Y<(f)nwb8qD=GMv_d%N^XM zd7+rvei6;gIjcBOeA^Ju39-CymEFP~7TxbzS*anCq9n#-)`PAOblp zrFr%B0lrRfkYorFv>pAz5?JAE_e0~BhnM###E9-y;nC3(ELabHrV#*;GUayGvB9oI z1sz3W<}5qeXWwL4Qu?yY$*N8w{CD=_ID!N#MkbzMo`qvg*ZqiOLQ5IEh@B+_kQ|Og zG%0ZJaHb`?iwk5GVd4BPJL0EsZBEdA~;@8iL43+yGMrEPbgmzUcBCLO^wbB<#9 zvcnRvm#^ZmgzyT5Wkma%rPAY{l+(8B7(GVDl9ShsSI^eAo14+WO$|bx@}OS`H6E_I zA2pA0OcW#}Buq_-$k{f&snbC_J*cnjFLExHo;=2~ju^2i;q4=yo_oJOq)25g9hv z-q6Y2OwCHsy(&2^UEaV?PfF^~W9oZ(*R6@oqRq{G8ebkB9_P!#f^FPr`DgmzU> zE9M`o9Wwr*>y+lN9dT_`#@E7U>xBtg_I@0>c6-Cj{4uK1Kw#DPHq$TeMrQQ>*U<6x zL(TbO(+gqqjo|AtW0BIFjewEYe(lRkkkZQec}vR&JbI7y+sA!fRg5n?IS7QnM{3&09R>YiKW^LO|T-DWGXIG zMs`xBTUGHlmzR@fxH$)HVp$Tl-j~x(VHN(SsIsa3@+R9At=CN?z`V=<(%hT??uK-> z3;!I!2`2O&Jvm%iu*;l>nTdJg56a9;k*(d>aJFzA2h?uP+@Y}3l7fcD4Ae8!c35o7 zU6);U%jT>(BLqqmI*)kLx-fs<(QHhNVOTdp+I!s1r=f&}4aMSL^vII%BMoX$TQ%Ly z^GE$7??HVg`NS1|hm-kvq5^1OG!xVm`}E{m?X_4y4CEBn(UaT%DGipw3TS~tjzU()jkR?XZ zm!l=C1P%{hrQ5e{+_pbnURXrR)0m}HGYW!9pJH}(ZUs3bja<%eW42*ddLbQ+H$ZJ| zQFD{`C(N^lUXPJ8@0NsC)K4NN-!a36wuMx@RF{kd>)H5eWG&E?`F1l@^Kjo!EO*_7 zG@O)^w2uXB^`Dql)0^*ACDTG=T4sc#n+_(044B!gk?`ovza zXPrK^y^)c<$yrz4rjWzM>9Xhqmon6iH#G2`@0P8k=je6_3{y4r6Vu}2`tfj~ONoO2 zbHll5e}%ijI|CL-23%|@dg_p1k)2W2wpT0RA3w`iZdW_O@WiBEFK61c@^^2Kxupdb z_Kt-GC?g|_%gpv|^dO4`QOsGE0+5his%W*ZUh>oYB@+LAxHPIO?`gPHoeAj7#b1mGUl4+U21B8e zSNpg@^n{3{#9@sOU#1#sh`htV3+Ec zl})BB7UTj{4D-RscG$zp!UHmpU;DWz!oBlVQ0UaLf?PBZLRc8TKvHkj&fU@${Vt&D zlUgX-%!k!Ud!G?JwV$PV4WpwOqcv+#X?mg#+t({muFXEj$93fDy}0NDPu}Vm{C>fu z(4X&L>k7ULxv1fHkZNVDzJ)&tfrq>K+1!6@0I9!JgeoFz907H4O1RXH{dxi@=59?y$TblrR*2a9qZX6+2CadfaEh-|L{myE-un8+CDq3eqoR8jVJ-FTZ(-Hw59Smn48I?|;N)oakBd}@9Otv!=AO7GttIP*U{Z;br( zrLIbe7cLY%?h{%mi=yQFB4!<%A-O0hY7ux9d^#)ES)|00jIYL@OpdDAROj`#^;JYM zc%e_{V3MLy#{ZyXK*8r=(gUu@Zt|(1zX>3Hye&%c=b!lYBjpEe2OgZ0`J063baCxv z2zW=boGN4Lh;h8?te2Z(qm||ZLgc_o;|;f@;K5G?#8}woNp>DccDV?$K^)^^BvCF& z=Yd_%hxZEdXU!CfU^X1Z#!5_aNcb8)a zM2eHNZj|cc5)?&h@lYvC1BL|e8H`g9lS5QN+ws!q@%9pad9(pLH8Pkfn z3jtBIQXV^ZcgyqTym**Ps!Td%GH894vDcRa)Q=yJ7o+H~soqB^g%4#Ws41sr8?l8! zpo!51U0j$c37tnR9lw`TYTb?W&@0sxgAX#^If{^e_4@t?FW2?@0K0ze#Ys#grvp#8 zq5Wt*s0uS_MqFGx1TB5!n=q~2epP5_=sm)DC4c7l(pwqc(?in1bWo$>nDX9h|0lgu zk7Q>vI*(CpqKkd)w-{pKgv_MnnHeMXRIhd8Br1e36s-zv%@5U?uWg~9dt=(#I;kU( z)^1T{D^h?bHN5cuya&0f$zN3o&~T)nCj}{)RLL%f*c1>;>9)fywY!i!r5JvvpoSLN zUZ%}XvL26+pjFP(&@?v7ev{-ru3JY)MWI~Cod_SbMf|A|5jF%U_(~!vf@RxeN0VMx zIygq+cN0VHAwfXN44d0Wjp~J6<_@)Kwwr?~ZT1Elp1gzi&H_hPKpC>p>9a%GE6(Ql z^r;n**wmD4ZAla-ihmM9+xqiVZgWZSHU;mg6MO7%Z9I0#6hz>U!3M9(2~7fP-6MB9 z7rD8>Za0;RJj@P(m!i)sej5e)J3W=%nd&AYz!e3ucdkz=I;4}O>DT@O3@>tkKWI-f z5A$cT+kB(n?b_>ugol=g^>9aEep#8>s}EfIH{JI85!T1&pkmA!;Oru@f4Rq)nXNr{!*{Qg36V&Z0Y_69`4`t;9RTOY5zSDN0~wVxF%C56}|>iYT`9IeNu0Q8RxOb#NU z2jXV=+;4=voLooMNgW&>msHrz*H;|12b@JW%v+B_kBVwc=jLu)d|7Pavw<5bmZ#Y) zjFyvHqZZ?s#N?dB-;RYZ}GmYLcK^hI68p)bWQeu87G&^UqMaKmkfRK(5KtzrW9TUfZCPXUA)aR zev;MKv)R0|P=rtf&7U*qpf`*<%@+mohD{T7#&uQjs0Mkj-Y`BhoRVr{^=>kmeo~-S zrYNbRl7X_fm=|vK`0Qeh-x#5vb9OFftacpzxp2_F9tiB-X!)TP!Exb^o7N@bir{!J zE&Qe`f7IL7=}$;|pBG)U`igWIRDL7eXeVRv`?nLK)zY*W@5v~r6FXKtZr)w>NfX70 z0y&AJ14FfoOfeABaxR3sEx*{tEUWETnktW!Lzx(*2V;o^mFv7mWXo#0N9We|_V-}| zr)v^RDhx^eBlc415(co~p<#)|{oB`0Q9lHH)N*$IV|DUCg|-eH^oJSv`esl?ki>d8 zI)=0F5IMg*8jWG$Y?T^$z(4?yQS5;77Q%&uJn^%Wb+CXybJpW+r0y*FBuQFwRw13N zht*t1Af*twy}eUg=MT8vKcR&0=BJJ;xY@KuZWs<_)9#{%P@ z4g79ZVWbA>gu^~c0U1c!AJqJCPKyiXZHjgYqOvS`f#e@dTl3=LfT7|bMvKe&KdBe?TH<>@l4BKgnrg~)cW)JV+ z$7zX!Qw^^mO4ytU=lss^k%8!uk(dFVeQPi(+eq%-X5L0p!`bQGffP~9FvJ-6rKExP zBcmkh@v}jcjK1LEj=d7#z0%1&p-!kD=iRvq!DUF6<2YJ-abesNj@wn*Eghl4f0#QW z6O1%Qv}yy9Jxpw8Oe!Y!FesUv%&029sbA?f7z$4;B{7&@+PHF*qO29M(37+u7+US!sQrk!T>06%3EJuGT5zu~StQJO0^3 zn|1dV;CfpN4e6h6vUvZ!v(uP3C3QZv%d00tm15uY&*ogOgtYWGUI0Kv)sugH>fX0O zNO+h273~c$XHb1Hf6fVqnyFt`v*%|752#;v>&YPecZkGD-~V@txD!R>L!g0LgWUsA zgFP~TJEB_&O>FXbe_v(a=BCD6&)Lt&&%nsQ&!~0ELlZ7U^we0#MMuXaO_al2(n`Za zBTNy4Ac2It@Iz~3fbm{pFtj=f@CEUBbRAJM1f@LfQq++BTl{RDJrEvUyHtu>$@Fx$ zbUPu936TkUEbTWTPIxz$-wX|>km3P8m4qD zYr%Azr0ML-rLbBOnI|zusfqChqQKLNzyl)te_%>x^(*cA(m~MsAH zZpBf-{QH|b=m=7j4qk4Z(nO42UdPc?M198JXj`{KQBGnVn@FCm{vV4BD=gipEfx* zUpD=!SpUkX3wf+THIvdQGLT%LU{mAlLuV>Z@58i$AJ7J_i64U|7#%}h^qarIfHoCy zj3KNNZcuwpb!#9}fz*U@@@$;V$Sd@iY!DZNM*Z=+1jbNnA$B<`ew>R|pCxVQIXejaqj@l@k+QrM&9T5@u5aE5Mq?x(BIi=!=1 zMDODZZ&{oG$btguw6y)`=n?<+S5y!>dGUj*XmcN$+?E@rF>@TpQe2#SJH0qdOiG%R zkg2~mUOpu^p`tl@A7c>4^HE=HKheK^EIVatf%|I~&-NtgCfnx#^Z&Cd)>3~}GC}iV zJ^NcKe2V$l5#k=p$V-k7$k=~}*|zqb)6cY%R`vL&e|z>Xpl`b*ZQHd84)!y&ii})q zxKkL!T93fnCN2qraH_9^B=A4T0`>w@>|h85?JK(3zaPJsiGl-QGn|w`OsSVI35Ehe z0wY`ofm&Hz|CfFDB5rnoq{hsg(Fy_(Pi5fI%}tXK2X$5*41Ii@IrjW$Q8eYYGrdo_ zEnS;wH_N0H9!orRZ}AxO_O{KZWAn!K_KM*PBCx=hwj|{K>}rGsM@IAq^Uq1kV~p_A z%~)%zUsUCnZs{1(cWvhH_i2Tkp1*7tWCWMe#mo4uis<>&kKlBwYA`R%~+MX91ilN5mlC=pB-VhT@$2bBc%D^42{PLwRM1DsxZ;&UtF z;E-MC(=%u>q{U=H6bQlBEFkTs;RarJS)ag>0ZTlw*^<)IT6f*sT1?N=MGkUuN)w2Z z^0}wK`-!9(#> z^h{4ItSt#>yH%MC{ONjzQz|vo`E&ii$(bOvMkR)L!C7}I*x>qpLcItQ0HlKbcL^=z zaB$}-$JU-q#pZ`0|Ic7@BDe2J{9U(i#6R650In-;Ucb?WtRd|x24S6-t^KSi{?-`y zhrlSOu(VAgcc?(>F4uFG+);Zy$dE#%A+$YL{sa}fa{#1^ElvtilOg^tEs}~LkSNBD z0L^j-o)r;CH3x`kiwZ~-C6qV&m(YEQ3Ld<>gG8n5cHPI{&u+MXAbs7_OT)Jj#QKSc zj*FX~nNToy2#8>X!XWLA4GdWb&J$3&%J%Y^?Y@o_I+r`sW$E1olLnj$2RuC&45c7` z0)Xe|n6=l9iErQdgH@F1b?UzVAQLtyO2EL(hYR}*!b@g6gdhT=RFOhKNr~|%ziaG0 zyiS0HjccM?)9Gbis24VNQK8TDo?Yj^W&VGXElV8D{{>_)@gkFXuE4Jfr?n4b7N!}O zMKOYIY6A*jFs=TJeW6d?qK?*0XS`TILIRI<@*cIu><_+yH!lFkmKJ4$Z}aAj0x&*3 zPXyneM->6d4oMB|3R!?vbAXx=Jj`pQkJg{jLUc@pj*dP+528ndK>$2a7vqn=k&ye6 zCYjjxcO2Br)C`lhGf=xC052b7?XT;mlDRUY>fN%|0G~T{Nfoe=(EEikx!^mEO%g4Y z3RQ^X=(b45<~0UnqBR1vGFH##xh?I)K2=#@qzL?`zJ&;k(@gO;5-#)d{llpA%avC9 z+S=5Vo|=JxgT3LM{53!QTUyB_9{lTsRx@1!v!=ZKk3-2gFpyP>vutj{7b77O@Gzo>I4#iGbH)* zM0qAsSlacyDp*NCAVsEaKXZZi@jF`3Rog3|6G-q6XDzbAD z<&p4a>_&go%G!$@PtqX)f)!-wOWO-> zmS1Cg1u1|G>*wSY>$%$tf%Ab8FNWE8)94nAEoQr9=G)p>k`gMD~t z64FProVV851vnkTUCvy0^lZVH}4JETSdJk!g2|vbDFur>J*}uO; znwpFsvD{o_toTtXIKU^YuQ@S3o|=?t!-Ypcn69U{SYxJDs*jUF6_$0f8X$BZ)q@e2 z5s!sQ+{5Q!Yinb72n5d0?@`O)erAv###6yEHKT|n5opaZAH_oDb8CVDCZ{l2FQ&nR zVIYN7p>=-mii3oGPWa)UbdQVvX^7&V)r;cTw|4#x4LlMG9~BU12<@6##IEqZ_J;fj z2^1F54y+t%WfjPU#D*pd>F}B)4N)GK0*e_oGnci5ZMFK4xm>Oo*~052H#(G*a=4P5 zqepe&XKGHsdXx)FjsahyAh|?y^z)IN^_aCsi3?;$V>cW^Tn4NMY~(!>))fT|WJYkF zv(7evwh9^Ov`&P#`xj*#Lus*=zQ@{m!&Whj74#3%V!YW>rXre+N|sfFl0iQ{M|8u2U$xa6>mcC0&*TO>0@ds{aJ%-sz6TxF?%S7kXnTwrVD{h|9v{}Z^9diqPD=d?)9zQ~g5C&%s>;>DX~fzz5o&>o!4`kmGuE#!Yp@jW4N@qLm^-Mq^1 zzb{xFlm*B>{kkGt!*Xp}$ohLg{=;F&x$-BE_yOKU_nM&v?j;w#c7Klm@SJ?&7A=|^ z5b~-k;(UZh*v1>JhsFCM0UZn{5ebjh6{v#8hYE4_@MP#9f+pE&STrZsm8uQ_Y!C%P zLW^T8F36lwxDHc`rOdfwtV2k-L2h1^;=2GrXe%+nP*{I^wD!xXcEY*=%722;~?N70`fB$G@SZmYd6xMcdFuvhZw{m6@ zE>J_tJASoe|FQXM=+^Xa96xRW^FO4AlU9tCYMv!}66IT0NY@)LLLjH8c?riP^?2VG z4~_Z5`0DD+?5tC{PdP#ymCZ!nJy@6ygUtl=TqMVT}lli#wlhsg140kV**`FNxtyy>aEW<&_oAor_O& zOmy@#c@hZliD0OnS33Cm^RL$9af5pbD82a zZ6SJZ%YSJz2|wS*;_U*)YR zhxy)0r&3Z(dOMAzxXZ+_6t>)I!{L3zNERE&zv z*r+$a3N7JbviS(Y{^{$4z7=x;RfUy5e~SCy5!$i#kEL$lQ-q*B^zRk_n7@2Jy(fa& zC0=ma8%N4+@Y)P+m(!^L#K9DD^}q9=BkCQ24#6q{*Rym4-q}gXNY7$1HmA@YR5(BVU|6<$U$FpBsH!tMx50BQ+x=oS4i+J<|xn;0|x^k*n06Dlboaii^*j9RS>hJw{wd1Ejr+pd%+@P(NvcC zUj`&1;wA$UEREElAX=Pr@C4f66&=(3YbY8T9XnohB0wF2F&-~o1+wqd#3+v4AN!GO zp)^3=q$EUYas^ojpQ9*l%GaDs!A0H+FGzh_#O`kUc44+lCpZv&uJO2XUI#&@jYp+y zo1ew@#tcw_Ti@r8juIQRABUAt|5_1oC5!DFR(~PiSaXh^l*H6cOjn#p2jh;Jg$WH6 zbfNX=iWQIJ{MbG$oY6aTtHimD`N!bbtYaO0PtuvW(7)mF!vC0$x%j4>h)y`@z|C8I zf&yZ$?XvB3Bp$-3!iB8+ z&!2a8vwV)*9))}~k70m{xgrA?U>JQT9NtAq$>?rI!7@R#0xqzRG~gkkFB?&qZ+H3d znpoJ~bfGE~KqJQNNiB|%k7cL%BBq{bAZL#Ti6x_Dbvr@XCvLW=yEKGK3K{}jI`~gG z9soWi`(EA#5hTNIhj~&scnf2y__@qKo3}r4CZ&SPTz!QO2hQLNMAP zLqzuYB)5qg^29{8AwnzTtb=Jgu(;=EDCTQIp*Hm`iFm^y(ZPW;c_6+8lY_-e%V7o) zY6lU1rj_eFibof9_d=KzftnJG|sX#{0I;M06#6O zoeEby=?qd|cd{;~6Fp@S09UtbEseLxC`|wvJA2_TvMCaqw8{Yx2Y8U-e>fA*{WxH* z>$^5rRsR9~jTLtC<<)iOQ(uC{t0zaz?zn@0>-9$a=#jjN@=NsFdjl5W7Zvr$jXt<_ zR?^B%kc)A8Qaczc0QkCWmHrpwI=v+n}$VbXD8O^5bUA|{CTi+ zN(45lK?cUh|0ykX{V4CQ`I!tpA+vMy+-te*r~YA*)|$4@HumKXj{GctzPbOz>+?xb ztkBKX&9MVSAl(-a|A*O+OLf|1$+NRD#7k?_pRvc7bzQb)MbUKimWoSkw*p&k29p5C zvE9?*%!J4B?AO(W2^hfT!ujOB%L<1nqhgy89%9|`NxNW{)lAXQ-b_4!X$WMo8q^;X zsKiTvr$a&(x~sAcs>zc#EU*h|b5TA7kBZ+iR>@M0$SbDPUf3nuVYsGT$luqj9b+-e z#T`8itWK_G`5$8jyJV%s?Kyi{a-8H$MWpkv{N!Kwnvm&R)s)*K+`` z|C9pxOFs#1?N4}J>8>2R9Z2N0e>py}smTxjsqi1c!*sc;N453wjv+n$SsIo8*5S$6 zwUYT^5FAng^G{-_@*k#)phCmWFP5m`6|h;Lz6b%RmnYXJRty>zOcAF3$p&30yyH61 zBY6*Ai!nh#ofj9Iy2~c_7n1_QZq;P)B3-A1q;`(hpfrl-W#lq9b7g7Z*8o~KM(9&+dr;?&hnR{UOVnCx?wr%}*@qHv|HEwm`^eZ#ks3!}GA_jn;$aIJqqRuN;}7rt9K1ys z<)-$xC3a&)%*$~$3(clMgx*a9)?t5Blt8Mp<%MOaVA4GXGI~K z&iZtz(N<>O@himvbJxnrq8ayhzDX=Ud-O$Fbiz)(4|!U{VF(z+N&&u@-B7r|`bWgt zx_XfK4h@uy@OXFesThT$$$V=lIFc9h5+cqM%>}utAAJgA*W4m8c{0z|R#*68f`&?< zepZqy4e^+UAhWJ{l#mMwYX5vQUD)`Cr{zIbmD7BMKIXMSXvhbv*!#cEu&2uz#^QFGRLY8o5wpAafUYycW*FIx^tee&10zKwCQdSI?~a#dUBH$h#QS(tM>_!tib?A>*5*Z2pFF z$CDb2Pgh{z%ObvsMaif>OMgE#qmF*ak7S$5f(Ett?Q`q6jcYd|bO4iL0E++xh-hxE zhk3-#97{;ZX!YR6?lo&GPyVIsSXh?Y$-h!%=kNUcsS*OfQxK&-bO94rmlBk za^vKH-1ldVdiKunj{&CfB}*ml9(nuA&LX8A?ev!{G6RP&O3GgFv83g^Nn(*2)4b+v z_OiGIGGujrV1npibM1eugFW&X*qAp3kqr`n{DOk(&vOvp*n18R51wfUUK{J%9`}UX zkK!>ye-wY=wAJx}p$0r+F3`hR=;VdRut^oL*aZZf7OE$oA2EiipDGG;zO*({e6W*R z3srbsDjc1Vq94KB6137&zTP45G|$kms@&}2Ly8y%WAGE28Wyqhjsq_%*%loeyB{8& z5QyTXE~sQC0d!pV*+=i!MYh3t$o*IFejk5G2<7@Kmdl>Lb@pd;&gk583SnH!?k%M(tEr<(erW%j&qIgrE~7& zC9I@Pdr1c}q+3v?!D{?{QOB$odT!dlMdrF4gf^~I!77Qc!dpBKoN^p7-Kxz#yrzpXvy#UMmx zP{sg}v-6;}hU3geU%lD<5tNhrR(5vB>LxSki}*->w=FquLWuHCVE9n`Gm(hlR?_pB z_mlW>-MqbB!}FzX)-yZAEC1;hf&jz}I2?|0u0D)5^nHHsxLpk9(CLGRDPNC+&`<71 z8~P#NcUI4f0(74y9})Ro+}!D3?t+@487zC~)w?P`qsLJSQQzgm!G-lf>n0&kM1Mb?U z2Dq`J=LuT%$)CaW#WovMonKAb;Df_&wbAi9i9b{|Aa)-5D(Ut ziDkPvp7CFXmp1Bb?L_=tc}U1+0%tOZ}$9tgJ)^!@@$`({vIUwqVYQOId7uz z$H&K_;hr41T@vVKGJ{_aZ&`C$f5Yki_(<(>vyA?7;e$lQQ8&llLr3!bSYENryNrLe8-6RfwTiX=R*W=4E{Hzj(U?(y;j!P`P%)SX2(b3I?pdK_E`LVL##Sfl9NNq-M}){Zm{rYwn)m z{xTET_cn7(aJvaQ>#DrvRK4MA_*=6xS5NC>ug8vd2*eArBzSv^CXej<)``oV+%VS? z4$9Qhl;_x3Ss7!-+IevP6tjVu|QOx-X1+5ztj-Y{d*icz7OHU1~}X4EcBYxM^>S(WFC> zYZ(9BgGf=94a+^;I%g5d{S=9A>vh87Zib_?v)m>{KtNUkGH6Ol&jyhCWfcYDmrAQ_ z3DLuL&#dF=_!8kIYsl^`J>;d~EZX*R*Q9h!Pf`~B*!K3y67s~qsRSp`-$|g`GPc6H zSlN@3kkD-I2s#GvC#9*B?*3FGkQi2%S`m=H8?m)Dz&B6Y+!(gCP1rI#X1ak&v>zt- z+{o@-(5g55Hg75;jUs5XCg=U(p- z1PrmG0(f|4F%;-6ft~`o#;TP^=B^8`c8^C9Lsf=&5TWI<^Ks#X5FNQbS?jH&!Bn*B z?BBwXgO`x;JA+{suCy4ta;n*hiF$U6x6?BXyF0laX9K7$ZPXX(-RhlqWkd=)!$?B(E55VwuAPQkfAMYaqrOS^ zj_lCjabk3K&W`J2YcviHQw)rk10M?#&$RK0C6vhL>u7nxF1<+2+fZHq3iTmkxsfS3 zl`v)1Gj8~lRX2KzDJp=bb$hm3>)SOtDqkJ9dKdX^iiO(CpP==M?3z|StXv7rW``LJ zFSdseE^E)zm6f$Sw>^gAiZY^_S%JQbQx8tpdt_FC&S%O&fsmv#-M>%s;5EkyLNyc>`AzQUUr1bP>hKJD^;s9PU&x!o&v$pI`_0qEw^KB@r0uzGY?Ww`M?EIC z;$=!CtLAUHl>|?H<)51Vp0HHtB*SM`4OHR8n!^c^NSy->1Q26IWDII>{#+4AjW41g z-r|$=*$qJat#p79lbY(-gQjM&#Orj#tu)8go7zO_qXbO{O%m{0!Z!NNMMf+cI45X`c{HX95g)K%2E$>p0v1h3oc3a{J8wfl+D#y&M;Ga*$hnxH6XI*30Vi{ z7Lo#zqC(1()#!kpq?9HYx23DB>s>hE?nbrW3?34D+pVT&>NuRLee<}vXBSNVQ}9F< zU1xR~xW-p#L{tmNoKsutKE`GSz!Q4zjqRF#dOhiV5Lc52R#E43W(CiN&cMq!>CJ1^ z=e_>*iCCX0lWqj%r*n*~>#Hnrx(Wnf>JP^jUc+3gbX$O6(~QebE=0Hj6!Si zKktC0d`iiRIST^DxytwSnhBkTALMA^J%X2zIX9^kI|=Y5!`iz*MRV!;r)k{1EodT zia9Ok{FmYVX4ZnkMNPl5P?dP1WnFjx8i}I@lNoG&ovuZXNN~DShbp9l0Sc!0nVH$j zE_3txG7HVQl;&<;@+Vd&S}bm}VrS5Rs2IWqv(4&m-{D(lI?!K0V`>hgMukQg`}&wm{ON@{C$djJqZcT z*(tD|zwHg|6zgnRBtu4O)7Q(<;vy0Y`oQE$3V3XPaNh%o;g@@| ztRUm^E+*lVOl#7;RlQ9k=jXkdt^8M&+s6&mX+K&@4zI^NIg}yqKCoI0=@N50$7B6n zlgWVpYVZP>p+XYXl0P^k-RC*xoqnEwlyM%h96J$Y(>OK%IG}$LO+q7|XtrTSFEXP=k(LHK&7i*bA1h$1#Pq#<@=*mb8FXU4qsx1c zzR_Dq^O*D%d=*W>(ACxUq$FIQ*9xT2lvDdxKA6Z-pM$Fw$O8idd0QR~^vNF|gPy#& zX=#n=`Wdwq8z0LqKn@yWjqQONA@Pl}3TJ(t<6qfkM!I1s*>0vTFnAh4*Ankb=-^w{ z)tYK_ckYQe&N5nL@rdy86nxw-!qHW~y+r6fRl-3F1XtQToSM+lq}yG^e>M{Brf_~^ zW7hc=`r}gjZMWP~^=Y(ZU6b@+djAPtBbSJZJK#c0K#3P7*=v59
4Aid9gA?{l&S{l`9E58O+mxz#1nN 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 z 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 T0yh592o({O5Xj|w=k|XA^GH`W literal 1315724 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 z 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

lqFs8 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

vO8&7uwfi+-kbBFG(oo+UTWW?zoF2E7X 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ðJ*X`ik;=&GS*@Q{e+ThYiN@G=0yeQ}EUNqyf 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 z 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�CK+RxyIs} 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

8c^>lATVj%8aoI4D=yTih%L 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

-c)hr8IpMVt&f@-Ijf|du>mZj7s`=vhY~oiB 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 diff --git a/x-pack/test/functional/apps/lens/group1/ad_hoc_data_view.ts b/x-pack/test/functional/apps/lens/group1/ad_hoc_data_view.ts index 38f66db31dc92..b7c4cbdddd5fa 100644 --- a/x-pack/test/functional/apps/lens/group1/ad_hoc_data_view.ts +++ b/x-pack/test/functional/apps/lens/group1/ad_hoc_data_view.ts @@ -54,9 +54,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { } const checkDiscoverNavigationResult = async () => { - await dashboardPanelActions.clickContextMenuItem( - 'embeddablePanelAction-ACTION_OPEN_IN_DISCOVER' - ); + await dashboardPanelActions.clickPanelAction('embeddablePanelAction-ACTION_OPEN_IN_DISCOVER'); const [, discoverHandle] = await browser.getAllWindowHandles(); await browser.switchToWindow(discoverHandle); diff --git a/x-pack/test/functional/apps/lens/group3/dashboard_inline_editing.ts b/x-pack/test/functional/apps/lens/group3/dashboard_inline_editing.ts index 2d92d98dc3606..312bddba10eac 100644 --- a/x-pack/test/functional/apps/lens/group3/dashboard_inline_editing.ts +++ b/x-pack/test/functional/apps/lens/group3/dashboard_inline_editing.ts @@ -49,7 +49,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await lens.save('New Lens from Modal', false, false, false, 'new'); await dashboard.waitForRenderComplete(); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickInlineEdit(); log.debug('Adds a secondary dimension'); @@ -90,7 +89,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboardPanelActions.legacySaveToLibrary('My by reference visualization'); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickInlineEdit(); log.debug('Removes breakdown dimension'); @@ -110,7 +108,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await lens.save('New Lens from Modal', false, false, false, 'new'); await dashboard.waitForRenderComplete(); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickInlineEdit(); log.debug('Adds a secondary dimension'); @@ -150,7 +147,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboard.waitForRenderComplete(); await elasticChart.setNewChartUiDebugFlag(true); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickInlineEdit(); log.debug('Adds annotation'); @@ -177,7 +173,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboard.waitForRenderComplete(); await elasticChart.setNewChartUiDebugFlag(true); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickInlineEdit(); log.debug('Adds reference line'); diff --git a/x-pack/test/functional/apps/lens/group4/show_underlying_data_dashboard.ts b/x-pack/test/functional/apps/lens/group4/show_underlying_data_dashboard.ts index 70625ecafaa75..de563366af3fb 100644 --- a/x-pack/test/functional/apps/lens/group4/show_underlying_data_dashboard.ts +++ b/x-pack/test/functional/apps/lens/group4/show_underlying_data_dashboard.ts @@ -42,7 +42,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { exitFromEditMode: true, }); - await dashboardPanelActions.clickContextMenuItem(OPEN_IN_DISCOVER_DATA_TEST_SUBJ); + await dashboardPanelActions.clickPanelAction(OPEN_IN_DISCOVER_DATA_TEST_SUBJ); const [dashboardWindowHandle, discoverWindowHandle] = await browser.getAllWindowHandles(); await browser.switchToWindow(discoverWindowHandle); @@ -59,7 +59,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should show the open button for a compatible saved visualization with annotations and reference line', async () => { await dashboard.switchToEditMode(); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickEdit(); await header.waitUntilLoadingHasFinished(); await lens.createLayer('annotations'); @@ -73,7 +72,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { exitFromEditMode: true, }); - await dashboardPanelActions.clickContextMenuItem(OPEN_IN_DISCOVER_DATA_TEST_SUBJ); + await dashboardPanelActions.clickPanelAction(OPEN_IN_DISCOVER_DATA_TEST_SUBJ); const [dashboardWindowHandle, discoverWindowHandle] = await browser.getAllWindowHandles(); await browser.switchToWindow(discoverWindowHandle); @@ -90,7 +89,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should bring both dashboard context and visualization context to discover', async () => { await dashboard.switchToEditMode(); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickEdit(); await savedQueryManagementComponent.openSavedQueryManagementComponent(); await queryBar.switchQueryLanguage('lucene'); @@ -119,7 +117,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboardPanelActions.expectExistsPanelAction(OPEN_IN_DISCOVER_DATA_TEST_SUBJ); await dashboard.clickCancelOutOfEditMode(); - await dashboardPanelActions.clickContextMenuItem(OPEN_IN_DISCOVER_DATA_TEST_SUBJ); + await dashboardPanelActions.clickPanelAction(OPEN_IN_DISCOVER_DATA_TEST_SUBJ); const [dashboardWindowHandle, discoverWindowHandle] = await browser.getAllWindowHandles(); await browser.switchToWindow(discoverWindowHandle); diff --git a/x-pack/test/functional/apps/lens/group6/lens_tagging.ts b/x-pack/test/functional/apps/lens/group6/lens_tagging.ts index 7c3c14150d2b2..56f97c8751d77 100644 --- a/x-pack/test/functional/apps/lens/group6/lens_tagging.ts +++ b/x-pack/test/functional/apps/lens/group6/lens_tagging.ts @@ -97,7 +97,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('retains its saved object tags after save and return', async () => { - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickEdit(); await lens.saveAndReturn(); await header.waitUntilLoadingHasFinished(); diff --git a/x-pack/test/functional/apps/lens/open_in_lens/tsvb/dashboard.ts b/x-pack/test/functional/apps/lens/open_in_lens/tsvb/dashboard.ts index 593f42c14db4a..bf799673c2491 100644 --- a/x-pack/test/functional/apps/lens/open_in_lens/tsvb/dashboard.ts +++ b/x-pack/test/functional/apps/lens/open_in_lens/tsvb/dashboard.ts @@ -53,14 +53,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await dashboardCustomizePanel.clickSaveButton(); await dashboard.waitForRenderComplete(); await dashboardBadgeActions.expectExistsTimeRangeBadgeAction(); - await panelActions.openContextMenu(); - const editInLensExists = await testSubjects.exists( - 'embeddablePanelAction-ACTION_EDIT_IN_LENS' - ); - if (!editInLensExists) { - await testSubjects.click('embeddablePanelMore-mainMenu'); - } - await testSubjects.click('embeddablePanelAction-ACTION_EDIT_IN_LENS'); + await panelActions.convertToLens(); await lens.waitForVisualization('xyVisChart'); await retry.try(async () => { diff --git a/x-pack/test/functional/apps/maps/group2/embeddable/filter_by_map_extent.ts b/x-pack/test/functional/apps/maps/group2/embeddable/filter_by_map_extent.ts index 60ef9b8799d3c..1f5a09d144934 100644 --- a/x-pack/test/functional/apps/maps/group2/embeddable/filter_by_map_extent.ts +++ b/x-pack/test/functional/apps/maps/group2/embeddable/filter_by_map_extent.ts @@ -38,7 +38,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); it('should filter dashboard by map extent when "filter by map extent" is enabled', async () => { - await dashboardPanelActions.clickContextMenuItemByTitle( + await dashboardPanelActions.clickPanelActionByTitle( FILTER_BY_MAP_EXTENT_DATA_TEST_SUBJ, 'document example' ); @@ -59,7 +59,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); it('should remove map extent filter dashboard when "filter by map extent" is disabled', async () => { - await dashboardPanelActions.clickContextMenuItemByTitle( + await dashboardPanelActions.clickPanelActionByTitle( FILTER_BY_MAP_EXTENT_DATA_TEST_SUBJ, 'document example' ); diff --git a/x-pack/test/functional/apps/saved_query_management/feature_controls/security.ts b/x-pack/test/functional/apps/saved_query_management/feature_controls/security.ts index 6c57295a0c353..9c3b989882469 100644 --- a/x-pack/test/functional/apps/saved_query_management/feature_controls/security.ts +++ b/x-pack/test/functional/apps/saved_query_management/feature_controls/security.ts @@ -77,7 +77,7 @@ export default function (ctx: FtrProviderContext) { break; case 'dashboard': await dashboard.navigateToApp(); - await dashboard.gotoDashboardEditMode('A Dashboard'); + await dashboard.loadSavedDashboard('A Dashboard'); break; case 'maps': await maps.openNewMap(); diff --git a/x-pack/test/functional/services/ml/lens_visualizations.ts b/x-pack/test/functional/services/ml/lens_visualizations.ts index 7bb49e7397e9d..2b95bfc1bd2c8 100644 --- a/x-pack/test/functional/services/ml/lens_visualizations.ts +++ b/x-pack/test/functional/services/ml/lens_visualizations.ts @@ -18,7 +18,7 @@ export function MachineLearningLensVisualizationsProvider( return { async clickCreateMLJobMenuAction(title = '') { - await dashboardPanelActions.clickContextMenuItemByTitle( + await dashboardPanelActions.clickPanelActionByTitle( 'embeddablePanelAction-create-ml-ad-job-action', title ); 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 146e72ab3698e..e887f6ee80e38 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 @@ -402,7 +402,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { await common.navigateToApp('dashboard'); await dashboard.preserveCrossAppState(); await dashboard.loadSavedDashboard(myDashboardName); - await dashboardPanelActions.clickContextMenuItem(ADD_TO_EXISTING_CASE_DATA_TEST_SUBJ); + await dashboardPanelActions.clickPanelAction(ADD_TO_EXISTING_CASE_DATA_TEST_SUBJ); await testSubjects.click('cases-table-add-case-filter-bar'); await cases.create.createCase({ @@ -434,7 +434,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { await dashboard.preserveCrossAppState(); await dashboard.loadSavedDashboard(myDashboardName); - await dashboardPanelActions.clickContextMenuItem(ADD_TO_EXISTING_CASE_DATA_TEST_SUBJ); + await dashboardPanelActions.clickPanelAction(ADD_TO_EXISTING_CASE_DATA_TEST_SUBJ); await testSubjects.click(`cases-table-row-select-${theCase.id}`); diff --git a/x-pack/test/reporting_functional/services/scenarios.ts b/x-pack/test/reporting_functional/services/scenarios.ts index 1b5c23a1f6568..aea50c207dc20 100644 --- a/x-pack/test/reporting_functional/services/scenarios.ts +++ b/x-pack/test/reporting_functional/services/scenarios.ts @@ -77,7 +77,7 @@ export function createScenarios( }; const tryDashboardGenerateCsvFail = async (savedSearchTitle: string) => { - await dashboardPanelActions.clickContextMenuItemByTitle( + await dashboardPanelActions.clickPanelActionByTitle( GENERATE_CSV_DATA_TEST_SUBJ, savedSearchTitle ); @@ -94,7 +94,7 @@ export function createScenarios( GENERATE_CSV_DATA_TEST_SUBJ, savedSearchTitle ); - await dashboardPanelActions.clickContextMenuItemByTitle( + await dashboardPanelActions.clickPanelActionByTitle( GENERATE_CSV_DATA_TEST_SUBJ, savedSearchTitle ); diff --git a/x-pack/test/search_sessions_integration/tests/apps/dashboard/session_sharing/lens.ts b/x-pack/test/search_sessions_integration/tests/apps/dashboard/session_sharing/lens.ts index 2942e31ee2f77..b32eafc8c6899 100644 --- a/x-pack/test/search_sessions_integration/tests/apps/dashboard/session_sharing/lens.ts +++ b/x-pack/test/search_sessions_integration/tests/apps/dashboard/session_sharing/lens.ts @@ -48,7 +48,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Navigating to lens and back should create a new session const byRefSessionId = await dashboardPanelActions.getSearchSessionIdByTitle(lensTitle); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickEdit(); await lens.saveAndReturn(); await dashboard.waitForRenderComplete(); @@ -62,7 +61,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const byValueSessionId = await dashboardPanelActions.getSearchSessionIdByTitle(lensTitle); // Navigating to lens and back should keep the session - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickEdit(); await lens.saveAndReturn(); await dashboard.waitForRenderComplete(); diff --git a/x-pack/test_serverless/functional/test_suites/common/visualizations/group2/open_in_lens/agg_based/gauge.ts b/x-pack/test_serverless/functional/test_suites/common/visualizations/group2/open_in_lens/agg_based/gauge.ts index ab86b163ef6ee..de95f3b2a243a 100644 --- a/x-pack/test_serverless/functional/test_suites/common/visualizations/group2/open_in_lens/agg_based/gauge.ts +++ b/x-pack/test_serverless/functional/test_suites/common/visualizations/group2/open_in_lens/agg_based/gauge.ts @@ -43,13 +43,11 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); it('should show the "Convert to Lens" menu item', async () => { - const visPanel = await panelActions.getPanelHeading('Gauge - Basic'); - expect(await panelActions.canConvertToLens(visPanel)).to.eql(true); + expect(await panelActions.canConvertToLensByTitle('Gauge - Basic')).to.eql(true); }); it('should convert aggregation with params', async () => { - const visPanel = await panelActions.getPanelHeading('Gauge - Agg with params'); - await panelActions.convertToLens(visPanel); + await panelActions.convertToLensByTitle('Gauge - Agg with params'); await lens.waitForVisualization('gaugeChart'); expect(await lens.getLayerCount()).to.be(1); diff --git a/x-pack/test_serverless/functional/test_suites/observability/cases/attachment_framework.ts b/x-pack/test_serverless/functional/test_suites/observability/cases/attachment_framework.ts index c429fef23fdd9..17caa3d6560f2 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/cases/attachment_framework.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/cases/attachment_framework.ts @@ -58,7 +58,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { it('adds lens visualization to a new case', async () => { const caseTitle = 'case created in observability from my dashboard with lens visualization'; - await dashboardPanelActions.clickContextMenuItem(ADD_TO_CASE_DATA_TEST_SUBJ); + await dashboardPanelActions.clickPanelAction(ADD_TO_CASE_DATA_TEST_SUBJ); await retry.waitFor('wait for the modal to open', async () => { return ( @@ -109,7 +109,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'dashboards' }); - await dashboardPanelActions.clickContextMenuItem(ADD_TO_CASE_DATA_TEST_SUBJ); + await dashboardPanelActions.clickPanelAction(ADD_TO_CASE_DATA_TEST_SUBJ); // verify that solution filter is not visible await testSubjects.missingOrFail('options-filter-popover-button-owner'); diff --git a/x-pack/test_serverless/functional/test_suites/search/dashboards/build_dashboard.ts b/x-pack/test_serverless/functional/test_suites/search/dashboards/build_dashboard.ts index 1f13f10d9e948..8f97f53c6275f 100644 --- a/x-pack/test_serverless/functional/test_suites/search/dashboards/build_dashboard.ts +++ b/x-pack/test_serverless/functional/test_suites/search/dashboards/build_dashboard.ts @@ -56,7 +56,6 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('can edit a Lens panel by value and save changes', async () => { await PageObjects.dashboard.waitForRenderComplete(); - await dashboardPanelActions.openContextMenu(); await dashboardPanelActions.clickEdit(); await PageObjects.lens.switchToVisualization('pie'); await PageObjects.lens.saveAndReturn(); diff --git a/x-pack/test_serverless/functional/test_suites/security/ftr/cases/attachment_framework.ts b/x-pack/test_serverless/functional/test_suites/security/ftr/cases/attachment_framework.ts index 648309b3d5cab..d8b43ca1c4301 100644 --- a/x-pack/test_serverless/functional/test_suites/security/ftr/cases/attachment_framework.ts +++ b/x-pack/test_serverless/functional/test_suites/security/ftr/cases/attachment_framework.ts @@ -51,7 +51,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { const caseTitle = 'case created in security solution from my dashboard with lens visualization'; - await dashboardPanelActions.clickContextMenuItem(ADD_TO_CASE_DATA_TEST_SUBJ); + await dashboardPanelActions.clickPanelAction(ADD_TO_CASE_DATA_TEST_SUBJ); await retry.waitFor('wait for the modal to open', async () => { return ( @@ -108,7 +108,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { await testSubjects.click('edit-unsaved-New-Dashboard'); } - await dashboardPanelActions.clickContextMenuItem(ADD_TO_CASE_DATA_TEST_SUBJ); + await dashboardPanelActions.clickPanelAction(ADD_TO_CASE_DATA_TEST_SUBJ); // verify that solution filter is not visible await testSubjects.missingOrFail('options-filter-popover-button-owner'); From dc2d8e46345d9afaaa436cbe297f6e4fb9f90981 Mon Sep 17 00:00:00 2001 From: Roger Coll Date: Fri, 25 Oct 2024 10:07:20 +0200 Subject: [PATCH 013/135] [Observability Onboarding] OTel Kubernetes flow - reference 8.16 values file (#197208) ## Summary Reference 8.16 values file branch + bump kube-stack Helm Chart version ### 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#_add_your_labels) - [ ] This will appear in the **Release Notes** and follow the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) Co-authored-by: Joe Reuter --- .../otel_kubernetes/otel_kubernetes_panel.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_kubernetes/otel_kubernetes_panel.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_kubernetes/otel_kubernetes_panel.tsx index 9d3e07cc2f612..6cbfe740fa784 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_kubernetes/otel_kubernetes_panel.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_kubernetes/otel_kubernetes_panel.tsx @@ -31,9 +31,9 @@ import { ObservabilityOnboardingContextValue } from '../../../plugin'; import { useKubernetesFlow } from '../kubernetes/use_kubernetes_flow'; const OTEL_HELM_CHARTS_REPO = 'https://open-telemetry.github.io/opentelemetry-helm-charts'; -const OTEL_KUBE_STACK_VERSION = '0.3.0'; +const OTEL_KUBE_STACK_VERSION = '0.3.3'; const OTEL_KUBE_STACK_VALUES_FILE_URL = - 'https://raw.githubusercontent.com/elastic/opentelemetry/refs/heads/main/resources/kubernetes/operator/helm/values.yaml'; + 'https://raw.githubusercontent.com/elastic/opentelemetry/refs/heads/8.16/resources/kubernetes/operator/helm/values.yaml'; const CLUSTER_OVERVIEW_DASHBOARD_ID = 'kubernetes_otel-cluster-overview'; export const OtelKubernetesPanel: React.FC = () => { From 3ece9501560ae18bb6c5993db7cc889a6675857c Mon Sep 17 00:00:00 2001 From: Achyut Jhunjhunwala Date: Fri, 25 Oct 2024 11:20:26 +0200 Subject: [PATCH 014/135] [Dataset Quality] Add fix it flow for field limit (#195561) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Closes - https://github.com/elastic/kibana/issues/190330 This PR implements the logic to support - One click increasing of Field Limit for Field Limit Issues (applicable on for Integrations). For Non Integrations, only text is displayed as to how they can do it. - The One click increase updates the linked custom component template as well as the last backing Index - If Last Backing Index update fails due to any reason, it provides user an option to trigger a Rollover manually. ## Demo Not possible, to many things to display 😆 ## What's Pending ? Tests - [x] API tests - [x] Settings API - [x] Rollover API - [x] Apply New limit API - [x] FTR tests - [x] Displaying of various issues for integrations and non integrations - [x] Fix it Flow Good case, without Rollover - [x] Fix it Flow Good case, with Rollover - [x] Manual Mitigation - Click on Component Template shold navigate to proper logic based on Integration / Non - [x] Manual Mitigation - Ingest Pipeline - [x] Link for official Documentation ## How to setup a local environment We will be setting up 2 different data streams, one with integration and one without. Please follow the steps in the exact order 1. Start Local ES and Local Kibana 2. Install Nginx Integration 1st 3. Ingest data as per script here - https://gist.github.com/achyutjhunjhunwala/03ea29190c6594544f584d2f0efa71e5 4. Set the Limit for the 2 datasets ``` PUT logs-synth.3-default/_settings { "mapping.total_fields.limit": 36 } // Set the limit for Nginx PUT logs-nginx.access-default/_settings { "mapping.total_fields.limit": 52 } ``` 5. Now uncomment line number 59 from the synthtrace script to enable cloud.project.id field and run the scenario again 6. Do a Rollover ``` POST logs-synth.3-default/_rollover POST logs-nginx.access-default/_rollover ``` 7. Get last backing index for both dataset ``` GET _data_stream/logs-synth.3-default/ GET _data_stream/logs-nginx.access-default ``` 8. Increase the Limit by 1 but for last backing index ``` PUT .ds-logs-synth.3-default-2024.10.10-000002/_settings { "mapping.total_fields.limit": 37 } PUT .ds-logs-nginx.access-default-2024.10.10-000002/_settings { "mapping.total_fields.limit": 53 } ``` 9. Run the same Synthtrace scenario again. This setup will give you 3 fields for testings 1. cloud.availability_zone - Which will show the character limit isue 2. cloud.project - Which will show an obsolete error which happened in the past and now does not exists due to field limit 3. cloud.project.id - A current field limit issue --------- Co-authored-by: Marco Antonio Ghiani Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../src/types.ts | 19 +- .../public/application/services/routing.ts | 6 + .../index_management/public/locator.test.ts | 22 + .../index_management/public/locator.ts | 18 +- .../dataset_quality/common/api_types.ts | 27 +- .../common/data_stream_details/types.ts | 5 + .../dataset_quality/common/translations.ts | 179 +++++ .../common/utils/component_template_name.ts | 18 + .../degraded_field_flyout/field_info.tsx | 98 +-- .../degraded_field_flyout/index.tsx | 44 +- .../field_limit_documentation_link.tsx | 28 + .../field_limit/field_mapping_limit.tsx | 83 ++ .../increase_field_mapping_limit.tsx | 83 ++ .../field_limit/message_callout.tsx | 119 +++ .../possible_mitigations/index.tsx | 35 + .../manual/component_template_link.tsx | 86 +++ .../possible_mitigations/manual/index.tsx | 39 + .../manual/pipeline_link.tsx | 136 ++++ .../possible_mitigations/title.tsx | 35 + .../degraded_fields/degraded_fields.tsx | 1 + .../public/hooks/use_degraded_fields.ts | 80 +- .../data_stream_details_client.ts | 47 ++ .../services/data_stream_details/types.ts | 11 +- .../notifications.ts | 25 + .../state_machine.ts | 186 ++++- .../types.ts | 82 +- .../get_data_stream_details/index.ts | 4 +- .../get_datastream_settings.ts | 19 +- .../get_degraded_field_analysis/index.ts | 9 +- .../server/routes/data_streams/routes.ts | 58 ++ .../data_streams/update_field_limit/index.ts | 59 ++ .../update_component_template.ts | 53 ++ .../update_settings_last_backing_index.ts | 41 + .../utils/create_dataset_quality_es_client.ts | 28 +- .../dataset_quality/data_stream_rollover.ts | 86 +++ .../dataset_quality/data_stream_settings.ts | 251 ++++++ .../dataset_quality/degraded_field_analyze.ts | 2 +- .../observability/dataset_quality/index.ts | 3 + .../dataset_quality/integrations.ts | 33 +- .../dataset_quality/update_field_limit.ts | 176 +++++ .../dataset_quality/{ => utils}/es_utils.ts | 18 + .../data_streams/data_stream_settings.spec.ts | 159 ---- .../custom_integration_mappings.ts | 177 +++++ .../dataset_quality/degraded_field_flyout.ts | 691 +++++++++++++---- .../page_objects/dataset_quality.ts | 25 + .../data_stream_settings.ts | 130 ---- .../dataset_quality_api_integration/index.ts | 1 - .../custom_integration_mappings.ts | 177 +++++ .../dataset_quality_details.ts | 2 + .../dataset_quality/degraded_field_flyout.ts | 712 ++++++++++++++---- 50 files changed, 3707 insertions(+), 719 deletions(-) create mode 100644 x-pack/plugins/observability_solution/dataset_quality/common/utils/component_template_name.ts create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/field_limit_documentation_link.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/field_mapping_limit.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/increase_field_mapping_limit.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/message_callout.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/index.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/manual/component_template_link.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/manual/index.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/manual/pipeline_link.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/title.tsx create mode 100644 x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/update_field_limit/index.ts create mode 100644 x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/update_field_limit/update_component_template.ts create mode 100644 x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/update_field_limit/update_settings_last_backing_index.ts create mode 100644 x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/data_stream_rollover.ts create mode 100644 x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/data_stream_settings.ts create mode 100644 x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/update_field_limit.ts rename x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/{ => utils}/es_utils.ts (63%) delete mode 100644 x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_settings.spec.ts create mode 100644 x-pack/test/functional/apps/dataset_quality/custom_mappings/custom_integration_mappings.ts delete 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/functional/test_suites/observability/dataset_quality/custom_mappings/custom_integration_mappings.ts diff --git a/x-pack/packages/index-management/index_management_shared_types/src/types.ts b/x-pack/packages/index-management/index_management_shared_types/src/types.ts index 190aadfc29d01..ec5c7938d6b4b 100644 --- a/x-pack/packages/index-management/index_management_shared_types/src/types.ts +++ b/x-pack/packages/index-management/index_management_shared_types/src/types.ts @@ -17,10 +17,21 @@ import type { LocatorPublic } from '@kbn/share-plugin/public'; import { ExtensionsSetup } from './services/extensions_service'; import { PublicApiServiceSetup } from './services/public_api_service'; -export interface IndexManagementLocatorParams extends SerializableRecord { - page: 'data_streams_details'; - dataStreamName?: string; -} +export type IndexManagementLocatorParams = SerializableRecord & + ( + | { + page: 'data_streams_details'; + dataStreamName?: string; + } + | { + page: 'index_template'; + indexTemplate: string; + } + | { + page: 'component_template'; + componentTemplate: string; + } + ); export type IndexManagementLocator = LocatorPublic; diff --git a/x-pack/plugins/index_management/public/application/services/routing.ts b/x-pack/plugins/index_management/public/application/services/routing.ts index bce7a14f03e46..89143bbd79d02 100644 --- a/x-pack/plugins/index_management/public/application/services/routing.ts +++ b/x-pack/plugins/index_management/public/application/services/routing.ts @@ -11,6 +11,7 @@ import { Section } from '../../../common/constants'; import type { IndexDetailsTabId } from '../../../common/constants'; import { ExtensionsService } from '../../services/extensions_service'; import { IndexDetailsSection } from '../../../common/constants'; + export const getTemplateListLink = () => `/templates`; export const getTemplateDetailsLink = (name: string, isLegacy?: boolean) => { @@ -81,6 +82,11 @@ export const getComponentTemplatesLink = (usedByTemplateName?: string) => { } return url; }; + +export const getComponentTemplateDetailLink = (name: string) => { + return `/component_templates/${encodeURIComponent(name)}`; +}; + export const navigateToIndexDetailsPage = ( indexName: string, indicesListURLParams: string, diff --git a/x-pack/plugins/index_management/public/locator.test.ts b/x-pack/plugins/index_management/public/locator.test.ts index 712223d7cbfe4..49b9890259d9c 100644 --- a/x-pack/plugins/index_management/public/locator.test.ts +++ b/x-pack/plugins/index_management/public/locator.test.ts @@ -34,4 +34,26 @@ describe('Index Management URL locator', () => { }); expect(path).toBe('/data/index_management/data_streams/test'); }); + + test('locator returns the correct url for index_template', async () => { + const indexTemplateName = 'test@custom'; + const { path } = await locator.getLocation({ + page: 'index_template', + indexTemplate: indexTemplateName, + }); + expect(path).toBe( + encodeURI(`/data/index_management/templates/${encodeURIComponent(indexTemplateName)}`) + ); + }); + + test('locator returns the correct url for component_template', async () => { + const componentTemplateName = 'log@custom'; + const { path } = await locator.getLocation({ + page: 'component_template', + componentTemplate: componentTemplateName, + }); + expect(path).toBe( + `/data/index_management/component_templates/${encodeURIComponent(componentTemplateName)}` + ); + }); }); diff --git a/x-pack/plugins/index_management/public/locator.ts b/x-pack/plugins/index_management/public/locator.ts index d32d33573507d..c5411aded71a4 100644 --- a/x-pack/plugins/index_management/public/locator.ts +++ b/x-pack/plugins/index_management/public/locator.ts @@ -8,7 +8,11 @@ import { ManagementAppLocator } from '@kbn/management-plugin/common'; import { LocatorDefinition } from '@kbn/share-plugin/public'; import { IndexManagementLocatorParams } from '@kbn/index-management-shared-types'; -import { getDataStreamDetailsLink } from './application/services/routing'; +import { + getComponentTemplateDetailLink, + getDataStreamDetailsLink, + getTemplateDetailsLink, +} from './application/services/routing'; import { PLUGIN } from '../common/constants'; export const INDEX_MANAGEMENT_LOCATOR_ID = 'INDEX_MANAGEMENT_LOCATOR_ID'; @@ -37,6 +41,18 @@ export class IndexManagementLocatorDefinition path: location.path + getDataStreamDetailsLink(params.dataStreamName!), }; } + case 'index_template': { + return { + ...location, + path: location.path + getTemplateDetailsLink(params.indexTemplate), + }; + } + case 'component_template': { + return { + ...location, + path: location.path + getComponentTemplateDetailLink(params.componentTemplate), + }; + } } }; } 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 bfbb2bc1cd5d1..903d7f0607663 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 @@ -134,22 +134,39 @@ export const degradedFieldAnalysisRt = rt.intersection([ type: rt.string, ignore_above: rt.number, }), + defaultPipeline: rt.string, }), ]); export type DegradedFieldAnalysis = rt.TypeOf; -export const dataStreamSettingsRt = rt.intersection([ +export const updateFieldLimitResponseRt = rt.intersection([ rt.type({ - lastBackingIndexName: rt.string, + isComponentTemplateUpdated: rt.union([rt.boolean, rt.undefined]), + isLatestBackingIndexUpdated: rt.union([rt.boolean, rt.undefined]), + customComponentTemplateName: rt.string, }), rt.partial({ - createdOn: rt.union([rt.null, rt.number]), // rt.null is needed because `createdOn` is not available on Serverless - integration: rt.string, - datasetUserPrivileges: datasetUserPrivilegesRt, + error: rt.string, }), ]); +export type UpdateFieldLimitResponse = rt.TypeOf; + +export const dataStreamRolloverResponseRt = rt.type({ + acknowledged: rt.boolean, +}); + +export type DataStreamRolloverResponse = rt.TypeOf; + +export const dataStreamSettingsRt = rt.partial({ + lastBackingIndexName: rt.string, + indexTemplate: rt.string, + createdOn: rt.union([rt.null, rt.number]), // rt.null is needed because `createdOn` is not available on Serverless + integration: rt.string, + datasetUserPrivileges: datasetUserPrivilegesRt, +}); + export type DataStreamSettings = rt.TypeOf; export const dataStreamDetailsRt = rt.partial({ diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/data_stream_details/types.ts b/x-pack/plugins/observability_solution/dataset_quality/common/data_stream_details/types.ts index 66b7567a2b60c..ce74552b581b9 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/data_stream_details/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/data_stream_details/types.ts @@ -14,3 +14,8 @@ export interface AnalyzeDegradedFieldsParams { lastBackingIndex: string; degradedField: string; } + +export interface UpdateFieldLimitParams { + dataStream: string; + newFieldLimit: number; +} 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 e5b660b31de10..1026dd8ea58d3 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/common/translations.ts @@ -500,3 +500,182 @@ export const degradedFieldMessageIssueDoesNotExistInLatestIndex = i18n.translate 'This issue was detected in an older version of the dataset, but not in the most recent version.', } ); + +export const possibleMitigationTitle = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigationTitle', + { + defaultMessage: 'Possible mitigation', + } +); + +export const increaseFieldMappingLimitTitle = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.increaseFieldMappingLimitTitle', + { + defaultMessage: 'Increase field mapping limit', + } +); + +export const fieldLimitMitigationDescriptionText = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationDescription', + { + defaultMessage: + 'The field mapping limit sets the maximum number of fields in an index. When exceeded, additional fields are ignored. To prevent this, increase your field mapping limit.', + } +); + +export const fieldLimitMitigationConsiderationText = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationConsiderations', + { + defaultMessage: 'Before changing the field limit, consider the following:', + } +); + +export const fieldLimitMitigationConsiderationText1 = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationConsiderations1', + { + defaultMessage: 'Increasing the field limit could slow cluster performance.', + } +); + +export const fieldLimitMitigationConsiderationText2 = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationConsiderations2', + { + defaultMessage: 'Increasing the field limit also resolves field limit issues for other fields.', + } +); + +export const fieldLimitMitigationConsiderationText3 = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationConsiderations3', + { + defaultMessage: + 'This change applies to the [name] component template and affects all namespaces in the template.', + } +); + +export const fieldLimitMitigationConsiderationText4 = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationConsiderations4', + { + defaultMessage: + 'You need to roll over affected data streams to apply mapping changes to component templates.', + } +); + +export const fieldLimitMitigationCurrentLimitLabelText = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationCurrentLimitLabelText', + { + defaultMessage: 'Current limit', + } +); + +export const fieldLimitMitigationNewLimitButtonText = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationNewLimitButtonText', + { + defaultMessage: 'New limit', + } +); + +export const fieldLimitMitigationNewLimitPlaceholderText = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationNewLimitPlaceholderText', + { + defaultMessage: 'New field limit', + } +); + +export const fieldLimitMitigationApplyButtonText = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationApplyButtonText', + { + defaultMessage: 'Apply', + } +); + +export const otherMitigationsLoadingAriaText = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.otherMitigationsLoadingText', + { + defaultMessage: 'Loading possible mitigations', + } +); + +export const otherMitigationsCustomComponentTemplate = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.otherMitigationsCustomComponentTemplate', + { + defaultMessage: 'Add or edit custom component template', + } +); + +export const otherMitigationsCustomIngestPipeline = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.otherMitigationsCustomIngestPipeline', + { + defaultMessage: 'Add or edit custom ingest pipeline', + } +); + +export const fieldLimitMitigationOfficialDocumentation = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationOfficialDocumentation', + { + defaultMessage: 'Documentation', + } +); + +export const fieldLimitMitigationSuccessMessage = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationSuccessMessage', + { + defaultMessage: 'New limit set!', + } +); + +export const fieldLimitMitigationSuccessComponentTemplateLinkText = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationSuccessComponentTemplateLinkText', + { + defaultMessage: 'See component template', + } +); + +export const fieldLimitMitigationPartiallyFailedMessage = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationPartiallyFailedMessage', + { + defaultMessage: 'Changes not applied to new data', + } +); + +export const fieldLimitMitigationFailedMessage = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationFailedMessage', + { + defaultMessage: 'Changes not applied', + } +); + +export const fieldLimitMitigationFailedMessageDescription = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationFailedMessageDescription', + { + defaultMessage: 'Failed to set new limit', + } +); + +export const fieldLimitMitigationPartiallyFailedMessageDescription = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationPartiallyFailedMessageDescription', + { + defaultMessage: + 'The component template was successfully updated with the new field limit, but the changes were not applied to the most recent backing index. Perform a rollover to apply your changes to new data.', + } +); + +export const fieldLimitMitigationRolloverButton = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.fieldLimitMitigationRolloverButton', + { + defaultMessage: 'Rollover', + } +); + +export const manualMitigationCustomPipelineCopyPipelineNameAriaText = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.copyPipelineNameAriaText', + { + defaultMessage: 'Copy pipeline name', + } +); + +export const manualMitigationCustomPipelineCreateEditPipelineLink = i18n.translate( + 'xpack.datasetQuality.details.degradedField.possibleMitigation.createEditPipelineLink', + { + defaultMessage: 'create or edit the pipeline', + } +); diff --git a/x-pack/plugins/observability_solution/dataset_quality/common/utils/component_template_name.ts b/x-pack/plugins/observability_solution/dataset_quality/common/utils/component_template_name.ts new file mode 100644 index 0000000000000..0be7b84137c83 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/common/utils/component_template_name.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* + * There are index templates like this metrics-apm.service_transaction.10m@template which exists. + * Hence this @ needs to be removed to derive the custom component template name. + */ +export function getComponentTemplatePrefixFromIndexTemplate(indexTemplate: string) { + if (indexTemplate.includes('@')) { + return indexTemplate.split('@')[0]; + } + + return indexTemplate; +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/field_info.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/field_info.tsx index 1e6bda781d733..3bcee0bbc89b3 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/field_info.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/field_info.tsx @@ -38,7 +38,7 @@ export const DegradedFieldInfo = ({ fieldList }: { fieldList?: DegradedField }) degradedFieldValues, isDegradedFieldsLoading, isAnalysisInProgress, - degradedFieldAnalysisResult, + degradedFieldAnalysisFormattedResult, degradedFieldAnalysis, } = useDegradedFields(); @@ -94,9 +94,12 @@ export const DegradedFieldInfo = ({ fieldList }: { fieldList?: DegradedField }) grow={2} >

- + - {degradedFieldAnalysisResult?.potentialCause} + {degradedFieldAnalysisFormattedResult?.potentialCause}
@@ -125,52 +128,53 @@ export const DegradedFieldInfo = ({ fieldList }: { fieldList?: DegradedField }) )} - {!isAnalysisInProgress && degradedFieldAnalysisResult?.shouldDisplayValues && ( - <> - - - - {degradedFieldMaximumCharacterLimitColumnName} - - - + - {degradedFieldAnalysis?.fieldMapping?.ignore_above} - - - - - - - {degradedFieldValuesColumnName} - - - + + {degradedFieldMaximumCharacterLimitColumnName} + + + + {degradedFieldAnalysis?.fieldMapping?.ignore_above} + + + + - - {degradedFieldValues?.values.map((value, idx) => ( - - - {value} - - - ))} - - - - - - )} + + + {degradedFieldValuesColumnName} + + + + + {degradedFieldValues?.values.map((value, idx) => ( + + + {value} + + + ))} + + + + + + )} ); }; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/index.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/index.tsx index 189b3ceefe37c..bb72b4f6de20f 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/index.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/index.tsx @@ -6,6 +6,7 @@ */ import React, { useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; import { EuiBadge, EuiFlyout, @@ -20,6 +21,7 @@ import { EuiButtonIcon, EuiToolTip, } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; import { NavigationSource } from '../../../services/telemetry'; import { useDatasetDetailsRedirectLinkTelemetry, @@ -38,11 +40,18 @@ import { } from '../../../../common/translations'; import { DegradedFieldInfo } from './field_info'; import { _IGNORED } from '../../../../common/es_fields'; +import { PossibleMitigations } from './possible_mitigations'; // Allow for lazy loading // eslint-disable-next-line import/no-default-export export default function DegradedFieldFlyout() { - const { closeDegradedFieldFlyout, expandedDegradedField, renderedItems } = useDegradedFields(); + const { + closeDegradedFieldFlyout, + expandedDegradedField, + renderedItems, + isAnalysisInProgress, + degradedFieldAnalysisFormattedResult, + } = useDegradedFields(); const { dataStreamSettings, datasetDetails, timeRange } = useDatasetQualityDetailsState(); const pushedFlyoutTitleId = useGeneratedHtmlId({ prefix: 'pushedFlyoutTitle', @@ -118,9 +127,42 @@ export default function DegradedFieldFlyout() { )} + {isUserViewingTheIssueOnLatestBackingIndex && + !isAnalysisInProgress && + degradedFieldAnalysisFormattedResult && + !degradedFieldAnalysisFormattedResult.identifiedUsingHeuristics && ( + <> + + + + {i18n.translate( + 'xpack.datasetQuality.degradedFieldFlyout.strong.fieldLimitLabel', + { defaultMessage: 'field limit' } + )} + + ), + }} + /> + + + )} + {isUserViewingTheIssueOnLatestBackingIndex && ( + <> + + + + )} ); diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/field_limit_documentation_link.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/field_limit_documentation_link.tsx new file mode 100644 index 0000000000000..0dd80bb120e54 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/field_limit_documentation_link.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiLink } from '@elastic/eui'; +import { useKibanaContextForPlugin } from '../../../../../utils'; +import { fieldLimitMitigationOfficialDocumentation } from '../../../../../../common/translations'; + +export function FieldLimitDocLink() { + const { + services: { docLinks }, + } = useKibanaContextForPlugin(); + + return ( + + {fieldLimitMitigationOfficialDocumentation} + + ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/field_mapping_limit.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/field_mapping_limit.tsx new file mode 100644 index 0000000000000..1056713ac2070 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/field_mapping_limit.tsx @@ -0,0 +1,83 @@ +/* + * 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 { + EuiAccordion, + EuiHorizontalRule, + EuiPanel, + EuiSpacer, + EuiText, + EuiTitle, + useGeneratedHtmlId, +} from '@elastic/eui'; +import { + fieldLimitMitigationConsiderationText, + fieldLimitMitigationConsiderationText1, + fieldLimitMitigationConsiderationText2, + fieldLimitMitigationConsiderationText3, + fieldLimitMitigationConsiderationText4, + fieldLimitMitigationDescriptionText, + increaseFieldMappingLimitTitle, +} from '../../../../../../common/translations'; +import { useDegradedFields } from '../../../../../hooks'; +import { IncreaseFieldMappingLimit } from './increase_field_mapping_limit'; +import { FieldLimitDocLink } from './field_limit_documentation_link'; +import { MessageCallout } from './message_callout'; + +export function FieldMappingLimit({ isIntegration }: { isIntegration: boolean }) { + const accordionId = useGeneratedHtmlId({ + prefix: increaseFieldMappingLimitTitle, + }); + + const { degradedFieldAnalysis } = useDegradedFields(); + + const accordionTitle = ( + +
{increaseFieldMappingLimitTitle}
+
+ ); + + return ( + + + + {fieldLimitMitigationDescriptionText} + + + +

{fieldLimitMitigationConsiderationText}

+ +
    +
  • {fieldLimitMitigationConsiderationText1}
  • +
  • {fieldLimitMitigationConsiderationText2}
  • +
  • {fieldLimitMitigationConsiderationText3}
  • +
  • {fieldLimitMitigationConsiderationText4}
  • +
+
+ + {isIntegration && ( + <> + + + + + + )} + +
+
+ ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/increase_field_mapping_limit.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/increase_field_mapping_limit.tsx new file mode 100644 index 0000000000000..158a5e5eba460 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/increase_field_mapping_limit.tsx @@ -0,0 +1,83 @@ +/* + * 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, { useState } from 'react'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiFieldText, + EuiFormRow, + EuiButton, + EuiFieldNumber, +} from '@elastic/eui'; +import { + fieldLimitMitigationApplyButtonText, + fieldLimitMitigationCurrentLimitLabelText, + fieldLimitMitigationNewLimitButtonText, + fieldLimitMitigationNewLimitPlaceholderText, +} from '../../../../../../common/translations'; +import { useDegradedFields } from '../../../../../hooks'; + +export function IncreaseFieldMappingLimit({ totalFieldLimit }: { totalFieldLimit: number }) { + // Propose the user a 30% increase over the current limit + const proposedNewLimit = Math.round(totalFieldLimit * 1.3); + const [newFieldLimit, setNewFieldLimit] = useState(proposedNewLimit); + const [isInvalid, setIsInvalid] = useState(false); + const { updateNewFieldLimit, isMitigationInProgress } = useDegradedFields(); + + const validateNewLimit = (newLimit: string) => { + const parsedLimit = parseInt(newLimit, 10); + setNewFieldLimit(parsedLimit); + if (totalFieldLimit > parsedLimit) { + setIsInvalid(true); + } else { + setIsInvalid(false); + } + }; + + return ( + + + + + + + + + validateNewLimit(e.target.value)} + aria-label={fieldLimitMitigationNewLimitPlaceholderText} + isInvalid={isInvalid} + min={totalFieldLimit + 1} + /> + + + + + updateNewFieldLimit(newFieldLimit)} + isLoading={isMitigationInProgress} + > + {fieldLimitMitigationApplyButtonText} + + + + + ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/message_callout.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/message_callout.tsx new file mode 100644 index 0000000000000..168ae4df575e9 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/field_limit/message_callout.tsx @@ -0,0 +1,119 @@ +/* + * 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 { EuiButton, EuiCallOut, EuiLink } from '@elastic/eui'; +import { + fieldLimitMitigationFailedMessage, + fieldLimitMitigationFailedMessageDescription, + fieldLimitMitigationPartiallyFailedMessage, + fieldLimitMitigationPartiallyFailedMessageDescription, + fieldLimitMitigationRolloverButton, + fieldLimitMitigationSuccessComponentTemplateLinkText, + fieldLimitMitigationSuccessMessage, +} from '../../../../../../common/translations'; +import { useDatasetQualityDetailsState, useDegradedFields } from '../../../../../hooks'; +import { getComponentTemplatePrefixFromIndexTemplate } from '../../../../../../common/utils/component_template_name'; +import { useKibanaContextForPlugin } from '../../../../../utils'; + +export function MessageCallout() { + const { + isMitigationInProgress, + newFieldLimitData, + isRolloverRequired, + isMitigationAppliedSuccessfully, + } = useDegradedFields(); + const { error: serverError } = newFieldLimitData ?? {}; + + if (serverError) { + return ; + } + + if (!isMitigationInProgress && isRolloverRequired) { + return ; + } + + if (!isMitigationInProgress && isMitigationAppliedSuccessfully) { + return ; + } + + return null; +} + +export function SuccessCallout() { + const { + services: { + share: { + url: { locators }, + }, + }, + } = useKibanaContextForPlugin(); + const { dataStreamSettings, datasetDetails } = useDatasetQualityDetailsState(); + const { name } = datasetDetails; + + const componentTemplateUrl = locators.get('INDEX_MANAGEMENT_LOCATOR_ID')?.useUrl({ + page: 'component_template', + componentTemplate: `${getComponentTemplatePrefixFromIndexTemplate( + dataStreamSettings?.indexTemplate ?? name + )}@custom`, + }); + + return ( + + + {fieldLimitMitigationSuccessComponentTemplateLinkText} + + + ); +} + +export function ManualRolloverCallout() { + const { triggerRollover, isRolloverInProgress } = useDegradedFields(); + return ( + +

{fieldLimitMitigationPartiallyFailedMessageDescription}

+ + {fieldLimitMitigationRolloverButton} + +
+ ); +} + +export function ErrorCallout() { + return ( + +

{fieldLimitMitigationFailedMessageDescription}

+
+ ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/index.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/index.tsx new file mode 100644 index 0000000000000..34f39f25a67ec --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/index.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiSpacer } from '@elastic/eui'; +import { ManualMitigations } from './manual'; +import { FieldMappingLimit } from './field_limit/field_mapping_limit'; +import { useDatasetQualityDetailsState, useDegradedFields } from '../../../../hooks'; +import { PossibleMitigationTitle } from './title'; + +export function PossibleMitigations() { + const { degradedFieldAnalysis, isAnalysisInProgress } = useDegradedFields(); + const { integrationDetails } = useDatasetQualityDetailsState(); + const isIntegration = Boolean(integrationDetails?.integration); + + return ( + !isAnalysisInProgress && ( +
+ + + {degradedFieldAnalysis?.isFieldLimitIssue && ( + <> + + + + )} + +
+ ) + ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/manual/component_template_link.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/manual/component_template_link.tsx new file mode 100644 index 0000000000000..54bbe91f2f2e1 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/manual/component_template_link.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useEffect, useState } from 'react'; +import { MANAGEMENT_APP_ID } from '@kbn/deeplinks-management/constants'; +import { EuiFlexGroup, EuiIcon, EuiLink, EuiPanel, EuiTitle } from '@elastic/eui'; +import { useKibanaContextForPlugin } from '../../../../../utils'; +import { useDatasetQualityDetailsState } from '../../../../../hooks'; +import { getComponentTemplatePrefixFromIndexTemplate } from '../../../../../../common/utils/component_template_name'; +import { otherMitigationsCustomComponentTemplate } from '../../../../../../common/translations'; + +export function CreateEditComponentTemplateLink({ isIntegration }: { isIntegration: boolean }) { + const { + services: { + application, + share: { + url: { locators }, + }, + }, + } = useKibanaContextForPlugin(); + + const [indexTemplatePath, setIndexTemplatePath] = useState(null); + const [componentTemplatePath, setComponentTemplatePath] = useState(null); + + const { dataStreamSettings, datasetDetails } = useDatasetQualityDetailsState(); + const { name } = datasetDetails; + + const indexManagementLocator = locators.get('INDEX_MANAGEMENT_LOCATOR_ID'); + + useEffect(() => { + indexManagementLocator + ?.getLocation({ + page: 'index_template', + indexTemplate: dataStreamSettings?.indexTemplate ?? '', + }) + .then(({ path }) => setIndexTemplatePath(path)); + indexManagementLocator + ?.getLocation({ + page: 'component_template', + componentTemplate: `${getComponentTemplatePrefixFromIndexTemplate( + dataStreamSettings?.indexTemplate ?? name + )}@custom`, + }) + .then(({ path }) => setComponentTemplatePath(path)); + }, [ + locators, + setIndexTemplatePath, + dataStreamSettings?.indexTemplate, + indexManagementLocator, + name, + ]); + + const templateUrl = isIntegration ? componentTemplatePath : indexTemplatePath; + + const onClickHandler = useCallback(async () => { + const options = { + openInNewTab: true, + ...(templateUrl && { path: templateUrl }), + }; + + await application.navigateToApp(MANAGEMENT_APP_ID, options); + }, [application, templateUrl]); + + return ( + + + + + +

{otherMitigationsCustomComponentTemplate}

+
+
+
+
+ ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/manual/index.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/manual/index.tsx new file mode 100644 index 0000000000000..f931f3461fb57 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/manual/index.tsx @@ -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 React from 'react'; +import { EuiSkeletonRectangle, EuiSpacer } from '@elastic/eui'; +import { useDatasetQualityDetailsState } from '../../../../../hooks'; +import { CreateEditComponentTemplateLink } from './component_template_link'; +import { CreateEditPipelineLink } from './pipeline_link'; +import { otherMitigationsLoadingAriaText } from '../../../../../../common/translations'; + +export function ManualMitigations() { + const { integrationDetails, loadingState, dataStreamSettings } = useDatasetQualityDetailsState(); + const isIntegrationPresentInSettings = dataStreamSettings?.integration; + const isIntegration = !!integrationDetails?.integration; + const { dataStreamSettingsLoading, integrationDetailsLoadings } = loadingState; + + const hasIntegrationCheckCompleted = + !dataStreamSettingsLoading && + ((isIntegrationPresentInSettings && !integrationDetailsLoadings) || + !isIntegrationPresentInSettings); + + return ( + + + + + + ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/manual/pipeline_link.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/manual/pipeline_link.tsx new file mode 100644 index 0000000000000..6179a3ed0736c --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/manual/pipeline_link.tsx @@ -0,0 +1,136 @@ +/* + * 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, { useCallback, useMemo } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import { + copyToClipboard, + EuiAccordion, + EuiButtonIcon, + EuiFieldText, + EuiHorizontalRule, + EuiLink, + EuiPanel, + EuiSpacer, + EuiTitle, + useGeneratedHtmlId, +} from '@elastic/eui'; +import { + manualMitigationCustomPipelineCopyPipelineNameAriaText, + manualMitigationCustomPipelineCreateEditPipelineLink, + otherMitigationsCustomIngestPipeline, +} from '../../../../../../common/translations'; +import { useKibanaContextForPlugin } from '../../../../../utils'; +import { useDatasetQualityDetailsState } from '../../../../../hooks'; + +const AccordionTitle = () => ( + +
{otherMitigationsCustomIngestPipeline}
+
+); + +export function CreateEditPipelineLink({ isIntegration }: { isIntegration: boolean }) { + const { + services: { + share: { + url: { locators }, + }, + }, + } = useKibanaContextForPlugin(); + + const accordionId = useGeneratedHtmlId({ + prefix: otherMitigationsCustomIngestPipeline, + }); + + const { datasetDetails } = useDatasetQualityDetailsState(); + const { type, name } = datasetDetails; + + const pipelineName = useMemo( + () => (isIntegration ? `${type}-${name}@custom` : `${type}@custom`), + [isIntegration, type, name] + ); + + const ingestPipelineLocator = locators.get('INGEST_PIPELINES_APP_LOCATOR'); + + const pipelineUrl = ingestPipelineLocator?.useUrl( + { pipelineId: pipelineName, page: 'pipelines_list' }, + {}, + [pipelineName] + ); + + const onClickHandler = useCallback(() => { + copyToClipboard(pipelineName); + }, [pipelineName]); + + return ( + + } + paddingSize="none" + initialIsOpen={true} + data-test-subj="datasetQualityManualMitigationsPipelineAccordion" + > + + + {i18n.translate('xpack.datasetQuality.editPipeline.strong.Label', { + defaultMessage: '1.', + })} + + ), + }} + /> + + + } + readOnly={true} + aria-label={manualMitigationCustomPipelineCopyPipelineNameAriaText} + value={pipelineName} + data-test-subj="datasetQualityManualMitigationsPipelineName" + fullWidth + /> + + + {i18n.translate('xpack.datasetQuality.editPipeline.strong.Label', { + defaultMessage: '2.', + })} + + ), + createEditPipelineLink: ( + + {manualMitigationCustomPipelineCreateEditPipelineLink} + + ), + }} + /> + + + + ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/title.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/title.tsx new file mode 100644 index 0000000000000..93e253b0f849c --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/degraded_field_flyout/possible_mitigations/title.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiBetaBadge, EuiFlexGroup, EuiIcon, EuiTitle } from '@elastic/eui'; + +import { + overviewQualityIssuesAccordionTechPreviewBadge, + possibleMitigationTitle, +} from '../../../../../common/translations'; + +export function PossibleMitigationTitle() { + return ( + + + +

{possibleMitigationTitle}

+
+ +
+ ); +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/degraded_fields.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/degraded_fields.tsx index b33bd11dbe3a6..0cdc460cd56dc 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/degraded_fields.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/dataset_quality_details/overview/degraded_fields/degraded_fields.tsx @@ -45,6 +45,7 @@ export function DegradedFields() { aria-describedby={toggleTextSwitchId} compressed data-test-subj="datasetQualityDetailsOverviewDegradedFieldToggleSwitch" + css={{ marginRight: '5px' }} /> diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_fields.ts b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_fields.ts index 78ad0e53dd5e2..49ceb50abc3cd 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_fields.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_fields.ts @@ -104,20 +104,25 @@ export function useDegradedFields() { }, [service]); const degradedFieldValues = useSelector(service, (state) => - state.matches('initializing.degradedFieldFlyout.open.ignoredValues.done') + state.matches('initializing.degradedFieldFlyout.open.initialized.ignoredValues.done') ? state.context.degradedFieldValues : undefined ); const degradedFieldAnalysis = useSelector(service, (state) => - state.matches('initializing.degradedFieldFlyout.open.analyze.done') + state.matches('initializing.degradedFieldFlyout.open.initialized.mitigation.analyzed') || + state.matches('initializing.degradedFieldFlyout.open.initialized.mitigation.mitigating') || + state.matches( + 'initializing.degradedFieldFlyout.open.initialized.mitigation.askingForRollover' + ) || + state.matches('initializing.degradedFieldFlyout.open.initialized.mitigation.rollingOver') || + state.matches('initializing.degradedFieldFlyout.open.initialized.mitigation.success') || + state.matches('initializing.degradedFieldFlyout.open.initialized.mitigation.error') ? state.context.degradedFieldAnalysis : undefined ); - // This piece only cater field limit issue at the moment. - // In future this will cater the other 2 reasons as well - const degradedFieldAnalysisResult = useMemo(() => { + const degradedFieldAnalysisFormattedResult = useMemo(() => { if (!degradedFieldAnalysis) { return undefined; } @@ -127,8 +132,8 @@ export function useDegradedFields() { return { potentialCause: degradedFieldCauseFieldLimitExceeded, tooltipContent: degradedFieldCauseFieldLimitExceededTooltip, - shouldDisplayMitigation: true, - shouldDisplayValues: false, + shouldDisplayIgnoredValuesAndLimit: false, + identifiedUsingHeuristics: true, }; } @@ -143,8 +148,8 @@ export function useDegradedFields() { return { potentialCause: degradedFieldCauseFieldIgnored, tooltipContent: degradedFieldCauseFieldIgnoredTooltip, - shouldDisplayMitigation: false, - shouldDisplayValues: true, + shouldDisplayIgnoredValuesAndLimit: true, + identifiedUsingHeuristics: true, }; } } @@ -153,19 +158,59 @@ export function useDegradedFields() { return { potentialCause: degradedFieldCauseFieldMalformed, tooltipContent: degradedFieldCauseFieldMalformedTooltip, - shouldDisplayMitigation: false, - shouldDisplayValues: false, + shouldDisplayIgnoredValuesAndLimit: false, + identifiedUsingHeuristics: false, // TODO: Add heuristics to identify ignore_malformed issues }; }, [degradedFieldAnalysis, degradedFieldValues]); const isDegradedFieldsValueLoading = useSelector(service, (state) => { - return state.matches('initializing.degradedFieldFlyout.open.ignoredValues.fetching'); + return state.matches( + 'initializing.degradedFieldFlyout.open.initialized.ignoredValues.fetching' + ); + }); + + const isRolloverRequired = useSelector(service, (state) => { + return state.matches( + 'initializing.degradedFieldFlyout.open.initialized.mitigation.askingForRollover' + ); + }); + + const isMitigationAppliedSuccessfully = useSelector(service, (state) => { + return state.matches('initializing.degradedFieldFlyout.open.initialized.mitigation.success'); }); const isAnalysisInProgress = useSelector(service, (state) => { - return state.matches('initializing.degradedFieldFlyout.open.analyze.fetching'); + return state.matches('initializing.degradedFieldFlyout.open.initialized.mitigation.analyzing'); + }); + + const isRolloverInProgress = useSelector(service, (state) => { + return state.matches( + 'initializing.degradedFieldFlyout.open.initialized.mitigation.rollingOver' + ); + }); + + const updateNewFieldLimit = useCallback( + (newFieldLimit: number) => { + service.send({ type: 'SET_NEW_FIELD_LIMIT', newFieldLimit }); + }, + [service] + ); + + const isMitigationInProgress = useSelector(service, (state) => { + return state.matches('initializing.degradedFieldFlyout.open.initialized.mitigation.mitigating'); }); + const newFieldLimitData = useSelector(service, (state) => + state.matches('initializing.degradedFieldFlyout.open.initialized.mitigation.success') || + state.matches('initializing.degradedFieldFlyout.open.initialized.mitigation.error') + ? state.context.fieldLimit + : undefined + ); + + const triggerRollover = useCallback(() => { + service.send('ROLLOVER_DATA_STREAM'); + }, [service]); + return { isDegradedFieldsLoading, pagination, @@ -181,9 +226,16 @@ export function useDegradedFields() { isDegradedFieldsValueLoading, isAnalysisInProgress, degradedFieldAnalysis, - degradedFieldAnalysisResult, + degradedFieldAnalysisFormattedResult, toggleCurrentQualityIssues, showCurrentQualityIssues, expandedRenderedItem, + updateNewFieldLimit, + isMitigationInProgress, + isRolloverInProgress, + newFieldLimitData, + isRolloverRequired, + isMitigationAppliedSuccessfully, + triggerRollover, }; } diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts index 9175d06e105b4..827cd4b0a1e49 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/data_stream_details_client.ts @@ -8,6 +8,8 @@ import { HttpStart } from '@kbn/core/public'; import { decodeOrThrow } from '@kbn/io-ts-utils'; import { + DataStreamRolloverResponse, + dataStreamRolloverResponseRt, DegradedFieldAnalysis, degradedFieldAnalysisRt, DegradedFieldValues, @@ -19,6 +21,8 @@ import { IntegrationDashboardsResponse, integrationDashboardsRT, IntegrationResponse, + UpdateFieldLimitResponse, + updateFieldLimitResponseRt, } from '../../../common/api_types'; import { DataStreamDetails, @@ -37,6 +41,7 @@ import { Integration } from '../../../common/data_streams_stats/integration'; import { AnalyzeDegradedFieldsParams, GetDataStreamIntegrationParams, + UpdateFieldLimitParams, } from '../../../common/data_stream_details/types'; import { DatasetQualityError } from '../../../common/errors'; @@ -196,4 +201,46 @@ export class DataStreamDetailsClient implements IDataStreamDetailsClient { new DatasetQualityError(`Failed to decode the analysis response: ${message}`) )(response); } + + public async setNewFieldLimit({ + dataStream, + newFieldLimit, + }: UpdateFieldLimitParams): Promise { + const response = await this.http + .put( + `/internal/dataset_quality/data_streams/${dataStream}/update_field_limit`, + { body: JSON.stringify({ newFieldLimit }) } + ) + .catch((error) => { + throw new DatasetQualityError(`Failed to set new Limit: ${error.message}`, error); + }); + + const decodedResponse = decodeOrThrow( + updateFieldLimitResponseRt, + (message: string) => + new DatasetQualityError(`Failed to decode setting of new limit response: ${message}"`) + )(response); + + return decodedResponse; + } + + public async rolloverDataStream({ + dataStream, + }: { + dataStream: string; + }): Promise { + const response = await this.http + .post( + `/internal/dataset_quality/data_streams/${dataStream}/rollover` + ) + .catch((error) => { + throw new DatasetQualityError(`Failed to rollover datastream": ${error}`, error); + }); + + return decodeOrThrow( + dataStreamRolloverResponseRt, + (message: string) => + new DatasetQualityError(`Failed to decode rollover response: ${message}"`) + )(response); + } } diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts index a2f7db99e5af1..6eac8bd732840 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/services/data_stream_details/types.ts @@ -20,8 +20,15 @@ import { import { AnalyzeDegradedFieldsParams, GetDataStreamIntegrationParams, + UpdateFieldLimitParams, } from '../../../common/data_stream_details/types'; -import { Dashboard, DegradedFieldAnalysis, DegradedFieldValues } from '../../../common/api_types'; +import { + Dashboard, + DataStreamRolloverResponse, + DegradedFieldAnalysis, + DegradedFieldValues, + UpdateFieldLimitResponse, +} from '../../../common/api_types'; export type DataStreamDetailsServiceSetup = void; @@ -47,4 +54,6 @@ export interface IDataStreamDetailsClient { params: GetDataStreamIntegrationParams ): Promise; analyzeDegradedField(params: AnalyzeDegradedFieldsParams): Promise; + setNewFieldLimit(params: UpdateFieldLimitParams): Promise; + rolloverDataStream(params: { dataStream: string }): Promise; } diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/notifications.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/notifications.ts index b501fd02bdcf3..f5fdd063492a3 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/notifications.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/notifications.ts @@ -59,3 +59,28 @@ export const fetchDataStreamIntegrationFailedNotifier = ( text: error.message, }); }; + +export const updateFieldLimitFailedNotifier = (toasts: IToasts, error: Error) => { + toasts.addDanger({ + title: i18n.translate('xpack.datasetQuality.details.updateFieldLimitFailed', { + defaultMessage: "We couldn't update the field limit.", + }), + text: error.message, + }); +}; + +export const rolloverDataStreamFailedNotifier = ( + toasts: IToasts, + error: Error, + dataStream: string +) => { + toasts.addDanger({ + title: i18n.translate('xpack.datasetQuality.details.rolloverDataStreamFailed', { + defaultMessage: "We couldn't rollover the data stream: {dataStream}.", + values: { + dataStream, + }, + }), + text: error.message, + }); +}; diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/state_machine.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/state_machine.ts index 352aff140c275..8ac65a7dca4a7 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/state_machine.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/state_machine.ts @@ -25,6 +25,7 @@ import { DegradedFieldResponse, DegradedFieldValues, NonAggregatableDatasets, + UpdateFieldLimitResponse, } from '../../../common/api_types'; import { fetchNonAggregatableDatasetsFailedNotifier } from '../common/notifications'; import { @@ -33,6 +34,8 @@ import { fetchDataStreamSettingsFailedNotifier, fetchDataStreamIntegrationFailedNotifier, fetchIntegrationDashboardsFailedNotifier, + updateFieldLimitFailedNotifier, + rolloverDataStreamFailedNotifier, } from './notifications'; import { Integration } from '../../../common/data_streams_stats/integration'; @@ -189,10 +192,6 @@ export const createPureDatasetQualityDetailsControllerStateMachine = ( }, done: { on: { - UPDATE_TIME_RANGE: { - target: 'fetching', - actions: ['resetDegradedFieldPageAndRowsPerPage'], - }, UPDATE_DEGRADED_FIELDS_TABLE_CRITERIA: { target: 'done', actions: ['storeDegradedFieldTableOptions'], @@ -200,7 +199,10 @@ export const createPureDatasetQualityDetailsControllerStateMachine = ( OPEN_DEGRADED_FIELD_FLYOUT: { target: '#DatasetQualityDetailsController.initializing.degradedFieldFlyout.open', - actions: ['storeExpandedDegradedField'], + actions: [ + 'storeExpandedDegradedField', + 'resetFieldLimitServerResponse', + ], }, TOGGLE_CURRENT_QUALITY_ISSUES: { target: 'fetching', @@ -282,48 +284,105 @@ export const createPureDatasetQualityDetailsControllerStateMachine = ( ], }, open: { - type: 'parallel', + initial: 'initialized', states: { - ignoredValues: { - initial: 'fetching', + initialized: { + type: 'parallel', states: { - fetching: { - invoke: { - src: 'loadDegradedFieldValues', - onDone: { - target: 'done', - actions: ['storeDegradedFieldValues'], - }, - onError: [ - { - target: '#DatasetQualityDetailsController.indexNotFound', - cond: 'isIndexNotFoundError', - }, - { - target: 'done', + ignoredValues: { + initial: 'fetching', + states: { + fetching: { + invoke: { + src: 'loadDegradedFieldValues', + onDone: { + target: 'done', + actions: ['storeDegradedFieldValues'], + }, + onError: [ + { + target: '#DatasetQualityDetailsController.indexNotFound', + cond: 'isIndexNotFoundError', + }, + { + target: 'done', + }, + ], }, - ], + }, + done: {}, }, }, - done: {}, - }, - }, - analyze: { - initial: 'fetching', - states: { - fetching: { - invoke: { - src: 'analyzeDegradedField', - onDone: { - target: 'done', - actions: ['storeDegradedFieldAnalysis'], + mitigation: { + initial: 'analyzing', + states: { + analyzing: { + invoke: { + src: 'analyzeDegradedField', + onDone: { + target: 'analyzed', + actions: ['storeDegradedFieldAnalysis'], + }, + onError: { + target: 'analyzed', + }, + }, }, - onError: { - target: 'done', + analyzed: { + on: { + SET_NEW_FIELD_LIMIT: { + target: 'mitigating', + actions: 'storeNewFieldLimit', + }, + }, + }, + mitigating: { + invoke: { + src: 'saveNewFieldLimit', + onDone: [ + { + target: 'askingForRollover', + actions: 'storeNewFieldLimitResponse', + cond: 'hasFailedToUpdateLastBackingIndex', + }, + { + target: 'success', + actions: 'storeNewFieldLimitResponse', + }, + ], + onError: { + target: 'error', + actions: [ + 'storeNewFieldLimitErrorResponse', + 'notifySaveNewFieldLimitError', + ], + }, + }, + }, + askingForRollover: { + on: { + ROLLOVER_DATA_STREAM: { + target: 'rollingOver', + }, + }, + }, + rollingOver: { + invoke: { + src: 'rolloverDataStream', + onDone: { + target: 'success', + actions: ['raiseForceTimeRangeRefresh'], + }, + onError: { + target: 'error', + actions: 'notifySaveNewFieldLimitError', + }, + }, }, + success: {}, + error: {}, }, }, - done: {}, }, }, }, @@ -482,9 +541,28 @@ export const createPureDatasetQualityDetailsControllerStateMachine = ( isIndexNotFoundError: true, }; }), + storeNewFieldLimit: assign((_, event) => { + return 'newFieldLimit' in event + ? { fieldLimit: { newFieldLimit: event.newFieldLimit } } + : {}; + }), + storeNewFieldLimitResponse: assign( + (context, event: DoneInvokeEvent) => { + return 'data' in event + ? { fieldLimit: { ...context.fieldLimit, result: event.data, error: false } } + : {}; + } + ), + storeNewFieldLimitErrorResponse: assign((context) => { + return { fieldLimit: { ...context.fieldLimit, error: true } }; + }), + resetFieldLimitServerResponse: assign(() => ({ + fieldLimit: undefined, + })), + raiseForceTimeRangeRefresh: raise('UPDATE_TIME_RANGE'), }, guards: { - checkIfActionForbidden: (context, event) => { + checkIfActionForbidden: (_, event) => { return ( 'data' in event && typeof event.data === 'object' && @@ -516,6 +594,14 @@ export const createPureDatasetQualityDetailsControllerStateMachine = ( hasNoDegradedFieldsSelected: (context) => { return !Boolean(context.expandedDegradedField); }, + hasFailedToUpdateLastBackingIndex: (_, event) => { + return ( + 'data' in event && + typeof event.data === 'object' && + 'isLatestBackingIndexUpdated' in event.data && + !event.data.isLatestBackingIndexUpdated + ); + }, }, } ); @@ -552,6 +638,10 @@ export const createDatasetQualityDetailsControllerStateMachine = ({ 'dataStreamSettings' in context ? context.dataStreamSettings?.integration : undefined; return fetchDataStreamIntegrationFailedNotifier(toasts, event.data, integrationName); }, + notifySaveNewFieldLimitError: (_context, event: DoneInvokeEvent) => + updateFieldLimitFailedNotifier(toasts, event.data), + notifyRolloverDataStreamError: (context, event: DoneInvokeEvent) => + rolloverDataStreamFailedNotifier(toasts, event.data, context.dataStream), }, services: { checkDatasetIsAggregatable: (context) => { @@ -603,7 +693,8 @@ export const createDatasetQualityDetailsControllerStateMachine = ({ dataStream: context.showCurrentQualityIssues && 'dataStreamSettings' in context && - context.dataStreamSettings + context.dataStreamSettings && + context.dataStreamSettings.lastBackingIndexName ? context.dataStreamSettings.lastBackingIndexName : context.dataStream, start, @@ -661,6 +752,21 @@ export const createDatasetQualityDetailsControllerStateMachine = ({ return Promise.resolve(); }, + saveNewFieldLimit: (context) => { + if ('fieldLimit' in context && context.fieldLimit && context.fieldLimit.newFieldLimit) { + return dataStreamDetailsClient.setNewFieldLimit({ + dataStream: context.dataStream, + newFieldLimit: context.fieldLimit.newFieldLimit, + }); + } + + return Promise.resolve(); + }, + rolloverDataStream: (context) => { + return dataStreamDetailsClient.rolloverDataStream({ + dataStream: context.dataStream, + }); + }, }, }); diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/types.ts b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/types.ts index cdf3bfa579e55..cdebcfbe53d86 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/types.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/state_machines/dataset_quality_details_controller/types.ts @@ -10,12 +10,14 @@ import type { DegradedFieldSortField } from '../../hooks'; import { Dashboard, DataStreamDetails, + DataStreamRolloverResponse, DataStreamSettings, DegradedField, DegradedFieldAnalysis, DegradedFieldResponse, DegradedFieldValues, NonAggregatableDatasets, + UpdateFieldLimitResponse, } from '../../../common/api_types'; import { TableCriteria, TimeRangeConfig } from '../../../common/types'; import { Integration } from '../../../common/data_streams_stats/integration'; @@ -37,6 +39,12 @@ export interface DegradedFieldsWithData { data: DegradedField[]; } +export interface FieldLimit { + newFieldLimit?: number; + result?: UpdateFieldLimitResponse; + error?: boolean; +} + export interface WithDefaultControllerState { dataStream: string; degradedFields: DegradedFieldsTableConfig; @@ -48,6 +56,7 @@ export interface WithDefaultControllerState { integration?: Integration; expandedDegradedField?: string; isNonAggregatable?: boolean; + fieldLimit?: FieldLimit; } export interface WithDataStreamDetails { @@ -87,6 +96,16 @@ export interface WithDegradeFieldAnalysis { degradedFieldAnalysis: DegradedFieldAnalysis; } +export interface WithNewFieldLimit { + fieldLimit?: FieldLimit & { + newFieldLimit: number; + }; +} + +export interface WithNewFieldLimitResponse { + fieldLimit: FieldLimit; +} + export type DefaultDatasetQualityDetailsContext = Pick< WithDefaultControllerState, 'degradedFields' | 'timeRange' | 'isIndexNotFoundError' | 'showCurrentQualityIssues' @@ -128,38 +147,50 @@ export type DatasetQualityDetailsControllerTypeState = } | { value: - | 'initializing.degradedFieldFlyout.open.ignoredValues.fetching' - | 'initializing.degradedFieldFlyout.open.analyze.fetching'; + | 'initializing.dataStreamSettings.loadingIntegrationsAndDegradedFields' + | 'initializing.dataStreamSettings.loadingIntegrationsAndDegradedFields.integrationDetails.fetching' + | 'initializing.dataStreamSettings.loadingIntegrationsAndDegradedFields.integrationDashboards.fetching' + | 'initializing.dataStreamSettings.loadingIntegrationsAndDegradedFields.integrationDashboards.unauthorized'; + context: WithDefaultControllerState & WithDataStreamSettings; + } + | { + value: + | 'initializing.dataStreamSettings.loadingIntegrationsAndDegradedFields.integrationDetails.done' + | 'initializing.dataStreamSettings.loadingIntegrationsAndDegradedFields.integrationDashboards.done'; + context: WithDefaultControllerState & WithDataStreamSettings & WithIntegration; + } + | { + value: 'initializing.degradedFieldFlyout.open'; + context: WithDefaultControllerState; + } + | { + value: + | 'initializing.degradedFieldFlyout.open.initialized.ignoredValues.fetching' + | 'initializing.degradedFieldFlyout.open.initialized.mitigation.analyzing'; context: WithDefaultControllerState & WithDegradedFieldsData; } | { - value: 'initializing.degradedFieldFlyout.open.ignoredValues.done'; + value: 'initializing.degradedFieldFlyout.open.initialized.ignoredValues.done'; context: WithDefaultControllerState & WithDegradedFieldsData & WithDegradedFieldValues; } | { - value: 'initializing.degradedFieldFlyout.open.analyze.done'; + value: + | 'initializing.degradedFieldFlyout.open.initialized.mitigation.analyzed' + | 'initializing.degradedFieldFlyout.open.initialized.mitigation.mitigating' + | 'initializing.degradedFieldFlyout.open.initialized.mitigation.askingForRollover' + | 'initializing.degradedFieldFlyout.open.initialized.mitigation.rollingOver' + | 'initializing.degradedFieldFlyout.open.initialized.mitigation.success' + | 'initializing.degradedFieldFlyout.open.initialized.mitigation.error'; context: WithDefaultControllerState & WithDegradedFieldsData & WithDegradeFieldAnalysis; } | { - value: 'initializing.degradedFieldFlyout.open'; + value: 'initializing.degradedFieldFlyout.open.initialized.mitigation.success'; context: WithDefaultControllerState & WithDegradedFieldsData & WithDegradedFieldValues & - WithDegradeFieldAnalysis; - } - | { - value: - | 'initializing.dataStreamSettings.loadingIntegrationsAndDegradedFields' - | 'initializing.dataStreamSettings.loadingIntegrationsAndDegradedFields.integrationDetails.fetching' - | 'initializing.dataStreamSettings.loadingIntegrationsAndDegradedFields.integrationDashboards.fetching' - | 'initializing.dataStreamSettings.loadingIntegrationsAndDegradedFields.integrationDashboards.unauthorized'; - context: WithDefaultControllerState & WithDataStreamSettings; - } - | { - value: - | 'initializing.dataStreamSettings.loadingIntegrationsAndDegradedFields.integrationDetails.done' - | 'initializing.dataStreamSettings.loadingIntegrationsAndDegradedFields.integrationDashboards.done'; - context: WithDefaultControllerState & WithDataStreamSettings & WithIntegration; + WithDegradeFieldAnalysis & + WithNewFieldLimit & + WithNewFieldLimitResponse; }; export type DatasetQualityDetailsControllerContext = @@ -188,6 +219,13 @@ export type DatasetQualityDetailsControllerEvent = type: 'UPDATE_DEGRADED_FIELDS_TABLE_CRITERIA'; degraded_field_criteria: TableCriteria; } + | { + type: 'SET_NEW_FIELD_LIMIT'; + newFieldLimit: number; + } + | { + type: 'ROLLOVER_DATA_STREAM'; + } | DoneInvokeEvent | DoneInvokeEvent | DoneInvokeEvent @@ -197,4 +235,6 @@ export type DatasetQualityDetailsControllerEvent = | DoneInvokeEvent | DoneInvokeEvent | DoneInvokeEvent - | DoneInvokeEvent; + | DoneInvokeEvent + | DoneInvokeEvent + | DoneInvokeEvent; diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/index.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/index.ts index eb1d70b867dc4..288eff11b92a8 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/index.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_data_stream_details/index.ts @@ -29,8 +29,6 @@ export async function getDataStreamSettings({ esClient: ElasticsearchClient; dataStream: string; }): Promise { - throwIfInvalidDataStreamParams(dataStream); - const [createdOn, [dataStreamInfo], datasetUserPrivileges] = await Promise.all([ getDataStreamCreatedOn(esClient, dataStream), dataStreamService.getMatchingDataStreams(esClient, dataStream), @@ -39,12 +37,14 @@ export async function getDataStreamSettings({ const integration = dataStreamInfo?._meta?.package?.name; const lastBackingIndex = dataStreamInfo?.indices?.slice(-1)[0]; + const indexTemplate = dataStreamInfo?.template; return { createdOn, integration, datasetUserPrivileges, lastBackingIndexName: lastBackingIndex?.index_name, + indexTemplate, }; } diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_field_analysis/get_datastream_settings.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_field_analysis/get_datastream_settings.ts index 433086c0b3e52..cbaa637dc60bc 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_field_analysis/get_datastream_settings.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_field_analysis/get_datastream_settings.ts @@ -13,6 +13,7 @@ export interface DataStreamSettingResponse { totalFieldLimit: number; ignoreDynamicBeyondLimit?: boolean; ignoreMalformed?: boolean; + defaultPipeline?: string; } const DEFAULT_FIELD_LIMIT = 1000; @@ -28,16 +29,20 @@ export async function getDataStreamSettings({ lastBackingIndex: string; }): Promise { const settings = await datasetQualityESClient.settings({ index: dataStream }); - const indexSettings = settings[lastBackingIndex]?.settings?.index?.mapping; + const setting = settings[lastBackingIndex]?.settings; + const mappingsInsideSettings = setting?.index?.mapping; return { - nestedFieldLimit: indexSettings?.nested_fields?.limit - ? Number(indexSettings?.nested_fields?.limit) + nestedFieldLimit: mappingsInsideSettings?.nested_fields?.limit + ? Number(mappingsInsideSettings?.nested_fields?.limit) : DEFAULT_NESTED_FIELD_LIMIT, - totalFieldLimit: indexSettings?.total_fields?.limit - ? Number(indexSettings?.total_fields?.limit) + totalFieldLimit: mappingsInsideSettings?.total_fields?.limit + ? Number(mappingsInsideSettings?.total_fields?.limit) : DEFAULT_FIELD_LIMIT, - ignoreDynamicBeyondLimit: toBoolean(indexSettings?.total_fields?.ignore_dynamic_beyond_limit), - ignoreMalformed: toBoolean(indexSettings?.ignore_malformed), + ignoreDynamicBeyondLimit: toBoolean( + mappingsInsideSettings?.total_fields?.ignore_dynamic_beyond_limit + ), + ignoreMalformed: toBoolean(mappingsInsideSettings?.ignore_malformed), + defaultPipeline: setting?.index?.default_pipeline, }; } diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_field_analysis/index.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_field_analysis/index.ts index a0e7606b475b2..97ff0b124aae9 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_field_analysis/index.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/get_degraded_field_analysis/index.ts @@ -28,7 +28,13 @@ export async function analyzeDegradedField({ const [ { fieldCount, fieldPresent, fieldMapping }, - { nestedFieldLimit, totalFieldLimit, ignoreDynamicBeyondLimit, ignoreMalformed }, + { + nestedFieldLimit, + totalFieldLimit, + ignoreDynamicBeyondLimit, + ignoreMalformed, + defaultPipeline, + }, ] = await Promise.all([ getDataStreamMapping({ datasetQualityESClient, @@ -48,5 +54,6 @@ export async function analyzeDegradedField({ totalFieldLimit, ignoreMalformed, nestedFieldLimit, + defaultPipeline, }; } diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts index 047004d58a6a2..41ba3ee8c7299 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/routes.ts @@ -16,6 +16,8 @@ import { DatasetUserPrivileges, DegradedFieldValues, DegradedFieldAnalysis, + UpdateFieldLimitResponse, + DataStreamRolloverResponse, } from '../../../common/api_types'; import { rangeRt, typeRt, typesRt } from '../../types/default_api_types'; import { createDatasetQualityServerRoute } from '../create_datasets_quality_server_route'; @@ -29,6 +31,8 @@ import { getDegradedFields } from './get_degraded_fields'; import { getDegradedFieldValues } from './get_degraded_field_values'; import { analyzeDegradedField } from './get_degraded_field_analysis'; import { getDataStreamsMeteringStats } from './get_data_streams_metering_stats'; +import { updateFieldLimit } from './update_field_limit'; +import { createDatasetQualityESClient } from '../../utils'; const statsRoute = createDatasetQualityServerRoute({ endpoint: 'GET /internal/dataset_quality/data_streams/stats', @@ -324,6 +328,58 @@ const analyzeDegradedFieldRoute = createDatasetQualityServerRoute({ }, }); +const updateFieldLimitRoute = createDatasetQualityServerRoute({ + endpoint: 'PUT /internal/dataset_quality/data_streams/{dataStream}/update_field_limit', + params: t.type({ + path: t.type({ + dataStream: t.string, + }), + body: t.type({ + newFieldLimit: t.number, + }), + }), + options: { + tags: [], + }, + async handler(resources): Promise { + const { context, params } = resources; + const coreContext = await context.core; + const esClient = coreContext.elasticsearch.client.asCurrentUser; + + const updatedLimitResponse = await updateFieldLimit({ + esClient, + newFieldLimit: params.body.newFieldLimit, + dataStream: params.path.dataStream, + }); + + return updatedLimitResponse; + }, +}); + +const rolloverDataStream = createDatasetQualityServerRoute({ + endpoint: 'POST /internal/dataset_quality/data_streams/{dataStream}/rollover', + params: t.type({ + path: t.type({ + dataStream: t.string, + }), + }), + options: { + tags: [], + }, + async handler(resources): Promise { + const { context, params } = resources; + const coreContext = await context.core; + const esClient = coreContext.elasticsearch.client.asCurrentUser; + const datasetQualityESClient = createDatasetQualityESClient(esClient); + + const { acknowledged } = await datasetQualityESClient.rollover({ + alias: params.path.dataStream, + }); + + return { acknowledged }; + }, +}); + export const dataStreamsRouteRepository = { ...statsRoute, ...degradedDocsRoute, @@ -334,4 +390,6 @@ export const dataStreamsRouteRepository = { ...dataStreamDetailsRoute, ...dataStreamSettingsRoute, ...analyzeDegradedFieldRoute, + ...updateFieldLimitRoute, + ...rolloverDataStream, }; diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/update_field_limit/index.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/update_field_limit/index.ts new file mode 100644 index 0000000000000..f377ea1e2642c --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/update_field_limit/index.ts @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import { badRequest } from '@hapi/boom'; +import { createDatasetQualityESClient } from '../../../utils'; +import { updateComponentTemplate } from './update_component_template'; +import { updateLastBackingIndexSettings } from './update_settings_last_backing_index'; +import { UpdateFieldLimitResponse } from '../../../../common/api_types'; +import { getDataStreamSettings } from '../get_data_stream_details'; + +export async function updateFieldLimit({ + esClient, + newFieldLimit, + dataStream, +}: { + esClient: ElasticsearchClient; + newFieldLimit: number; + dataStream: string; +}): Promise { + const datasetQualityESClient = createDatasetQualityESClient(esClient); + + const { lastBackingIndexName, indexTemplate } = await getDataStreamSettings({ + esClient, + dataStream, + }); + + if (!lastBackingIndexName || !indexTemplate) { + throw badRequest(`Data stream does not exists. Received value "${dataStream}"`); + } + + const { + acknowledged: isComponentTemplateUpdated, + componentTemplateName, + error: errorUpdatingComponentTemplate, + } = await updateComponentTemplate({ datasetQualityESClient, indexTemplate, newFieldLimit }); + + if (errorUpdatingComponentTemplate) { + throw badRequest(errorUpdatingComponentTemplate); + } + + const { acknowledged: isLatestBackingIndexUpdated, error: errorUpdatingBackingIndex } = + await updateLastBackingIndexSettings({ + datasetQualityESClient, + lastBackingIndex: lastBackingIndexName, + newFieldLimit, + }); + + return { + isComponentTemplateUpdated, + isLatestBackingIndexUpdated, + customComponentTemplateName: componentTemplateName, + error: errorUpdatingBackingIndex, + }; +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/update_field_limit/update_component_template.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/update_field_limit/update_component_template.ts new file mode 100644 index 0000000000000..0bf19410bd6ac --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/update_field_limit/update_component_template.ts @@ -0,0 +1,53 @@ +/* + * 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 { DatasetQualityESClient } from '../../../utils/create_dataset_quality_es_client'; +import { getComponentTemplatePrefixFromIndexTemplate } from '../../../../common/utils/component_template_name'; + +interface UpdateComponentTemplateResponse { + acknowledged: boolean | undefined; + componentTemplateName: string; + error?: string; +} + +export async function updateComponentTemplate({ + datasetQualityESClient, + indexTemplate, + newFieldLimit, +}: { + datasetQualityESClient: DatasetQualityESClient; + indexTemplate: string; + newFieldLimit: number; +}): Promise { + const newSettings = { + settings: { + 'index.mapping.total_fields.limit': newFieldLimit, + }, + }; + + const customComponentTemplateName = `${getComponentTemplatePrefixFromIndexTemplate( + indexTemplate + )}@custom`; + + try { + const { acknowledged } = await datasetQualityESClient.updateComponentTemplate({ + name: customComponentTemplateName, + template: newSettings, + }); + + return { + acknowledged, + componentTemplateName: customComponentTemplateName, + }; + } catch (error) { + return { + acknowledged: undefined, // acknowledge is undefined when the request fails + componentTemplateName: customComponentTemplateName, + error: error.message, + }; + } +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/update_field_limit/update_settings_last_backing_index.ts b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/update_field_limit/update_settings_last_backing_index.ts new file mode 100644 index 0000000000000..b98a315547554 --- /dev/null +++ b/x-pack/plugins/observability_solution/dataset_quality/server/routes/data_streams/update_field_limit/update_settings_last_backing_index.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DatasetQualityESClient } from '../../../utils/create_dataset_quality_es_client'; + +interface UpdateLastBackingIndexSettingsResponse { + acknowledged: boolean | undefined; + error?: string; +} + +export async function updateLastBackingIndexSettings({ + datasetQualityESClient, + lastBackingIndex, + newFieldLimit, +}: { + datasetQualityESClient: DatasetQualityESClient; + lastBackingIndex: string; + newFieldLimit: number; +}): Promise { + const newSettings = { + 'index.mapping.total_fields.limit': newFieldLimit, + }; + + try { + const { acknowledged } = await datasetQualityESClient.updateSettings({ + index: lastBackingIndex, + settings: newSettings, + }); + + return { acknowledged }; + } catch (error) { + return { + acknowledged: undefined, // acknowledge is undefined when the request fails + error: error.message, + }; + } +} diff --git a/x-pack/plugins/observability_solution/dataset_quality/server/utils/create_dataset_quality_es_client.ts b/x-pack/plugins/observability_solution/dataset_quality/server/utils/create_dataset_quality_es_client.ts index baa2403690fd8..8a78b4163da95 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/server/utils/create_dataset_quality_es_client.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/server/utils/create_dataset_quality_es_client.ts @@ -8,11 +8,16 @@ import { ESSearchRequest, InferSearchResponseOf } from '@kbn/es-types'; import { ElasticsearchClient } from '@kbn/core/server'; import { + ClusterPutComponentTemplateRequest, + ClusterPutComponentTemplateResponse, FieldCapsRequest, FieldCapsResponse, Indices, IndicesGetMappingResponse, IndicesGetSettingsResponse, + IndicesPutSettingsRequest, + IndicesPutSettingsResponse, + IndicesRolloverResponse, } from '@elastic/elasticsearch/lib/api/types'; type DatasetQualityESSearchParams = ESSearchRequest & { @@ -23,12 +28,12 @@ export type DatasetQualityESClient = ReturnType( + search( searchParams: TParams ): Promise> { return esClient.search(searchParams) as Promise; }, - async msearch( + msearch( index = {} as { index?: Indices }, searches: TParams[] ): Promise<{ @@ -38,14 +43,25 @@ export function createDatasetQualityESClient(esClient: ElasticsearchClient) { searches: searches.map((search) => [index, search]).flat(), }) as Promise; }, - async fieldCaps(params: FieldCapsRequest): Promise { - return esClient.fieldCaps(params) as Promise; + fieldCaps(params: FieldCapsRequest): Promise { + return esClient.fieldCaps(params); }, - async mappings(params: { index: string }): Promise { + mappings(params: { index: string }): Promise { return esClient.indices.getMapping(params); }, - async settings(params: { index: string }): Promise { + settings(params: { index: string }): Promise { return esClient.indices.getSettings(params); }, + updateComponentTemplate( + params: ClusterPutComponentTemplateRequest + ): Promise { + return esClient.cluster.putComponentTemplate(params); + }, + updateSettings(params: IndicesPutSettingsRequest): Promise { + return esClient.indices.putSettings(params); + }, + rollover(params: { alias: string }): Promise { + return esClient.indices.rollover(params); + }, }; } diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/data_stream_rollover.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/data_stream_rollover.ts new file mode 100644 index 0000000000000..d11d93d9eae51 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/data_stream_rollover.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { log, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; + +import { DeploymentAgnosticFtrProviderContext } from '../../../ftr_provider_context'; +import { SupertestWithRoleScopeType } from '../../../services'; + +export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { + const roleScopedSupertest = getService('roleScopedSupertest'); + const synthtrace = getService('logsSynthtraceEsClient'); + const start = '2024-10-17T11:00:00.000Z'; + const end = '2024-10-17T11:01:00.000Z'; + const type = 'logs'; + const dataset = 'synth'; + const namespace = 'default'; + const serviceName = 'my-service'; + const hostName = 'synth-host'; + const dataStreamName = `${type}-${dataset}-${namespace}`; + + async function callApiAs({ + roleScopedSupertestWithCookieCredentials, + apiParams: { dataStream }, + }: { + roleScopedSupertestWithCookieCredentials: SupertestWithRoleScopeType; + apiParams: { + dataStream: string; + }; + }) { + return roleScopedSupertestWithCookieCredentials.post( + `/internal/dataset_quality/data_streams/${dataStream}/rollover` + ); + } + + describe('Datastream Rollover', function () { + let supertestAdminWithCookieCredentials: SupertestWithRoleScopeType; + + before(async () => { + supertestAdminWithCookieCredentials = await roleScopedSupertest.getSupertestWithRoleScope( + 'admin', + { + useCookieHeader: true, + withInternalHeaders: true, + } + ); + await synthtrace.index([ + timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a log message') + .timestamp(timestamp) + .dataset(dataset) + .namespace(namespace) + .defaults({ + 'log.file.path': '/my-service.log', + 'service.name': serviceName, + 'host.name': hostName, + }) + ), + ]); + }); + + after(async () => { + await synthtrace.clean(); + }); + + it('returns acknowledged when rollover is successful', async () => { + const resp = await callApiAs({ + roleScopedSupertestWithCookieCredentials: supertestAdminWithCookieCredentials, + apiParams: { + dataStream: dataStreamName, + }, + }); + + expect(resp.body.acknowledged).to.be(true); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/data_stream_settings.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/data_stream_settings.ts new file mode 100644 index 0000000000000..16c463e8caf6c --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/data_stream_settings.ts @@ -0,0 +1,251 @@ +/* + * 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 { log, timerange } from '@kbn/apm-synthtrace-client'; +import expect from '@kbn/expect'; + +import { + createBackingIndexNameWithoutVersion, + getDataStreamSettingsOfEarliestIndex, + rolloverDataStream, +} from './utils/es_utils'; +import { DeploymentAgnosticFtrProviderContext } from '../../../ftr_provider_context'; +import { RoleCredentials, SupertestWithRoleScopeType } from '../../../services'; + +export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { + const samlAuth = getService('samlAuth'); + const roleScopedSupertest = getService('roleScopedSupertest'); + const synthtrace = getService('logsSynthtraceEsClient'); + const esClient = getService('es'); + const packageApi = getService('packageApi'); + const config = getService('config'); + const isServerless = !!config.get('serverless'); + const start = '2024-09-20T11:00:00.000Z'; + const end = '2024-09-20T11:01:00.000Z'; + const type = 'logs'; + const dataset = 'synth'; + const syntheticsDataset = 'synthetics'; + const namespace = 'default'; + const serviceName = 'my-service'; + const hostName = 'synth-host'; + const dataStreamName = `${type}-${dataset}-${namespace}`; + const syntheticsDataStreamName = `${type}-${syntheticsDataset}-${namespace}`; + + const defaultDataStreamPrivileges = { + datasetUserPrivileges: { canRead: true, canMonitor: true, canViewIntegrations: true }, + }; + + async function callApiAs({ + roleScopedSupertestWithCookieCredentials, + apiParams: { dataStream }, + }: { + roleScopedSupertestWithCookieCredentials: SupertestWithRoleScopeType; + apiParams: { + dataStream: string; + }; + }) { + return roleScopedSupertestWithCookieCredentials.get( + `/internal/dataset_quality/data_streams/${dataStream}/settings` + ); + } + + describe('Dataset quality settings', function () { + let adminRoleAuthc: RoleCredentials; + let supertestAdminWithCookieCredentials: SupertestWithRoleScopeType; + + before(async () => { + adminRoleAuthc = await samlAuth.createM2mApiKeyWithRoleScope('admin'); + supertestAdminWithCookieCredentials = await roleScopedSupertest.getSupertestWithRoleScope( + 'admin', + { + useCookieHeader: true, + withInternalHeaders: true, + } + ); + }); + + after(async () => { + await samlAuth.invalidateM2mApiKeyWithRoleScope(adminRoleAuthc); + }); + + it('returns only privileges if matching data stream is not available', async () => { + const nonExistentDataSet = 'Non-existent'; + const nonExistentDataStream = `${type}-${nonExistentDataSet}-${namespace}`; + const resp = await callApiAs({ + roleScopedSupertestWithCookieCredentials: supertestAdminWithCookieCredentials, + apiParams: { + dataStream: nonExistentDataStream, + }, + }); + expect(resp.body).eql(defaultDataStreamPrivileges); + }); + + describe('gets the data stream settings for non integrations', () => { + before(async () => { + await synthtrace.index([ + timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a log message') + .timestamp(timestamp) + .dataset(dataset) + .namespace(namespace) + .defaults({ + 'log.file.path': '/my-service.log', + 'service.name': serviceName, + 'host.name': hostName, + }) + ), + ]); + }); + after(async () => { + await synthtrace.clean(); + }); + + it('returns "createdOn", "indexTemplate" and "lastBackingIndexName" correctly when available for non integration', async () => { + const dataStreamSettings = await getDataStreamSettingsOfEarliestIndex( + esClient, + dataStreamName + ); + const resp = await callApiAs({ + roleScopedSupertestWithCookieCredentials: supertestAdminWithCookieCredentials, + apiParams: { + dataStream: dataStreamName, + }, + }); + + if (!isServerless) { + expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); + } + expect(resp.body.indexTemplate).to.be('logs'); + expect(resp.body.lastBackingIndexName).to.be( + `${createBackingIndexNameWithoutVersion({ + type, + dataset, + namespace, + })}-000001` + ); + expect(resp.body.datasetUserPrivileges).to.eql( + defaultDataStreamPrivileges.datasetUserPrivileges + ); + }); + + it('returns "createdOn", "indexTemplate" and "lastBackingIndexName" correctly for rolled over dataStream', async () => { + await rolloverDataStream(esClient, dataStreamName); + const dataStreamSettings = await getDataStreamSettingsOfEarliestIndex( + esClient, + dataStreamName + ); + const resp = await callApiAs({ + roleScopedSupertestWithCookieCredentials: supertestAdminWithCookieCredentials, + apiParams: { + dataStream: dataStreamName, + }, + }); + + if (!isServerless) { + expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); + } + expect(resp.body.lastBackingIndexName).to.be( + `${createBackingIndexNameWithoutVersion({ type, dataset, namespace })}-000002` + ); + expect(resp.body.indexTemplate).to.be('logs'); + }); + }); + + describe('gets the data stream settings for integrations', () => { + before(async () => { + await packageApi.installPackage({ + roleAuthc: adminRoleAuthc, + pkg: syntheticsDataset, + }); + await synthtrace.index([ + timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a log message') + .timestamp(timestamp) + .dataset(syntheticsDataset) + .namespace(namespace) + .defaults({ + 'log.file.path': '/my-service.log', + 'service.name': serviceName, + 'host.name': hostName, + }) + ), + ]); + }); + after(async () => { + await synthtrace.clean(); + await packageApi.uninstallPackage({ + roleAuthc: adminRoleAuthc, + pkg: syntheticsDataset, + }); + }); + + it('returns "createdOn", "integration", "indexTemplate" and "lastBackingIndexName" correctly when available for integration', async () => { + const dataStreamSettings = await getDataStreamSettingsOfEarliestIndex( + esClient, + syntheticsDataStreamName + ); + const resp = await callApiAs({ + roleScopedSupertestWithCookieCredentials: supertestAdminWithCookieCredentials, + apiParams: { + dataStream: syntheticsDataStreamName, + }, + }); + + if (!isServerless) { + expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); + } + expect(resp.body.indexTemplate).to.be('logs'); + expect(resp.body.lastBackingIndexName).to.be( + `${createBackingIndexNameWithoutVersion({ + type, + dataset: syntheticsDataset, + namespace, + })}-000001` + ); + expect(resp.body.datasetUserPrivileges).to.eql( + defaultDataStreamPrivileges.datasetUserPrivileges + ); + }); + + it('returns "createdOn", "integration", "indexTemplate" and "lastBackingIndexName" correctly for rolled over dataStream', async () => { + await rolloverDataStream(esClient, syntheticsDataStreamName); + const dataStreamSettings = await getDataStreamSettingsOfEarliestIndex( + esClient, + syntheticsDataStreamName + ); + const resp = await callApiAs({ + roleScopedSupertestWithCookieCredentials: supertestAdminWithCookieCredentials, + apiParams: { + dataStream: syntheticsDataStreamName, + }, + }); + + if (!isServerless) { + expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); + } + expect(resp.body.lastBackingIndexName).to.be( + `${createBackingIndexNameWithoutVersion({ + type, + dataset: syntheticsDataset, + namespace, + })}-000002` + ); + expect(resp.body.indexTemplate).to.be('logs'); + }); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/degraded_field_analyze.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/degraded_field_analyze.ts index ed06b81d647fb..e9e2665548764 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/degraded_field_analyze.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/degraded_field_analyze.ts @@ -9,7 +9,7 @@ import expect from '@kbn/expect'; import { log, timerange } from '@kbn/apm-synthtrace-client'; import { SupertestWithRoleScopeType } from '../../../services'; import { DeploymentAgnosticFtrProviderContext } from '../../../ftr_provider_context'; -import { createBackingIndexNameWithoutVersion, setDataStreamSettings } from './es_utils'; +import { createBackingIndexNameWithoutVersion, setDataStreamSettings } from './utils/es_utils'; import { logsSynthMappings } from './custom_mappings/custom_synth_mappings'; const MORE_THAN_1024_CHARS = diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/index.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/index.ts index 0c660dda0a445..7e555b7a310e1 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/index.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/index.ts @@ -11,5 +11,8 @@ export default function ({ loadTestFile }: DeploymentAgnosticFtrProviderContext) describe('Dataset quality', () => { loadTestFile(require.resolve('./integrations')); loadTestFile(require.resolve('./degraded_field_analyze')); + loadTestFile(require.resolve('./data_stream_settings')); + loadTestFile(require.resolve('./data_stream_rollover')); + loadTestFile(require.resolve('./update_field_limit')); }); } diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/integrations.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/integrations.ts index 910dd84bb309e..33b3fccbea8a1 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/integrations.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/integrations.ts @@ -5,15 +5,15 @@ * 2.0. */ -import { RoleCredentials, InternalRequestHeader } from '@kbn/ftr-common-functional-services'; import expect from '@kbn/expect'; import { APIReturnType } from '@kbn/dataset-quality-plugin/common/rest'; import { CustomIntegration } from '../../../services/package_api'; import { DeploymentAgnosticFtrProviderContext } from '../../../ftr_provider_context'; +import { RoleCredentials, SupertestWithRoleScopeType } from '../../../services'; export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { const samlAuth = getService('samlAuth'); - const supertestWithoutAuth = getService('supertestWithoutAuth'); + const roleScopedSupertest = getService('roleScopedSupertest'); const packageApi = getService('packageApi'); const endpoint = 'GET /internal/dataset_quality/integrations'; @@ -33,27 +33,30 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { ]; async function callApiAs({ - roleAuthc, - headers, + roleScopedSupertestWithCookieCredentials, }: { - roleAuthc: RoleCredentials; - headers: InternalRequestHeader; + roleScopedSupertestWithCookieCredentials: SupertestWithRoleScopeType; }): Promise { - const { body } = await supertestWithoutAuth - .get('/internal/dataset_quality/integrations') - .set(roleAuthc.apiKeyHeader) - .set(headers); + const { body } = await roleScopedSupertestWithCookieCredentials.get( + '/internal/dataset_quality/integrations' + ); return body; } describe('Integrations', () => { let adminRoleAuthc: RoleCredentials; - let internalHeaders: InternalRequestHeader; + let supertestAdminWithCookieCredentials: SupertestWithRoleScopeType; before(async () => { adminRoleAuthc = await samlAuth.createM2mApiKeyWithRoleScope('admin'); - internalHeaders = samlAuth.getInternalRequestHeader(); + supertestAdminWithCookieCredentials = await roleScopedSupertest.getSupertestWithRoleScope( + 'admin', + { + useCookieHeader: true, + withInternalHeaders: true, + } + ); }); after(async () => { @@ -74,8 +77,7 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { it('returns all installed integrations and its datasets map', async () => { const body = await callApiAs({ - roleAuthc: adminRoleAuthc, - headers: internalHeaders, + roleScopedSupertestWithCookieCredentials: supertestAdminWithCookieCredentials, }); expect(body.integrations.map((integration: Integration) => integration.name)).to.eql([ @@ -108,8 +110,7 @@ export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { it('returns custom integrations and its datasets map', async () => { const body = await callApiAs({ - roleAuthc: adminRoleAuthc, - headers: internalHeaders, + roleScopedSupertestWithCookieCredentials: supertestAdminWithCookieCredentials, }); expect(body.integrations.map((integration: Integration) => integration.name)).to.eql([ diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/update_field_limit.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/update_field_limit.ts new file mode 100644 index 0000000000000..3f842cd43f3e2 --- /dev/null +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/update_field_limit.ts @@ -0,0 +1,176 @@ +/* + * 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 { log, timerange } from '@kbn/apm-synthtrace-client'; + +import { DeploymentAgnosticFtrProviderContext } from '../../../ftr_provider_context'; +import { RoleCredentials, SupertestWithRoleScopeType } from '../../../services'; +import { createBackingIndexNameWithoutVersion, rolloverDataStream } from './utils/es_utils'; + +export default function ({ getService }: DeploymentAgnosticFtrProviderContext) { + const samlAuth = getService('samlAuth'); + const roleScopedSupertest = getService('roleScopedSupertest'); + const synthtrace = getService('logsSynthtraceEsClient'); + const esClient = getService('es'); + const packageApi = getService('packageApi'); + const start = '2024-10-17T11:00:00.000Z'; + const end = '2024-10-17T11:01:00.000Z'; + const type = 'logs'; + const invalidDataset = 'invalid'; + const integrationsDataset = 'nginx.access'; + const pkg = 'nginx'; + const namespace = 'default'; + const serviceName = 'my-service'; + const hostName = 'synth-host'; + const invalidDataStreamName = `${type}-${invalidDataset}-${namespace}`; + const integrationsDataStreamName = `${type}-${integrationsDataset}-${namespace}`; + + async function callApiAs({ + roleScopedSupertestWithCookieCredentials, + apiParams: { dataStream, fieldLimit }, + }: { + roleScopedSupertestWithCookieCredentials: SupertestWithRoleScopeType; + apiParams: { + dataStream: string; + fieldLimit: number; + }; + }) { + return roleScopedSupertestWithCookieCredentials + .put(`/internal/dataset_quality/data_streams/${dataStream}/update_field_limit`) + .send({ + newFieldLimit: fieldLimit, + }); + } + + describe('Update field limit', function () { + let adminRoleAuthc: RoleCredentials; + let supertestAdminWithCookieCredentials: SupertestWithRoleScopeType; + + before(async () => { + adminRoleAuthc = await samlAuth.createM2mApiKeyWithRoleScope('admin'); + supertestAdminWithCookieCredentials = await roleScopedSupertest.getSupertestWithRoleScope( + 'admin', + { + useCookieHeader: true, + withInternalHeaders: true, + } + ); + await packageApi.installPackage({ + roleAuthc: adminRoleAuthc, + pkg, + }); + await synthtrace.index([ + timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a log message') + .timestamp(timestamp) + .dataset(integrationsDataset) + .namespace(namespace) + .defaults({ + 'log.file.path': '/my-service.log', + 'service.name': serviceName, + 'host.name': hostName, + }) + ), + ]); + }); + + after(async () => { + await synthtrace.clean(); + await packageApi.uninstallPackage({ + roleAuthc: adminRoleAuthc, + pkg, + }); + await samlAuth.invalidateM2mApiKeyWithRoleScope(adminRoleAuthc); + }); + + it('should handles failure gracefully when invalid datastream provided ', async () => { + const resp = await callApiAs({ + roleScopedSupertestWithCookieCredentials: supertestAdminWithCookieCredentials, + apiParams: { + dataStream: invalidDataStreamName, + fieldLimit: 10, + }, + }); + + expect(resp.body.statusCode).to.be(400); + expect(resp.body.message).to.be( + `Data stream does not exists. Received value "${invalidDataStreamName}"` + ); + }); + + it('should update last backing index and custom component template', async () => { + // We rollover the data stream to create a new backing index + await rolloverDataStream(esClient, integrationsDataStreamName); + + const resp = await callApiAs({ + roleScopedSupertestWithCookieCredentials: supertestAdminWithCookieCredentials, + apiParams: { + dataStream: integrationsDataStreamName, + fieldLimit: 50, + }, + }); + + expect(resp.body.isComponentTemplateUpdated).to.be(true); + expect(resp.body.isLatestBackingIndexUpdated).to.be(true); + expect(resp.body.customComponentTemplateName).to.be(`${type}-${integrationsDataset}@custom`); + expect(resp.body.error).to.be(undefined); + + const { component_templates: componentTemplates } = + await esClient.cluster.getComponentTemplate({ + name: `${type}-${integrationsDataset}@custom`, + }); + + const customTemplate = componentTemplates.filter( + (tmp) => tmp.name === `${type}-${integrationsDataset}@custom` + ); + + expect(customTemplate).to.have.length(1); + expect( + customTemplate[0].component_template.template.settings?.index?.mapping?.total_fields?.limit + ).to.be('50'); + + const settingsForAllIndices = await esClient.indices.getSettings({ + index: integrationsDataStreamName, + }); + + const backingIndexWithoutVersion = createBackingIndexNameWithoutVersion({ + type, + dataset: integrationsDataset, + namespace, + }); + const settingsForLastBackingIndex = + settingsForAllIndices[backingIndexWithoutVersion + '-000002'].settings; + const settingsForPreviousBackingIndex = + settingsForAllIndices[backingIndexWithoutVersion + '-000001'].settings; + + // Only the Last Backing Index should have the updated limit and not the one previous to it + expect(settingsForLastBackingIndex?.index?.mapping?.total_fields?.limit).to.be('50'); + + // The previous one should have the default limit of 1000 + expect(settingsForPreviousBackingIndex?.index?.mapping?.total_fields?.limit).to.be('1000'); + + // Rollover to test custom component template + await rolloverDataStream(esClient, integrationsDataStreamName); + + const settingsForLatestBackingIndex = await esClient.indices.getSettings({ + index: backingIndexWithoutVersion + '-000003', + }); + + // The new backing index should read settings from custom component template + expect( + settingsForLatestBackingIndex[backingIndexWithoutVersion + '-000003'].settings?.index + ?.mapping?.total_fields?.limit + ).to.be('50'); + }); + }); +} diff --git a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/es_utils.ts b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/utils/es_utils.ts similarity index 63% rename from x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/es_utils.ts rename to x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/utils/es_utils.ts index 0e041781122cd..a2fa712ba3be7 100644 --- a/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/es_utils.ts +++ b/x-pack/test/api_integration/deployment_agnostic/apis/observability/dataset_quality/utils/es_utils.ts @@ -39,3 +39,21 @@ export async function setDataStreamSettings( settings, }); } + +export async function rolloverDataStream(es: Client, name: string) { + return es.indices.rollover({ alias: name }); +} + +export async function getDataStreamSettingsOfEarliestIndex(es: Client, name: string) { + const matchingIndexesObj = await es.indices.getSettings({ index: name }); + + const matchingIndexes = Object.keys(matchingIndexesObj ?? {}); + matchingIndexes.sort((a, b) => { + return ( + Number(matchingIndexesObj[a].settings?.index?.creation_date) - + Number(matchingIndexesObj[b].settings?.index?.creation_date) + ); + }); + + return matchingIndexesObj[matchingIndexes[0]].settings; +} diff --git a/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_settings.spec.ts b/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_settings.spec.ts deleted file mode 100644 index 45f37b44983aa..0000000000000 --- a/x-pack/test/dataset_quality_api_integration/tests/data_streams/data_stream_settings.spec.ts +++ /dev/null @@ -1,159 +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 { log, timerange } from '@kbn/apm-synthtrace-client'; -import expect from '@kbn/expect'; -import { DatasetQualityApiClientKey } from '../../common/config'; -import { DatasetQualityApiError } from '../../common/dataset_quality_api_supertest'; -import { FtrProviderContext } from '../../common/ftr_provider_context'; -import { - expectToReject, - getDataStreamSettingsOfEarliestIndex, - rolloverDataStream, -} from '../../utils'; -import { createBackingIndexNameWithoutVersion } from './es_utils'; - -export default function ApiTest({ getService }: FtrProviderContext) { - const registry = getService('registry'); - const synthtrace = getService('logSynthtraceEsClient'); - const esClient = getService('es'); - const datasetQualityApiClient = getService('datasetQualityApiClient'); - const pkgService = getService('packageService'); - const start = '2023-12-11T18:00:00.000Z'; - const end = '2023-12-11T18:01:00.000Z'; - const type = 'logs'; - const dataset = 'synth.1'; - const integrationDataset = 'apache.access'; - const namespace = 'default'; - const serviceName = 'my-service'; - const hostName = 'synth-host'; - const pkg = { - name: 'apache', - version: '1.14.0', - }; - - const defaultDataStreamPrivileges = { - datasetUserPrivileges: { canRead: true, canMonitor: true, canViewIntegrations: true }, - }; - - async function callApiAs(user: DatasetQualityApiClientKey, dataStream: string) { - return await datasetQualityApiClient[user]({ - endpoint: 'GET /internal/dataset_quality/data_streams/{dataStream}/settings', - params: { - path: { - dataStream, - }, - }, - }); - } - - registry.when('DataStream Settings', { config: 'basic' }, () => { - describe('gets the data stream settings', () => { - before(async () => { - // Install Integration and ingest logs for it - await pkgService.installPackage(pkg); - await synthtrace.index([ - timerange(start, end) - .interval('1m') - .rate(1) - .generator((timestamp) => - log - .create() - .message('This is a log message') - .timestamp(timestamp) - .dataset(integrationDataset) - .namespace(namespace) - .defaults({ - 'log.file.path': '/my-service.log', - 'service.name': serviceName, - 'host.name': hostName, - }) - ), - ]); - // Ingest basic logs - await synthtrace.index([ - timerange(start, end) - .interval('1m') - .rate(1) - .generator((timestamp) => - log - .create() - .message('This is a log message') - .timestamp(timestamp) - .dataset(dataset) - .namespace(namespace) - .defaults({ - 'log.file.path': '/my-service.log', - 'service.name': serviceName, - 'host.name': hostName, - }) - ), - ]); - }); - - it('returns error when dataStream param is not provided', async () => { - const expectedMessage = 'Data Stream name cannot be empty'; - const err = await expectToReject(() => - callApiAs('datasetQualityMonitorUser', encodeURIComponent(' ')) - ); - expect(err.res.status).to.be(400); - expect(err.res.body.message.indexOf(expectedMessage)).to.greaterThan(-1); - }); - - it('returns only privileges if matching data stream is not available', async () => { - const nonExistentDataSet = 'Non-existent'; - const nonExistentDataStream = `${type}-${nonExistentDataSet}-${namespace}`; - const resp = await callApiAs('datasetQualityMonitorUser', nonExistentDataStream); - expect(resp.body).eql(defaultDataStreamPrivileges); - }); - - it('returns "createdOn", "integration" and "lastBackingIndexName" correctly when available', async () => { - const dataStreamSettings = await getDataStreamSettingsOfEarliestIndex( - esClient, - `${type}-${integrationDataset}-${namespace}` - ); - const resp = await callApiAs( - 'datasetQualityMonitorUser', - `${type}-${integrationDataset}-${namespace}` - ); - expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); - expect(resp.body.integration).to.be('apache'); - expect(resp.body.lastBackingIndexName).to.be( - `${createBackingIndexNameWithoutVersion({ - type, - dataset: integrationDataset, - namespace, - })}-000001` - ); - expect(resp.body.datasetUserPrivileges).to.eql( - defaultDataStreamPrivileges.datasetUserPrivileges - ); - }); - - it('returns "createdOn" and "lastBackingIndexName" for rolled over dataStream', async () => { - await rolloverDataStream(esClient, `${type}-${dataset}-${namespace}`); - const dataStreamSettings = await getDataStreamSettingsOfEarliestIndex( - esClient, - `${type}-${dataset}-${namespace}` - ); - const resp = await callApiAs( - 'datasetQualityMonitorUser', - `${type}-${dataset}-${namespace}` - ); - expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); - expect(resp.body.lastBackingIndexName).to.be( - `${createBackingIndexNameWithoutVersion({ type, dataset, namespace })}-000002` - ); - }); - - after(async () => { - await synthtrace.clean(); - await pkgService.uninstallPackage(pkg); - }); - }); - }); -} diff --git a/x-pack/test/functional/apps/dataset_quality/custom_mappings/custom_integration_mappings.ts b/x-pack/test/functional/apps/dataset_quality/custom_mappings/custom_integration_mappings.ts new file mode 100644 index 0000000000000..210d5fd349880 --- /dev/null +++ b/x-pack/test/functional/apps/dataset_quality/custom_mappings/custom_integration_mappings.ts @@ -0,0 +1,177 @@ +/* + * 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 { MappingTypeMapping } from '@elastic/elasticsearch/lib/api/types'; + +export const logsNginxMappings = (dataset: string): MappingTypeMapping => ({ + properties: { + '@timestamp': { + type: 'date', + ignore_malformed: false, + }, + cloud: { + properties: { + image: { + properties: { + id: { + type: 'keyword', + ignore_above: 1024, + }, + }, + }, + }, + }, + data_stream: { + properties: { + dataset: { + type: 'constant_keyword', + value: dataset, + }, + namespace: { + type: 'constant_keyword', + value: 'default', + }, + type: { + type: 'constant_keyword', + value: 'logs', + }, + }, + }, + ecs: { + properties: { + version: { + type: 'keyword', + ignore_above: 1024, + }, + }, + }, + error: { + properties: { + message: { + type: 'match_only_text', + }, + }, + }, + event: { + properties: { + agent_id_status: { + type: 'keyword', + ignore_above: 1024, + }, + dataset: { + type: 'constant_keyword', + value: 'nginx.access', + }, + ingested: { + type: 'date', + format: 'strict_date_time_no_millis||strict_date_optional_time||epoch_millis', + ignore_malformed: false, + }, + module: { + type: 'constant_keyword', + value: 'nginx', + }, + }, + }, + host: { + properties: { + containerized: { + type: 'boolean', + }, + name: { + type: 'keyword', + fields: { + text: { + type: 'match_only_text', + }, + }, + }, + os: { + properties: { + build: { + type: 'keyword', + ignore_above: 1024, + }, + codename: { + type: 'keyword', + ignore_above: 1024, + }, + }, + }, + }, + }, + input: { + properties: { + type: { + type: 'keyword', + ignore_above: 1024, + }, + }, + }, + log: { + properties: { + level: { + type: 'keyword', + ignore_above: 1024, + }, + offset: { + type: 'long', + }, + }, + }, + network: { + properties: { + bytes: { + type: 'long', + }, + }, + }, + nginx: { + properties: { + access: { + properties: { + remote_ip_list: { + type: 'keyword', + ignore_above: 1024, + }, + }, + }, + }, + }, + service: { + properties: { + name: { + type: 'keyword', + fields: { + text: { + type: 'match_only_text', + }, + }, + }, + }, + }, + test_field: { + type: 'keyword', + ignore_above: 1024, + }, + tls: { + properties: { + established: { + type: 'boolean', + }, + }, + }, + trace: { + properties: { + id: { + type: 'keyword', + ignore_above: 1024, + }, + }, + }, + }, +}); diff --git a/x-pack/test/functional/apps/dataset_quality/degraded_field_flyout.ts b/x-pack/test/functional/apps/dataset_quality/degraded_field_flyout.ts index 2506201aa3b85..1b477644feca0 100644 --- a/x-pack/test/functional/apps/dataset_quality/degraded_field_flyout.ts +++ b/x-pack/test/functional/apps/dataset_quality/degraded_field_flyout.ts @@ -17,6 +17,7 @@ import { MORE_THAN_1024_CHARS, } from './data'; import { logsSynthMappings } from './custom_mappings/custom_synth_mappings'; +import { logsNginxMappings } from './custom_mappings/custom_integration_mappings'; export default function ({ getService, getPageObjects }: DatasetQualityFtrProviderContext) { const PageObjects = getPageObjects([ @@ -30,34 +31,42 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid const esClient = getService('es'); const retry = getService('retry'); const to = new Date().toISOString(); + const type = 'logs'; const degradedDatasetName = 'synth.degraded'; - const degradedDataStreamName = `logs-${degradedDatasetName}-${defaultNamespace}`; + const degradedDataStreamName = `${type}-${degradedDatasetName}-${defaultNamespace}`; const degradedDatasetWithLimitsName = 'synth.degraded.rca'; - const degradedDatasetWithLimitDataStreamName = `logs-${degradedDatasetWithLimitsName}-${defaultNamespace}`; + const degradedDatasetWithLimitDataStreamName = `${type}-${degradedDatasetWithLimitsName}-${defaultNamespace}`; const serviceName = 'test_service'; const count = 5; const customComponentTemplateName = 'logs-synth@mappings'; - describe('Degraded fields flyout', () => { - before(async () => { - await synthtrace.index([ - // Ingest basic logs - getInitialTestLogs({ to, count: 4 }), - // Ingest Degraded Logs - createDegradedFieldsRecord({ - to: new Date().toISOString(), - count: 2, - dataset: degradedDatasetName, - }), - ]); - }); - - after(async () => { - await synthtrace.clean(); - }); + const nginxAccessDatasetName = 'nginx.access'; + const customComponentTemplateNameNginx = 'logs-nginx.access@custom'; + const nginxAccessDataStreamName = `${type}-${nginxAccessDatasetName}-${defaultNamespace}`; + const nginxPkg = { + name: 'nginx', + version: '1.23.0', + }; + describe('Degraded fields flyout', () => { describe('degraded field flyout open-close', () => { + before(async () => { + await synthtrace.index([ + // Ingest basic logs + getInitialTestLogs({ to, count: 4 }), + // Ingest Degraded Logs + createDegradedFieldsRecord({ + to: new Date().toISOString(), + count: 2, + dataset: degradedDatasetName, + }), + ]); + }); + + after(async () => { + await synthtrace.clean(); + }); it('should open and close the flyout when user clicks on the expand button', async () => { await PageObjects.datasetQuality.navigateToDetails({ dataStream: degradedDataStreamName, @@ -90,31 +99,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid }); }); - describe('values exist', () => { - it('should display the degraded field values', async () => { - await PageObjects.datasetQuality.navigateToDetails({ - dataStream: degradedDataStreamName, - expandedDegradedField: 'test_field', - }); - - await retry.tryForTime(5000, async () => { - const cloudAvailabilityZoneValueExists = await PageObjects.datasetQuality.doesTextExist( - 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-values', - ANOTHER_1024_CHARS - ); - const cloudAvailabilityZoneValue2Exists = await PageObjects.datasetQuality.doesTextExist( - 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-values', - MORE_THAN_1024_CHARS - ); - expect(cloudAvailabilityZoneValueExists).to.be(true); - expect(cloudAvailabilityZoneValue2Exists).to.be(true); - }); - - await PageObjects.datasetQuality.closeFlyout(); - }); - }); - - describe('testing root cause for ignored fields', () => { + describe('detecting root cause for ignored fields', () => { before(async () => { // Create custom component template await synthtrace.createComponentTemplate( @@ -142,8 +127,18 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid hidden: false, }, }); - // Ingest Degraded Logs with 25 fields + + // Install Nginx Integration and ingest logs for it + await PageObjects.observabilityLogsExplorer.installPackage(nginxPkg); + + // Create custom component template to avoid issues with LogsDB + await synthtrace.createComponentTemplate( + customComponentTemplateNameNginx, + logsNginxMappings(nginxAccessDatasetName) + ); + await synthtrace.index([ + // Ingest Degraded Logs with 25 fields in degraded DataSet timerange(moment(to).subtract(count, 'minute'), moment(to)) .interval('1m') .rate(1) @@ -161,7 +156,30 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid .defaults({ 'service.name': serviceName, 'trace.id': generateShortId(), - test_field: [MORE_THAN_1024_CHARS, 'hello world'], + test_field: [MORE_THAN_1024_CHARS, ANOTHER_1024_CHARS], + }) + .timestamp(timestamp) + ); + }), + // Ingest Degraded Logs with 42 fields in Nginx DataSet + timerange(moment(to).subtract(count, 'minute'), moment(to)) + .interval('1m') + .rate(1) + .generator((timestamp) => { + return Array(1) + .fill(0) + .flatMap(() => + log + .create() + .dataset(nginxAccessDatasetName) + .message('a log message') + .logLevel(MORE_THAN_1024_CHARS) + .service(serviceName) + .namespace(defaultNamespace) + .defaults({ + 'service.name': serviceName, + 'trace.id': generateShortId(), + test_field: [MORE_THAN_1024_CHARS, ANOTHER_1024_CHARS], }) .timestamp(timestamp) ); @@ -176,8 +194,13 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid } ); - // Ingest Degraded Logs with 26 field + // Set Limit of 42 + await PageObjects.datasetQuality.setDataStreamSettings(nginxAccessDataStreamName, { + 'mapping.total_fields.limit': 42, + }); + await synthtrace.index([ + // Ingest Degraded Logs with 26 field timerange(moment(to).subtract(count, 'minute'), moment(to)) .interval('1m') .rate(1) @@ -196,7 +219,31 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid 'service.name': serviceName, 'trace.id': generateShortId(), test_field: [MORE_THAN_1024_CHARS, 'hello world'], - 'cloud.region': 'us-east-1', + 'cloud.project.id': generateShortId(), + }) + .timestamp(timestamp) + ); + }), + // Ingest Degraded Logs with 43 fields in Nginx DataSet + timerange(moment(to).subtract(count, 'minute'), moment(to)) + .interval('1m') + .rate(1) + .generator((timestamp) => { + return Array(1) + .fill(0) + .flatMap(() => + log + .create() + .dataset(nginxAccessDatasetName) + .message('a log message') + .logLevel(MORE_THAN_1024_CHARS) + .service(serviceName) + .namespace(defaultNamespace) + .defaults({ + 'service.name': serviceName, + 'trace.id': generateShortId(), + test_field: [MORE_THAN_1024_CHARS, ANOTHER_1024_CHARS], + 'cloud.project.id': generateShortId(), }) .timestamp(timestamp) ); @@ -205,9 +252,30 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid // Rollover Datastream to reset the limit to default which is 1000 await PageObjects.datasetQuality.rolloverDataStream(degradedDatasetWithLimitDataStreamName); + await PageObjects.datasetQuality.rolloverDataStream(nginxAccessDataStreamName); + + // Set Limit of 26 + await PageObjects.datasetQuality.setDataStreamSettings( + PageObjects.datasetQuality.generateBackingIndexNameWithoutVersion({ + dataset: degradedDatasetWithLimitsName, + }) + '-000002', + { + 'mapping.total_fields.limit': 26, + } + ); + + // Set Limit of 43 + await PageObjects.datasetQuality.setDataStreamSettings( + PageObjects.datasetQuality.generateBackingIndexNameWithoutVersion({ + dataset: nginxAccessDatasetName, + }) + '-000002', + { + 'mapping.total_fields.limit': 43, + } + ); - // Ingest docs with 26 fields again await synthtrace.index([ + // Ingest Degraded Logs with 26 field timerange(moment(to).subtract(count, 'minute'), moment(to)) .interval('1m') .rate(1) @@ -223,11 +291,34 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid .service(serviceName) .namespace(defaultNamespace) .defaults({ - 'log.file.path': '/my-service.log', 'service.name': serviceName, 'trace.id': generateShortId(), test_field: [MORE_THAN_1024_CHARS, 'hello world'], - 'cloud.region': 'us-east-1', + 'cloud.project.id': generateShortId(), + }) + .timestamp(timestamp) + ); + }), + // Ingest Degraded Logs with 43 fields in Nginx DataSet + timerange(moment(to).subtract(count, 'minute'), moment(to)) + .interval('1m') + .rate(1) + .generator((timestamp) => { + return Array(1) + .fill(0) + .flatMap(() => + log + .create() + .dataset(nginxAccessDatasetName) + .message('a log message') + .logLevel(MORE_THAN_1024_CHARS) + .service(serviceName) + .namespace(defaultNamespace) + .defaults({ + 'service.name': serviceName, + 'trace.id': generateShortId(), + test_field: [MORE_THAN_1024_CHARS, ANOTHER_1024_CHARS], + 'cloud.project.id': generateShortId(), }) .timestamp(timestamp) ); @@ -235,8 +326,128 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid ]); }); - describe('field character limit exceeded', () => { - it('should display cause as "field ignored" when a field is ignored due to field above issue', async () => { + describe('current quality issues', () => { + it('should display issues only from latest backing index when current issues toggle is on', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + }); + + const currentIssuesToggleState = + await PageObjects.datasetQuality.getQualityIssueSwitchState(); + + expect(currentIssuesToggleState).to.be(false); + + const rows = + await PageObjects.datasetQuality.getDatasetQualityDetailsDegradedFieldTableRows(); + + expect(rows.length).to.eql(4); + + await testSubjects.click( + PageObjects.datasetQuality.testSubjectSelectors + .datasetQualityDetailsOverviewDegradedFieldToggleSwitch + ); + + const newCurrentIssuesToggleState = + await PageObjects.datasetQuality.getQualityIssueSwitchState(); + + expect(newCurrentIssuesToggleState).to.be(true); + + const newRows = + await PageObjects.datasetQuality.getDatasetQualityDetailsDegradedFieldTableRows(); + + expect(newRows.length).to.eql(3); + }); + + it('should keep the toggle on when url state says so', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + expandedDegradedField: 'test_field', + showCurrentQualityIssues: true, + }); + + const currentIssuesToggleState = + await PageObjects.datasetQuality.getQualityIssueSwitchState(); + + expect(currentIssuesToggleState).to.be(true); + }); + + it('should display count from latest backing index when current issues toggle is on in the table and in the flyout', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + expandedDegradedField: 'test_field', + showCurrentQualityIssues: true, + }); + + // Check value in Table + const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); + const countColumn = table['Docs count']; + expect(await countColumn.getCellTexts()).to.eql(['5', '5', '5']); + + // Check value in Flyout + await retry.tryForTime(5000, async () => { + const countValue = await PageObjects.datasetQuality.doesTextExist( + 'datasetQualityDetailsDegradedFieldFlyoutFieldsList-docCount', + '5' + ); + expect(countValue).to.be(true); + }); + + // Toggle the switch + await testSubjects.click( + PageObjects.datasetQuality.testSubjectSelectors + .datasetQualityDetailsOverviewDegradedFieldToggleSwitch + ); + + // Check value in Table + const newTable = await PageObjects.datasetQuality.parseDegradedFieldTable(); + const newCountColumn = newTable['Docs count']; + expect(await newCountColumn.getCellTexts()).to.eql(['15', '15', '5', '5']); + + // Check value in Flyout + await retry.tryForTime(5000, async () => { + const newCountValue = await PageObjects.datasetQuality.doesTextExist( + 'datasetQualityDetailsDegradedFieldFlyoutFieldsList-docCount', + '15' + ); + expect(newCountValue).to.be(true); + }); + }); + + it('should close the flyout if passed value in URL no more exists in latest backing index and current quality toggle is switched on', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + expandedDegradedField: 'cloud', + showCurrentQualityIssues: true, + }); + + await testSubjects.missingOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + ); + }); + + it('should close the flyout when current quality switch is toggled on and the flyout is already open with an old field ', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + expandedDegradedField: 'cloud', + }); + + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + ); + + await testSubjects.click( + PageObjects.datasetQuality.testSubjectSelectors + .datasetQualityDetailsOverviewDegradedFieldToggleSwitch + ); + + await testSubjects.missingOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + ); + }); + }); + + describe('character limit exceeded', () => { + it('should display cause as "field character limit exceeded" when a field is ignored due to character limit issue', async () => { await PageObjects.datasetQuality.navigateToDetails({ dataStream: degradedDatasetWithLimitDataStreamName, expandedDegradedField: 'test_field', @@ -253,25 +464,167 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid await PageObjects.datasetQuality.closeFlyout(); }); - it('should display values when cause is "field ignored"', async () => { + it('should display values when cause is "field character limit exceeded"', async () => { await PageObjects.datasetQuality.navigateToDetails({ dataStream: degradedDatasetWithLimitDataStreamName, expandedDegradedField: 'test_field', }); await retry.tryForTime(5000, async () => { - const testFieldValueExists = await PageObjects.datasetQuality.doesTextExist( + const testFieldValue1Exists = await PageObjects.datasetQuality.doesTextExist( 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-values', MORE_THAN_1024_CHARS ); - expect(testFieldValueExists).to.be(true); + const testFieldValue2Exists = await PageObjects.datasetQuality.doesTextExist( + 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-values', + ANOTHER_1024_CHARS + ); + expect(testFieldValue1Exists).to.be(true); + expect(testFieldValue2Exists).to.be(true); }); await PageObjects.datasetQuality.closeFlyout(); }); + + it('should display the maximum character limit when cause is "field character limit exceeded"', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + expandedDegradedField: 'test_field', + }); + + await retry.tryForTime(5000, async () => { + const limitValueExists = await PageObjects.datasetQuality.doesTextExist( + 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-characterLimit', + '1024' + ); + expect(limitValueExists).to.be(true); + }); + + await PageObjects.datasetQuality.closeFlyout(); + }); + + it('should show possible mitigation section with manual options for non integrations', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + expandedDegradedField: 'test_field', + }); + + // Possible Mitigation Section should exist + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutPossibleMitigationTitle' + ); + + // It's a technical preview + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutPossibleMitigationTechPreviewBadge' + ); + + // Should display Edit/Create Component Template Link option + await testSubjects.existOrFail( + 'datasetQualityManualMitigationsCustomComponentTemplateLink' + ); + + // Should display Edit/Create Ingest Pipeline Link option + await testSubjects.existOrFail('datasetQualityManualMitigationsPipelineAccordion'); + + // Check Component Template URl + const button = await testSubjects.find( + 'datasetQualityManualMitigationsCustomComponentTemplateLink' + ); + const componentTemplateUrl = await button.getAttribute('data-test-url'); + + // Should point to index template with the datastream name as value + expect(componentTemplateUrl).to.be( + `/data/index_management/templates/${degradedDatasetWithLimitDataStreamName}` + ); + + const nonIntegrationCustomName = `${type}@custom`; + + const pipelineInputBox = await testSubjects.find( + 'datasetQualityManualMitigationsPipelineName' + ); + const pipelineValue = await pipelineInputBox.getAttribute('value'); + + // Expect Pipeline Name to be default logs for non integrations + expect(pipelineValue).to.be(nonIntegrationCustomName); + + const pipelineLink = await testSubjects.find( + 'datasetQualityManualMitigationsPipelineLink' + ); + const pipelineLinkURL = await pipelineLink.getAttribute('data-test-url'); + + // Expect the pipeline link to point to the pipeline page with empty pipeline value + expect(pipelineLinkURL).to.be( + `/app/management/ingest/ingest_pipelines/?pipeline=${encodeURIComponent( + nonIntegrationCustomName + )}` + ); + }); + + it('should show possible mitigation section with different manual options for integrations', async () => { + // Navigate to Integration Dataset + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: nginxAccessDataStreamName, + expandedDegradedField: 'test_field', + }); + + // Possible Mitigation Section should exist + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutPossibleMitigationTitle' + ); + + // It's a technical preview + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutPossibleMitigationTechPreviewBadge' + ); + + // Should display Edit/Create Component Template Link option + await testSubjects.existOrFail( + 'datasetQualityManualMitigationsCustomComponentTemplateLink' + ); + + // Should display Edit/Create Ingest Pipeline Link option + await testSubjects.existOrFail('datasetQualityManualMitigationsPipelineAccordion'); + + // Check Component Template URl + const button = await testSubjects.find( + 'datasetQualityManualMitigationsCustomComponentTemplateLink' + ); + const componentTemplateUrl = await button.getAttribute('data-test-url'); + + const integrationSpecificCustomName = `${type}-${nginxAccessDatasetName}@custom`; + + // Should point to component template with @custom as value + expect(componentTemplateUrl).to.be( + `/data/index_management/component_templates/${encodeURIComponent( + integrationSpecificCustomName + )}` + ); + + const pipelineInputBox = await testSubjects.find( + 'datasetQualityManualMitigationsPipelineName' + ); + const pipelineValue = await pipelineInputBox.getAttribute('value'); + + // Expect Pipeline Name to be default logs for non integrations + expect(pipelineValue).to.be(integrationSpecificCustomName); + + const pipelineLink = await testSubjects.find( + 'datasetQualityManualMitigationsPipelineLink' + ); + + const pipelineLinkURL = await pipelineLink.getAttribute('data-test-url'); + + // Expect the pipeline link to point to the pipeline page with empty pipeline value + expect(pipelineLinkURL).to.be( + `/app/management/ingest/ingest_pipelines/?pipeline=${encodeURIComponent( + integrationSpecificCustomName + )}` + ); + }); }); - describe('field limit exceeded', () => { + describe('past field limit exceeded', () => { it('should display cause as "field limit exceeded" when a field is ignored due to field limit issue', async () => { await PageObjects.datasetQuality.navigateToDetails({ dataStream: degradedDatasetWithLimitDataStreamName, @@ -289,7 +642,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid await PageObjects.datasetQuality.closeFlyout(); }); - it('should display the limit when the cause is "field limit exceeded"', async () => { + it('should display the current field limit when the cause is "field limit exceeded"', async () => { await PageObjects.datasetQuality.navigateToDetails({ dataStream: degradedDatasetWithLimitDataStreamName, expandedDegradedField: 'cloud', @@ -319,122 +672,194 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid }); }); - describe('current quality issues', () => { - it('should display issues only from latest backing index when current issues toggle is on', async () => { + describe('current field limit issues', () => { + it('should display increase field limit as a possible mitigation for integrations', async () => { await PageObjects.datasetQuality.navigateToDetails({ - dataStream: degradedDatasetWithLimitDataStreamName, + dataStream: nginxAccessDataStreamName, + expandedDegradedField: 'cloud.project.id', }); - const currentIssuesToggleState = - await PageObjects.datasetQuality.getQualityIssueSwitchState(); - - expect(currentIssuesToggleState).to.be(false); - - const rows = - await PageObjects.datasetQuality.getDatasetQualityDetailsDegradedFieldTableRows(); - - expect(rows.length).to.eql(3); + // Field Limit Mitigation Section should exist + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutFieldLimitMitigationAccordion' + ); - await testSubjects.click( - PageObjects.datasetQuality.testSubjectSelectors - .datasetQualityDetailsOverviewDegradedFieldToggleSwitch + // Should display the panel to increase field limit + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutIncreaseFieldLimitPanel' ); - const newCurrentIssuesToggleState = - await PageObjects.datasetQuality.getQualityIssueSwitchState(); + // Should display official online documentation link + await testSubjects.existOrFail( + 'datasetQualityManualMitigationsPipelineOfficialDocumentationLink' + ); - expect(newCurrentIssuesToggleState).to.be(true); + const linkButton = await testSubjects.find( + 'datasetQualityManualMitigationsPipelineOfficialDocumentationLink' + ); - const newRows = - await PageObjects.datasetQuality.getDatasetQualityDetailsDegradedFieldTableRows(); + const linkURL = await linkButton.getAttribute('href'); - expect(newRows.length).to.eql(2); + expect(linkURL).to.be( + 'https://www.elastic.co/guide/en/elasticsearch/reference/master/mapping-settings-limit.html' + ); }); - it('should keep the toggle on when url state says so', async () => { + it('should display increase field limit as a possible mitigation for non integration', async () => { await PageObjects.datasetQuality.navigateToDetails({ dataStream: degradedDatasetWithLimitDataStreamName, - expandedDegradedField: 'test_field', - showCurrentQualityIssues: true, + expandedDegradedField: 'cloud.project', }); - const currentIssuesToggleState = - await PageObjects.datasetQuality.getQualityIssueSwitchState(); + // Field Limit Mitigation Section should exist + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutFieldLimitMitigationAccordion' + ); - expect(currentIssuesToggleState).to.be(true); + // Should not display the panel to increase field limit + await testSubjects.missingOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutIncreaseFieldLimitPanel' + ); + + // Should display official online documentation link + await testSubjects.existOrFail( + 'datasetQualityManualMitigationsPipelineOfficialDocumentationLink' + ); }); - it('should display count from latest backing index when current issues toggle is on in the table and in the flyout', async () => { + it('should display additional input fields and button increasing the limit for integrations', async () => { await PageObjects.datasetQuality.navigateToDetails({ - dataStream: degradedDatasetWithLimitDataStreamName, - expandedDegradedField: 'test_field', - showCurrentQualityIssues: true, + dataStream: nginxAccessDataStreamName, + expandedDegradedField: 'cloud.project.id', }); - // Check value in Table - const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); - const countColumn = table['Docs count']; - expect(await countColumn.getCellTexts()).to.eql(['5', '5']); + // Should display current field limit + await testSubjects.existOrFail('datasetQualityIncreaseFieldMappingCurrentLimitFieldText'); - // Check value in Flyout - await retry.tryForTime(5000, async () => { - const countValue = await PageObjects.datasetQuality.doesTextExist( - 'datasetQualityDetailsDegradedFieldFlyoutFieldsList-docCount', - '5' - ); - expect(countValue).to.be(true); - }); + const currentFieldLimitInput = await testSubjects.find( + 'datasetQualityIncreaseFieldMappingCurrentLimitFieldText' + ); - // Toggle the switch - await testSubjects.click( - PageObjects.datasetQuality.testSubjectSelectors - .datasetQualityDetailsOverviewDegradedFieldToggleSwitch + const currentFieldLimitValue = await currentFieldLimitInput.getAttribute('value'); + const currentFieldLimit = parseInt(currentFieldLimitValue as string, 10); + const currentFieldLimitDisabledStatus = await currentFieldLimitInput.getAttribute( + 'disabled' ); - // Check value in Table - const newTable = await PageObjects.datasetQuality.parseDegradedFieldTable(); - const newCountColumn = newTable['Docs count']; - expect(await newCountColumn.getCellTexts()).to.eql(['15', '15', '5']); + expect(currentFieldLimit).to.be(43); + expect(currentFieldLimitDisabledStatus).to.be('true'); - // Check value in Flyout - await retry.tryForTime(5000, async () => { - const newCountValue = await PageObjects.datasetQuality.doesTextExist( - 'datasetQualityDetailsDegradedFieldFlyoutFieldsList-docCount', - '15' - ); - expect(newCountValue).to.be(true); - }); + // Should display new field limit + await testSubjects.existOrFail( + 'datasetQualityIncreaseFieldMappingProposedLimitFieldText' + ); + + const newFieldLimitInput = await testSubjects.find( + 'datasetQualityIncreaseFieldMappingProposedLimitFieldText' + ); + + const newFieldLimitValue = await newFieldLimitInput.getAttribute('value'); + const newFieldLimit = parseInt(newFieldLimitValue as string, 10); + + // Should be 30% more the current limit + const newLimit = Math.round(currentFieldLimit * 1.3); + expect(newFieldLimit).to.be(newLimit); + + // Should display the apply button + await testSubjects.existOrFail('datasetQualityIncreaseFieldMappingLimitButtonButton'); + + const applyButton = await testSubjects.find( + 'datasetQualityIncreaseFieldMappingLimitButtonButton' + ); + const applyButtonDisabledStatus = await applyButton.getAttribute('disabled'); + + // The apply button should be active + expect(applyButtonDisabledStatus).to.be(null); }); - it('should close the flyout if passed value in URL no more exists in latest backing index and current quality toggle is switched on', async () => { + it('should validate input for new field limit', async () => { await PageObjects.datasetQuality.navigateToDetails({ - dataStream: degradedDatasetWithLimitDataStreamName, - expandedDegradedField: 'cloud', - showCurrentQualityIssues: true, + dataStream: nginxAccessDataStreamName, + expandedDegradedField: 'cloud.project.id', }); - await testSubjects.missingOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + // Should not allow values less than current limit of 43 + await testSubjects.setValue( + 'datasetQualityIncreaseFieldMappingProposedLimitFieldText', + '42', + { + clearWithKeyboard: true, + typeCharByChar: true, + } + ); + + const applyButton = await testSubjects.find( + 'datasetQualityIncreaseFieldMappingLimitButtonButton' + ); + const applyButtonDisabledStatus = await applyButton.getAttribute('disabled'); + + // The apply button should be active + expect(applyButtonDisabledStatus).to.be('true'); + + const newFieldLimitInput = await testSubjects.find( + 'datasetQualityIncreaseFieldMappingProposedLimitFieldText' ); + const invalidStatus = await newFieldLimitInput.getAttribute('aria-invalid'); + + expect(invalidStatus).to.be('true'); }); - it('should close the flyout when current quality switch is toggled on and the flyout is already open with an old field ', async () => { + it('should let user increase the field limit for integrations', async () => { await PageObjects.datasetQuality.navigateToDetails({ - dataStream: degradedDatasetWithLimitDataStreamName, - expandedDegradedField: 'cloud', + dataStream: nginxAccessDataStreamName, + expandedDegradedField: 'cloud.project.id', }); - await testSubjects.existOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + const applyButton = await testSubjects.find( + 'datasetQualityIncreaseFieldMappingLimitButtonButton' ); - await testSubjects.click( - PageObjects.datasetQuality.testSubjectSelectors - .datasetQualityDetailsOverviewDegradedFieldToggleSwitch + await applyButton.click(); + + await retry.tryForTime(5000, async () => { + // Should display the success callout + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFlyoutNewLimitSetSuccessCallout' + ); + + // Should display link to component template edited + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFlyoutNewLimitSetCheckComponentTemplate' + ); + + const ctLink = await testSubjects.find( + 'datasetQualityDetailsDegradedFlyoutNewLimitSetCheckComponentTemplate' + ); + const ctLinkURL = await ctLink.getAttribute('href'); + + const componentTemplateName = `${type}-${nginxAccessDatasetName}@custom`; + + // Should point to the component template page + expect( + ctLinkURL?.endsWith( + `/data/index_management/component_templates/${encodeURIComponent( + componentTemplateName + )}` + ) + ).to.be(true); + }); + + // Refresh the time range to get the latest data + await PageObjects.datasetQuality.refreshDetailsPageData(); + + // The page should now handle this as ignore_malformed issue and show a warning + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutIssueDoesNotExist' ); + // Should not display the panel to increase field limit await testSubjects.missingOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + 'datasetQualityDetailsDegradedFieldFlyoutIncreaseFieldLimitPanel' ); }); }); @@ -445,6 +870,8 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid name: degradedDatasetWithLimitDataStreamName, }); await synthtrace.deleteComponentTemplate(customComponentTemplateName); + await PageObjects.observabilityLogsExplorer.uninstallPackage(nginxPkg); + await synthtrace.deleteComponentTemplate(customComponentTemplateNameNginx); }); }); }); diff --git a/x-pack/test/functional/page_objects/dataset_quality.ts b/x-pack/test/functional/page_objects/dataset_quality.ts index ccd48e220064a..cef881fe0797c 100644 --- a/x-pack/test/functional/page_objects/dataset_quality.ts +++ b/x-pack/test/functional/page_objects/dataset_quality.ts @@ -204,6 +204,10 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv } }, + async waitUntilPossibleMitigationsLoaded() { + await find.waitForDeletedByCssSelector('.euiFlyoutBody .euiSkeletonRectangle', 20 * 1000); + }, + async waitUntilDegradedFieldFlyoutLoaded() { await testSubjects.existOrFail(testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout); }, @@ -239,6 +243,18 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv ); }, + generateBackingIndexNameWithoutVersion({ + type = 'logs', + dataset, + namespace = 'default', + }: { + type?: string; + dataset: string; + namespace?: string; + }) { + return `.ds-${type}-${dataset}-${namespace}-${getCurrentDateFormatted()}`; + }, + getDatasetsTable(): Promise { return testSubjects.find(testSubjectSelectors.datasetQualityTable); }, @@ -554,3 +570,12 @@ async function getDatasetTableHeaderTexts(tableWrapper: WebElementWrapper) { headerElementWrappers.map((headerElementWrapper) => headerElementWrapper.getVisibleText()) ); } + +function getCurrentDateFormatted() { + const date = new Date(); + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + + return `${year}.${month}.${day}`; +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_settings.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_settings.ts deleted file mode 100644 index a132bc01c9720..0000000000000 --- a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_settings.ts +++ /dev/null @@ -1,130 +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 { log, timerange } from '@kbn/apm-synthtrace-client'; -import expect from '@kbn/expect'; -import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; -import { expectToReject, getDataStreamSettingsOfEarliestIndex, rolloverDataStream } from './utils'; -import { - DatasetQualityApiClient, - DatasetQualityApiError, -} from './common/dataset_quality_api_supertest'; -import { DatasetQualityFtrContextProvider } from './common/services'; -import { createBackingIndexNameWithoutVersion } from './utils'; - -export default function ({ getService }: DatasetQualityFtrContextProvider) { - const datasetQualityApiClient: DatasetQualityApiClient = getService('datasetQualityApiClient'); - const synthtrace = getService('logSynthtraceEsClient'); - const svlCommonApi = getService('svlCommonApi'); - const svlUserManager = getService('svlUserManager'); - const esClient = getService('es'); - const start = '2023-12-11T18:00:00.000Z'; - const end = '2023-12-11T18:01:00.000Z'; - const type = 'logs'; - const dataset = 'nginx.access'; - const namespace = 'default'; - const serviceName = 'my-service'; - const hostName = 'synth-host'; - - const defaultDataStreamPrivileges = { - datasetUserPrivileges: { canRead: true, canMonitor: true, canViewIntegrations: true }, - }; - - async function callApi( - dataStream: string, - roleAuthc: RoleCredentials, - internalReqHeader: InternalRequestHeader - ) { - return await datasetQualityApiClient.slsUser({ - endpoint: 'GET /internal/dataset_quality/data_streams/{dataStream}/settings', - params: { - path: { - dataStream, - }, - }, - roleAuthc, - internalReqHeader, - }); - } - - describe('gets the data stream settings', () => { - let roleAuthc: RoleCredentials; - let internalReqHeader: InternalRequestHeader; - before(async () => { - roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('admin'); - internalReqHeader = svlCommonApi.getInternalRequestHeader(); - await synthtrace.index([ - timerange(start, end) - .interval('1m') - .rate(1) - .generator((timestamp) => - log - .create() - .message('This is a log message') - .timestamp(timestamp) - .dataset(dataset) - .namespace(namespace) - .defaults({ - 'log.file.path': '/my-service.log', - 'service.name': serviceName, - 'host.name': hostName, - }) - ), - ]); - }); - - after(async () => { - await synthtrace.clean(); - await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); - }); - - it('returns error when dataStream param is not provided', async () => { - const expectedMessage = 'Data Stream name cannot be empty'; - const err = await expectToReject(() => - callApi(encodeURIComponent(' '), roleAuthc, internalReqHeader) - ); - expect(err.res.status).to.be(400); - expect(err.res.body.message.indexOf(expectedMessage)).to.greaterThan(-1); - }); - - it('returns only privileges if matching data stream is not available', async () => { - const nonExistentDataSet = 'Non-existent'; - const nonExistentDataStream = `${type}-${nonExistentDataSet}-${namespace}`; - const resp = await callApi(nonExistentDataStream, roleAuthc, internalReqHeader); - expect(resp.body).eql(defaultDataStreamPrivileges); - }); - - it('returns "createdOn" and "lastBackingIndexName" correctly', async () => { - const dataStreamSettings = await getDataStreamSettingsOfEarliestIndex( - esClient, - `${type}-${dataset}-${namespace}` - ); - const resp = await callApi(`${type}-${dataset}-${namespace}`, roleAuthc, internalReqHeader); - expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); - expect(resp.body.lastBackingIndexName).to.be( - `${createBackingIndexNameWithoutVersion({ - type, - dataset, - namespace, - })}-000001` - ); - }); - - it('returns "createdOn" and "lastBackingIndexName" correctly for rolled over dataStream', async () => { - await rolloverDataStream(esClient, `${type}-${dataset}-${namespace}`); - const dataStreamSettings = await getDataStreamSettingsOfEarliestIndex( - esClient, - `${type}-${dataset}-${namespace}` - ); - const resp = await callApi(`${type}-${dataset}-${namespace}`, roleAuthc, internalReqHeader); - expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); - expect(resp.body.lastBackingIndexName).to.be( - `${createBackingIndexNameWithoutVersion({ type, dataset, namespace })}-000002` - ); - }); - }); -} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/index.ts index 86c8527139846..39b6a3cb476c1 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/index.ts @@ -9,7 +9,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('Dataset Quality', function () { loadTestFile(require.resolve('./data_stream_details')); - loadTestFile(require.resolve('./data_stream_settings')); loadTestFile(require.resolve('./degraded_field_values')); }); } diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/custom_mappings/custom_integration_mappings.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/custom_mappings/custom_integration_mappings.ts new file mode 100644 index 0000000000000..210d5fd349880 --- /dev/null +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/custom_mappings/custom_integration_mappings.ts @@ -0,0 +1,177 @@ +/* + * 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 { MappingTypeMapping } from '@elastic/elasticsearch/lib/api/types'; + +export const logsNginxMappings = (dataset: string): MappingTypeMapping => ({ + properties: { + '@timestamp': { + type: 'date', + ignore_malformed: false, + }, + cloud: { + properties: { + image: { + properties: { + id: { + type: 'keyword', + ignore_above: 1024, + }, + }, + }, + }, + }, + data_stream: { + properties: { + dataset: { + type: 'constant_keyword', + value: dataset, + }, + namespace: { + type: 'constant_keyword', + value: 'default', + }, + type: { + type: 'constant_keyword', + value: 'logs', + }, + }, + }, + ecs: { + properties: { + version: { + type: 'keyword', + ignore_above: 1024, + }, + }, + }, + error: { + properties: { + message: { + type: 'match_only_text', + }, + }, + }, + event: { + properties: { + agent_id_status: { + type: 'keyword', + ignore_above: 1024, + }, + dataset: { + type: 'constant_keyword', + value: 'nginx.access', + }, + ingested: { + type: 'date', + format: 'strict_date_time_no_millis||strict_date_optional_time||epoch_millis', + ignore_malformed: false, + }, + module: { + type: 'constant_keyword', + value: 'nginx', + }, + }, + }, + host: { + properties: { + containerized: { + type: 'boolean', + }, + name: { + type: 'keyword', + fields: { + text: { + type: 'match_only_text', + }, + }, + }, + os: { + properties: { + build: { + type: 'keyword', + ignore_above: 1024, + }, + codename: { + type: 'keyword', + ignore_above: 1024, + }, + }, + }, + }, + }, + input: { + properties: { + type: { + type: 'keyword', + ignore_above: 1024, + }, + }, + }, + log: { + properties: { + level: { + type: 'keyword', + ignore_above: 1024, + }, + offset: { + type: 'long', + }, + }, + }, + network: { + properties: { + bytes: { + type: 'long', + }, + }, + }, + nginx: { + properties: { + access: { + properties: { + remote_ip_list: { + type: 'keyword', + ignore_above: 1024, + }, + }, + }, + }, + }, + service: { + properties: { + name: { + type: 'keyword', + fields: { + text: { + type: 'match_only_text', + }, + }, + }, + }, + }, + test_field: { + type: 'keyword', + ignore_above: 1024, + }, + tls: { + properties: { + established: { + type: 'boolean', + }, + }, + }, + trace: { + properties: { + id: { + type: 'keyword', + ignore_above: 1024, + }, + }, + }, + }, +}); diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_details.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_details.ts index 712ed11a28f93..0d8d8e8865d52 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_details.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_details.ts @@ -385,6 +385,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { dataStream: degradedDataStreamName, }); + await PageObjects.datasetQuality.waitUntilTableLoaded(); + const rows = await PageObjects.datasetQuality.getDatasetQualityDetailsDegradedFieldTableRows(); diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/degraded_field_flyout.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/degraded_field_flyout.ts index 4072dcec8a25c..59d58a3e83151 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/degraded_field_flyout.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/degraded_field_flyout.ts @@ -17,6 +17,7 @@ import { } from './data'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { logsSynthMappings } from './custom_mappings/custom_synth_mappings'; +import { logsNginxMappings } from './custom_mappings/custom_integration_mappings'; export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects([ @@ -31,35 +32,43 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const esClient = getService('es'); const retry = getService('retry'); const to = new Date().toISOString(); + const type = 'logs'; const degradedDatasetName = 'synth.degraded'; - const degradedDataStreamName = `logs-${degradedDatasetName}-${defaultNamespace}`; + const degradedDataStreamName = `${type}-${degradedDatasetName}-${defaultNamespace}`; const degradedDatasetWithLimitsName = 'synth.degraded.rca'; - const degradedDatasetWithLimitDataStreamName = `logs-${degradedDatasetWithLimitsName}-${defaultNamespace}`; + const degradedDatasetWithLimitDataStreamName = `${type}-${degradedDatasetWithLimitsName}-${defaultNamespace}`; const serviceName = 'test_service'; const count = 5; const customComponentTemplateName = 'logs-synth@mappings'; - describe('Degraded fields flyout', function () { - before(async () => { - await synthtrace.index([ - // Ingest basic logs - getInitialTestLogs({ to, count: 4 }), - // Ingest Degraded Logs - createDegradedFieldsRecord({ - to: new Date().toISOString(), - count: 2, - dataset: degradedDatasetName, - }), - ]); - await PageObjects.svlCommonPage.loginWithPrivilegedRole(); - }); - - after(async () => { - await synthtrace.clean(); - }); + const nginxAccessDatasetName = 'nginx.access'; + const customComponentTemplateNameNginx = 'logs-nginx.access@custom'; + const nginxAccessDataStreamName = `${type}-${nginxAccessDatasetName}-${defaultNamespace}`; + const nginxPkg = { + name: 'nginx', + version: '1.23.0', + }; + describe('Degraded fields flyout', () => { describe('degraded field flyout open-close', () => { + before(async () => { + await synthtrace.index([ + // Ingest basic logs + getInitialTestLogs({ to, count: 4 }), + // Ingest Degraded Logs + createDegradedFieldsRecord({ + to: new Date().toISOString(), + count: 2, + dataset: degradedDatasetName, + }), + ]); + await PageObjects.svlCommonPage.loginAsAdmin(); + }); + + after(async () => { + await synthtrace.clean(); + }); it('should open and close the flyout when user clicks on the expand button', async () => { await PageObjects.datasetQuality.navigateToDetails({ dataStream: degradedDataStreamName, @@ -88,30 +97,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - describe('values exist', () => { - it('should display the degraded field values', async () => { - await PageObjects.datasetQuality.navigateToDetails({ - dataStream: degradedDataStreamName, - expandedDegradedField: 'test_field', - }); - - await retry.tryForTime(5000, async () => { - const cloudAvailabilityZoneValueExists = await PageObjects.datasetQuality.doesTextExist( - 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-values', - ANOTHER_1024_CHARS - ); - const cloudAvailabilityZoneValue2Exists = await PageObjects.datasetQuality.doesTextExist( - 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-values', - MORE_THAN_1024_CHARS - ); - expect(cloudAvailabilityZoneValueExists).to.be(true); - expect(cloudAvailabilityZoneValue2Exists).to.be(true); - }); - - await PageObjects.datasetQuality.closeFlyout(); - }); - }); - describe('testing root cause for ignored fields', () => { before(async () => { // Create custom component template @@ -140,8 +125,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { hidden: false, }, }); - // Ingest Degraded Logs with 25 fields + + // Install Nginx Integration and ingest logs for it + await PageObjects.observabilityLogsExplorer.installPackage(nginxPkg); + + // Create custom component template to avoid issues with LogsDB + await synthtrace.createComponentTemplate( + customComponentTemplateNameNginx, + logsNginxMappings(nginxAccessDatasetName) + ); + await synthtrace.index([ + // Ingest Degraded Logs with 25 fields timerange(moment(to).subtract(count, 'minute'), moment(to)) .interval('1m') .rate(1) @@ -159,7 +154,30 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { .defaults({ 'service.name': serviceName, 'trace.id': generateShortId(), - test_field: [MORE_THAN_1024_CHARS, 'hello world'], + test_field: [MORE_THAN_1024_CHARS, ANOTHER_1024_CHARS], + }) + .timestamp(timestamp) + ); + }), + // Ingest Degraded Logs with 43 fields in Nginx DataSet + timerange(moment(to).subtract(count, 'minute'), moment(to)) + .interval('1m') + .rate(1) + .generator((timestamp) => { + return Array(1) + .fill(0) + .flatMap(() => + log + .create() + .dataset(nginxAccessDatasetName) + .message('a log message') + .logLevel(MORE_THAN_1024_CHARS) + .service(serviceName) + .namespace(defaultNamespace) + .defaults({ + 'service.name': serviceName, + 'trace.id': generateShortId(), + test_field: [MORE_THAN_1024_CHARS, ANOTHER_1024_CHARS], }) .timestamp(timestamp) ); @@ -174,8 +192,13 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { } ); - // Ingest Degraded Logs with 26 field + // Set Limit of 42 + await PageObjects.datasetQuality.setDataStreamSettings(nginxAccessDataStreamName, { + 'mapping.total_fields.limit': 43, + }); + await synthtrace.index([ + // Ingest Degraded Logs with 26 field timerange(moment(to).subtract(count, 'minute'), moment(to)) .interval('1m') .rate(1) @@ -194,7 +217,31 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'service.name': serviceName, 'trace.id': generateShortId(), test_field: [MORE_THAN_1024_CHARS, 'hello world'], - 'cloud.region': 'us-east-1', + 'cloud.project.id': generateShortId(), + }) + .timestamp(timestamp) + ); + }), + // Ingest Degraded Logs with 44 fields in Nginx DataSet + timerange(moment(to).subtract(count, 'minute'), moment(to)) + .interval('1m') + .rate(1) + .generator((timestamp) => { + return Array(1) + .fill(0) + .flatMap(() => + log + .create() + .dataset(nginxAccessDatasetName) + .message('a log message') + .logLevel(MORE_THAN_1024_CHARS) + .service(serviceName) + .namespace(defaultNamespace) + .defaults({ + 'service.name': serviceName, + 'trace.id': generateShortId(), + test_field: [MORE_THAN_1024_CHARS, ANOTHER_1024_CHARS], + 'cloud.project.id': generateShortId(), }) .timestamp(timestamp) ); @@ -203,9 +250,30 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Rollover Datastream to reset the limit to default which is 1000 await PageObjects.datasetQuality.rolloverDataStream(degradedDatasetWithLimitDataStreamName); + await PageObjects.datasetQuality.rolloverDataStream(nginxAccessDataStreamName); + + // Set Limit of 26 + await PageObjects.datasetQuality.setDataStreamSettings( + PageObjects.datasetQuality.generateBackingIndexNameWithoutVersion({ + dataset: degradedDatasetWithLimitsName, + }) + '-000002', + { + 'mapping.total_fields.limit': 26, + } + ); + + // Set Limit of 44 + await PageObjects.datasetQuality.setDataStreamSettings( + PageObjects.datasetQuality.generateBackingIndexNameWithoutVersion({ + dataset: nginxAccessDatasetName, + }) + '-000002', + { + 'mapping.total_fields.limit': 44, + } + ); - // Ingest docs with 26 fields again await synthtrace.index([ + // Ingest Degraded Logs with 26 field timerange(moment(to).subtract(count, 'minute'), moment(to)) .interval('1m') .rate(1) @@ -221,20 +289,164 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { .service(serviceName) .namespace(defaultNamespace) .defaults({ - 'log.file.path': '/my-service.log', 'service.name': serviceName, 'trace.id': generateShortId(), test_field: [MORE_THAN_1024_CHARS, 'hello world'], - 'cloud.region': 'us-east-1', + 'cloud.project.id': generateShortId(), + }) + .timestamp(timestamp) + ); + }), + // Ingest Degraded Logs with 43 fields in Nginx DataSet + timerange(moment(to).subtract(count, 'minute'), moment(to)) + .interval('1m') + .rate(1) + .generator((timestamp) => { + return Array(1) + .fill(0) + .flatMap(() => + log + .create() + .dataset(nginxAccessDatasetName) + .message('a log message') + .logLevel(MORE_THAN_1024_CHARS) + .service(serviceName) + .namespace(defaultNamespace) + .defaults({ + 'service.name': serviceName, + 'trace.id': generateShortId(), + test_field: [MORE_THAN_1024_CHARS, ANOTHER_1024_CHARS], + 'cloud.project.id': generateShortId(), }) .timestamp(timestamp) ); }), ]); + await PageObjects.svlCommonPage.loginAsAdmin(); }); - describe('field character limit exceeded', () => { - it('should display cause as "field ignored" when a field is ignored due to field above issue', async () => { + describe('current quality issues', () => { + it('should display issues only from latest backing index when current issues toggle is on', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + }); + + const currentIssuesToggleState = + await PageObjects.datasetQuality.getQualityIssueSwitchState(); + + expect(currentIssuesToggleState).to.be(false); + + const rows = + await PageObjects.datasetQuality.getDatasetQualityDetailsDegradedFieldTableRows(); + + expect(rows.length).to.eql(4); + + await testSubjects.click( + PageObjects.datasetQuality.testSubjectSelectors + .datasetQualityDetailsOverviewDegradedFieldToggleSwitch + ); + + const newCurrentIssuesToggleState = + await PageObjects.datasetQuality.getQualityIssueSwitchState(); + + expect(newCurrentIssuesToggleState).to.be(true); + + const newRows = + await PageObjects.datasetQuality.getDatasetQualityDetailsDegradedFieldTableRows(); + + expect(newRows.length).to.eql(3); + }); + + it('should keep the toggle on when url state says so', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + expandedDegradedField: 'test_field', + showCurrentQualityIssues: true, + }); + + const currentIssuesToggleState = + await PageObjects.datasetQuality.getQualityIssueSwitchState(); + + expect(currentIssuesToggleState).to.be(true); + }); + + it('should display count from latest backing index when current issues toggle is on in the table and in the flyout', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + expandedDegradedField: 'test_field', + showCurrentQualityIssues: true, + }); + + // Check value in Table + const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); + const countColumn = table['Docs count']; + expect(await countColumn.getCellTexts()).to.eql(['5', '5', '5']); + + // Check value in Flyout + await retry.tryForTime(5000, async () => { + const countValue = await PageObjects.datasetQuality.doesTextExist( + 'datasetQualityDetailsDegradedFieldFlyoutFieldsList-docCount', + '5' + ); + expect(countValue).to.be(true); + }); + + // Toggle the switch + await testSubjects.click( + PageObjects.datasetQuality.testSubjectSelectors + .datasetQualityDetailsOverviewDegradedFieldToggleSwitch + ); + + // Check value in Table + const newTable = await PageObjects.datasetQuality.parseDegradedFieldTable(); + const newCountColumn = newTable['Docs count']; + expect(await newCountColumn.getCellTexts()).to.eql(['15', '15', '5', '5']); + + // Check value in Flyout + await retry.tryForTime(5000, async () => { + const newCountValue = await PageObjects.datasetQuality.doesTextExist( + 'datasetQualityDetailsDegradedFieldFlyoutFieldsList-docCount', + '15' + ); + expect(newCountValue).to.be(true); + }); + }); + + it('should close the flyout if passed value in URL no more exists in latest backing index and current quality toggle is switched on', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + expandedDegradedField: 'cloud', + showCurrentQualityIssues: true, + }); + + await testSubjects.missingOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + ); + }); + + it('should close the flyout when current quality switch is toggled on and the flyout is already open with an old field ', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + expandedDegradedField: 'cloud', + }); + + await testSubjects.existOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + ); + + await testSubjects.click( + PageObjects.datasetQuality.testSubjectSelectors + .datasetQualityDetailsOverviewDegradedFieldToggleSwitch + ); + + await testSubjects.missingOrFail( + PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + ); + }); + }); + + describe('character limit exceeded', () => { + it('should display cause as "field character limit exceeded" when a field is ignored due to character limit issue', async () => { await PageObjects.datasetQuality.navigateToDetails({ dataStream: degradedDatasetWithLimitDataStreamName, expandedDegradedField: 'test_field', @@ -251,25 +463,169 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.datasetQuality.closeFlyout(); }); - it('should display values when cause is "field ignored"', async () => { + it('should display values when cause is "field character limit exceeded"', async () => { await PageObjects.datasetQuality.navigateToDetails({ dataStream: degradedDatasetWithLimitDataStreamName, expandedDegradedField: 'test_field', }); await retry.tryForTime(5000, async () => { - const testFieldValueExists = await PageObjects.datasetQuality.doesTextExist( + const testFieldValue1Exists = await PageObjects.datasetQuality.doesTextExist( 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-values', MORE_THAN_1024_CHARS ); - expect(testFieldValueExists).to.be(true); + const testFieldValue2Exists = await PageObjects.datasetQuality.doesTextExist( + 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-values', + ANOTHER_1024_CHARS + ); + expect(testFieldValue1Exists).to.be(true); + expect(testFieldValue2Exists).to.be(true); }); await PageObjects.datasetQuality.closeFlyout(); }); + + it('should display the maximum character limit when cause is "field character limit exceeded"', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + expandedDegradedField: 'test_field', + }); + + await retry.tryForTime(5000, async () => { + const limitValueExists = await PageObjects.datasetQuality.doesTextExist( + 'datasetQualityDetailsDegradedFieldFlyoutFieldValue-characterLimit', + '1024' + ); + expect(limitValueExists).to.be(true); + }); + + await PageObjects.datasetQuality.closeFlyout(); + }); + + it('should show possible mitigation section with manual options for non integrations', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + expandedDegradedField: 'test_field', + }); + + // Possible Mitigation Section should exist + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutPossibleMitigationTitle' + ); + + // It's a technical preview + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutPossibleMitigationTechPreviewBadge' + ); + + // Should display Edit/Create Component Template Link option + await testSubjects.existOrFail( + 'datasetQualityManualMitigationsCustomComponentTemplateLink' + ); + + // Should display Edit/Create Ingest Pipeline Link option + await testSubjects.existOrFail('datasetQualityManualMitigationsPipelineAccordion'); + + // Check Component Template URl + const button = await testSubjects.find( + 'datasetQualityManualMitigationsCustomComponentTemplateLink' + ); + const componentTemplateUrl = await button.getAttribute('data-test-url'); + + // Should point to index template with the datastream name as value + expect(componentTemplateUrl).to.be( + `/data/index_management/templates/${degradedDatasetWithLimitDataStreamName}` + ); + + const nonIntegrationCustomName = `${type}@custom`; + + const pipelineInputBox = await testSubjects.find( + 'datasetQualityManualMitigationsPipelineName' + ); + const pipelineValue = await pipelineInputBox.getAttribute('value'); + + // Expect Pipeline Name to be default logs for non integrations + expect(pipelineValue).to.be(nonIntegrationCustomName); + + const pipelineLink = await testSubjects.find( + 'datasetQualityManualMitigationsPipelineLink' + ); + const pipelineLinkURL = await pipelineLink.getAttribute('data-test-url'); + + // Expect the pipeline link to point to the pipeline page with empty pipeline value + expect(pipelineLinkURL).to.be( + `/app/management/ingest/ingest_pipelines/?pipeline=${encodeURIComponent( + nonIntegrationCustomName + )}` + ); + }); + + it('should show possible mitigation section with different manual options for integrations', async () => { + // Navigate to Integration Dataset + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: nginxAccessDataStreamName, + expandedDegradedField: 'test_field', + }); + + await PageObjects.datasetQuality.waitUntilPossibleMitigationsLoaded(); + + // Possible Mitigation Section should exist + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutPossibleMitigationTitle' + ); + + // It's a technical preview + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutPossibleMitigationTechPreviewBadge' + ); + + // Should display Edit/Create Component Template Link option + await testSubjects.existOrFail( + 'datasetQualityManualMitigationsCustomComponentTemplateLink' + ); + + // Should display Edit/Create Ingest Pipeline Link option + await testSubjects.existOrFail('datasetQualityManualMitigationsPipelineAccordion'); + + // Check Component Template URl + const button = await testSubjects.find( + 'datasetQualityManualMitigationsCustomComponentTemplateLink' + ); + const componentTemplateUrl = await button.getAttribute('data-test-url'); + + const integrationSpecificCustomName = `${type}-${nginxAccessDatasetName}@custom`; + + // Should point to component template with @custom as value + expect(componentTemplateUrl).to.be( + `/data/index_management/component_templates/${encodeURIComponent( + integrationSpecificCustomName + )}` + ); + + const pipelineInputBox = await testSubjects.find( + 'datasetQualityManualMitigationsPipelineName' + ); + const pipelineValue = await pipelineInputBox.getAttribute('value'); + + // Expect Pipeline Name to be default logs for non integrations + expect(pipelineValue).to.be(integrationSpecificCustomName); + + const pipelineLink = await testSubjects.find( + 'datasetQualityManualMitigationsPipelineLink' + ); + + const pipelineLinkURL = await pipelineLink.getAttribute('data-test-url'); + + // Expect the pipeline link to point to the pipeline page with empty pipeline value + expect(pipelineLinkURL).to.be( + `/app/management/ingest/ingest_pipelines/?pipeline=${encodeURIComponent( + integrationSpecificCustomName + )}` + ); + }); }); - describe('field limit exceeded', () => { + describe('past field limit exceeded', () => { it('should display cause as "field limit exceeded" when a field is ignored due to field limit issue', async () => { await PageObjects.datasetQuality.navigateToDetails({ dataStream: degradedDatasetWithLimitDataStreamName, @@ -287,7 +643,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.datasetQuality.closeFlyout(); }); - it('should display the limit when the cause is "field limit exceeded"', async () => { + it('should display the current field limit when the cause is "field limit exceeded"', async () => { await PageObjects.datasetQuality.navigateToDetails({ dataStream: degradedDatasetWithLimitDataStreamName, expandedDegradedField: 'cloud', @@ -317,122 +673,216 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - describe('current quality issues', () => { - it('should display issues only from latest backing index when current issues toggle is on', async () => { + describe('current field limit issues', () => { + it('should display increase field limit as a possible mitigation for integrations', async () => { await PageObjects.datasetQuality.navigateToDetails({ - dataStream: degradedDatasetWithLimitDataStreamName, + dataStream: nginxAccessDataStreamName, + expandedDegradedField: 'cloud.project.id', }); - const currentIssuesToggleState = - await PageObjects.datasetQuality.getQualityIssueSwitchState(); + // Field Limit Mitigation Section should exist + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutFieldLimitMitigationAccordion' + ); - expect(currentIssuesToggleState).to.be(false); + // Should display the panel to increase field limit + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutIncreaseFieldLimitPanel' + ); - const rows = - await PageObjects.datasetQuality.getDatasetQualityDetailsDegradedFieldTableRows(); + // Should display official online documentation link + await testSubjects.existOrFail( + 'datasetQualityManualMitigationsPipelineOfficialDocumentationLink' + ); - expect(rows.length).to.eql(3); + const linkButton = await testSubjects.find( + 'datasetQualityManualMitigationsPipelineOfficialDocumentationLink' + ); - await testSubjects.click( - PageObjects.datasetQuality.testSubjectSelectors - .datasetQualityDetailsOverviewDegradedFieldToggleSwitch + const linkURL = await linkButton.getAttribute('href'); + + expect(linkURL).to.be( + 'https://www.elastic.co/guide/en/elasticsearch/reference/master/mapping-settings-limit.html' ); + }); - const newCurrentIssuesToggleState = - await PageObjects.datasetQuality.getQualityIssueSwitchState(); + it('should display increase field limit as a possible mitigation for non integration', async () => { + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: degradedDatasetWithLimitDataStreamName, + expandedDegradedField: 'cloud.project', + }); - expect(newCurrentIssuesToggleState).to.be(true); + // Field Limit Mitigation Section should exist + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutFieldLimitMitigationAccordion' + ); - const newRows = - await PageObjects.datasetQuality.getDatasetQualityDetailsDegradedFieldTableRows(); + // Should not display the panel to increase field limit + await testSubjects.missingOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutIncreaseFieldLimitPanel' + ); - expect(newRows.length).to.eql(2); + // Should display official online documentation link + await testSubjects.existOrFail( + 'datasetQualityManualMitigationsPipelineOfficialDocumentationLink' + ); }); - it('should keep the toggle on when url state says so', async () => { + it('should display additional input fields and button increasing the limit for integrations', async () => { await PageObjects.datasetQuality.navigateToDetails({ - dataStream: degradedDatasetWithLimitDataStreamName, - expandedDegradedField: 'test_field', - showCurrentQualityIssues: true, + dataStream: nginxAccessDataStreamName, + expandedDegradedField: 'cloud.project.id', }); - const currentIssuesToggleState = - await PageObjects.datasetQuality.getQualityIssueSwitchState(); + // Should display current field limit + await testSubjects.existOrFail('datasetQualityIncreaseFieldMappingCurrentLimitFieldText'); - expect(currentIssuesToggleState).to.be(true); + const currentFieldLimitInput = await testSubjects.find( + 'datasetQualityIncreaseFieldMappingCurrentLimitFieldText' + ); + + const currentFieldLimitValue = await currentFieldLimitInput.getAttribute('value'); + const currentFieldLimit = parseInt(currentFieldLimitValue as string, 10); + const currentFieldLimitDisabledStatus = await currentFieldLimitInput.getAttribute( + 'disabled' + ); + + expect(currentFieldLimit).to.be(44); + expect(currentFieldLimitDisabledStatus).to.be('true'); + + // Should display new field limit + await testSubjects.existOrFail( + 'datasetQualityIncreaseFieldMappingProposedLimitFieldText' + ); + + const newFieldLimitInput = await testSubjects.find( + 'datasetQualityIncreaseFieldMappingProposedLimitFieldText' + ); + + const newFieldLimitValue = await newFieldLimitInput.getAttribute('value'); + const newFieldLimit = parseInt(newFieldLimitValue as string, 10); + + // Should be 30% more the current limit + const newLimit = Math.round(currentFieldLimit * 1.3); + expect(newFieldLimit).to.be(newLimit); + + // Should display the apply button + await testSubjects.existOrFail('datasetQualityIncreaseFieldMappingLimitButtonButton'); + + const applyButton = await testSubjects.find( + 'datasetQualityIncreaseFieldMappingLimitButtonButton' + ); + const applyButtonDisabledStatus = await applyButton.getAttribute('disabled'); + + // The apply button should be active + expect(applyButtonDisabledStatus).to.be(null); }); - it('should display count from latest backing index when current issues toggle is on in the table and in the flyout', async () => { + it('should validate input for new field limit', async () => { await PageObjects.datasetQuality.navigateToDetails({ - dataStream: degradedDatasetWithLimitDataStreamName, - expandedDegradedField: 'test_field', - showCurrentQualityIssues: true, + dataStream: nginxAccessDataStreamName, + expandedDegradedField: 'cloud.project.id', }); - // Check value in Table - const table = await PageObjects.datasetQuality.parseDegradedFieldTable(); - const countColumn = table['Docs count']; - expect(await countColumn.getCellTexts()).to.eql(['5', '5']); + // Should not allow values less than current limit of 44 + await testSubjects.setValue( + 'datasetQualityIncreaseFieldMappingProposedLimitFieldText', + '42', + { + clearWithKeyboard: true, + typeCharByChar: true, + } + ); - // Check value in Flyout - await retry.tryForTime(5000, async () => { - const countValue = await PageObjects.datasetQuality.doesTextExist( - 'datasetQualityDetailsDegradedFieldFlyoutFieldsList-docCount', - '5' - ); - expect(countValue).to.be(true); + const applyButton = await testSubjects.find( + 'datasetQualityIncreaseFieldMappingLimitButtonButton' + ); + const applyButtonDisabledStatus = await applyButton.getAttribute('disabled'); + + // The apply button should be active + expect(applyButtonDisabledStatus).to.be('true'); + + const newFieldLimitInput = await testSubjects.find( + 'datasetQualityIncreaseFieldMappingProposedLimitFieldText' + ); + const invalidStatus = await newFieldLimitInput.getAttribute('aria-invalid'); + + expect(invalidStatus).to.be('true'); + }); + + it('should validate and show error callout when API call fails', async () => { + await PageObjects.svlCommonPage.loginWithPrivilegedRole(); + + await PageObjects.datasetQuality.navigateToDetails({ + dataStream: nginxAccessDataStreamName, + expandedDegradedField: 'cloud.project.id', }); - // Toggle the switch - await testSubjects.click( - PageObjects.datasetQuality.testSubjectSelectors - .datasetQualityDetailsOverviewDegradedFieldToggleSwitch + const applyButton = await testSubjects.find( + 'datasetQualityIncreaseFieldMappingLimitButtonButton' ); - // Check value in Table - const newTable = await PageObjects.datasetQuality.parseDegradedFieldTable(); - const newCountColumn = newTable['Docs count']; - expect(await newCountColumn.getCellTexts()).to.eql(['15', '15', '5']); + await applyButton.click(); - // Check value in Flyout await retry.tryForTime(5000, async () => { - const newCountValue = await PageObjects.datasetQuality.doesTextExist( - 'datasetQualityDetailsDegradedFieldFlyoutFieldsList-docCount', - '15' - ); - expect(newCountValue).to.be(true); + // Should display the error callout + await testSubjects.existOrFail('datasetQualityDetailsNewFieldLimitErrorCallout'); }); + + await PageObjects.svlCommonPage.loginAsAdmin(); }); - it('should close the flyout if passed value in URL no more exists in latest backing index and current quality toggle is switched on', async () => { + it('should let user increase the field limit for integrations', async () => { await PageObjects.datasetQuality.navigateToDetails({ - dataStream: degradedDatasetWithLimitDataStreamName, - expandedDegradedField: 'cloud', - showCurrentQualityIssues: true, + dataStream: nginxAccessDataStreamName, + expandedDegradedField: 'cloud.project.id', }); - await testSubjects.missingOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + const applyButton = await testSubjects.find( + 'datasetQualityIncreaseFieldMappingLimitButtonButton' ); - }); - it('should close the flyout when current quality switch is toggled on and the flyout is already open with an old field ', async () => { - await PageObjects.datasetQuality.navigateToDetails({ - dataStream: degradedDatasetWithLimitDataStreamName, - expandedDegradedField: 'cloud', + await applyButton.click(); + + await retry.tryForTime(5000, async () => { + // Should display the success callout + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFlyoutNewLimitSetSuccessCallout' + ); + + // Should display link to component template edited + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFlyoutNewLimitSetCheckComponentTemplate' + ); + + const ctLink = await testSubjects.find( + 'datasetQualityDetailsDegradedFlyoutNewLimitSetCheckComponentTemplate' + ); + const ctLinkURL = await ctLink.getAttribute('href'); + + const componentTemplateName = `${type}-${nginxAccessDatasetName}@custom`; + + // Should point to the component template page + expect( + ctLinkURL?.endsWith( + `/data/index_management/component_templates/${encodeURIComponent( + componentTemplateName + )}` + ) + ).to.be(true); }); - await testSubjects.existOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout - ); + // Refresh the time range to get the latest data + await PageObjects.datasetQuality.refreshDetailsPageData(); - await testSubjects.click( - PageObjects.datasetQuality.testSubjectSelectors - .datasetQualityDetailsOverviewDegradedFieldToggleSwitch + // The page should now handle this as ignore_malformed issue and show a warning + await testSubjects.existOrFail( + 'datasetQualityDetailsDegradedFieldFlyoutIssueDoesNotExist' ); + // Should not display the panel to increase field limit await testSubjects.missingOrFail( - PageObjects.datasetQuality.testSubjectSelectors.datasetQualityDetailsDegradedFieldFlyout + 'datasetQualityDetailsDegradedFieldFlyoutIncreaseFieldLimitPanel' ); }); }); @@ -443,6 +893,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { name: degradedDatasetWithLimitDataStreamName, }); await synthtrace.deleteComponentTemplate(customComponentTemplateName); + await PageObjects.observabilityLogsExplorer.uninstallPackage(nginxPkg); + await synthtrace.deleteComponentTemplate(customComponentTemplateNameNginx); }); }); }); From 6e3bf7775e52515d5dfc653d25e769b0252c4d3d Mon Sep 17 00:00:00 2001 From: Gerard Soldevila Date: Fri, 25 Oct 2024 11:26:05 +0200 Subject: [PATCH 015/135] [Sustainable Kibana Architecture] Address `security` group dependencies' issues (#197480) ## Summary In the scope of [Sustainable Kibana Architecture](https://github.com/elastic/kibana-team/issues/1179), this PR fixes invalid dependencies from `security solution` code towards packages that are categorised as `group: 'platform', visibility: 'private'`. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/saved_objects_tagging_oss/common/index.ts | 1 + .../server/services/epm/kibana/assets/tag_assets.ts | 3 ++- .../public/components/result_tag_list.tsx | 4 ++-- .../public/lib/result_to_option.test.ts | 2 +- .../global_search_bar/public/lib/result_to_option.tsx | 3 ++- x-pack/plugins/saved_objects_tagging/common/index.ts | 8 -------- .../saved_objects_tagging/common/test_utils/index.ts | 8 ++++---- x-pack/plugins/saved_objects_tagging/common/types.ts | 3 ++- .../saved_objects_tagging/common/validation.ts | 2 +- .../public/components/base/tag_badge.tsx | 4 ++-- .../public/components/base/tag_list.tsx | 4 ++-- .../public/components/base/tag_searchbar_option.tsx | 4 ++-- .../public/components/base/tag_selector.tsx | 6 +++--- .../public/components/connected/tag_list.tsx | 10 +++++----- .../public/components/connected/tag_selector.tsx | 10 +++++----- .../components/edition_modal/create_modal.test.tsx | 4 ++-- .../public/components/edition_modal/create_modal.tsx | 4 ++-- .../components/edition_modal/create_or_edit_modal.tsx | 6 +++--- .../public/components/edition_modal/edit_modal.tsx | 4 ++-- .../public/components/edition_modal/open_modal.tsx | 6 +++--- .../public/components/edition_modal/use_validation.ts | 2 +- .../public/components/edition_modal/utils.ts | 4 ++-- x-pack/plugins/saved_objects_tagging/public/index.ts | 1 - .../public/management/actions/assign.ts | 2 +- .../public/management/actions/delete.ts | 2 +- .../public/management/actions/edit.ts | 2 +- .../public/management/actions/types.ts | 2 +- .../public/management/components/table.tsx | 3 ++- .../public/management/tag_management_page.tsx | 5 +++-- .../management/utils/get_tag_connections_url.test.ts | 2 +- .../management/utils/get_tag_connections_url.ts | 4 ++-- .../public/services/tags/tags_cache.test.ts | 4 ++-- .../public/services/tags/tags_cache.ts | 8 ++++---- .../public/services/tags/tags_client.test.ts | 4 ++-- .../public/services/tags/tags_client.ts | 6 +++--- .../public/ui_api/get_search_bar_filter.test.ts | 4 ++-- .../public/ui_api/get_search_bar_filter.tsx | 4 ++-- x-pack/plugins/saved_objects_tagging/public/utils.ts | 7 ++++--- x-pack/plugins/saved_objects_tagging/server/index.ts | 3 +-- .../server/request_handler_context.ts | 8 ++++---- .../server/routes/internal/find_tags.ts | 2 +- .../server/routes/lib/get_connection_count.ts | 4 ++-- .../saved_objects_tagging/server/saved_objects/tag.ts | 5 +++-- .../server/services/tags/tags_client.mock.ts | 2 +- .../server/services/tags/tags_client.test.ts | 4 ++-- .../server/services/tags/tags_client.ts | 11 ++++++++--- .../server/services/tags/utils.ts | 2 +- .../server/services/tags/validate_tag.test.ts | 2 +- .../server/services/tags/validate_tag.ts | 4 ++-- x-pack/plugins/saved_objects_tagging/server/types.ts | 4 ++-- .../public/common/containers/tags/api.ts | 2 +- .../containers/use_fetch_security_tags.test.ts | 2 +- .../public/dashboards/context/dashboard_context.tsx | 2 +- .../server/lib/tags/saved_objects/create_tag.ts | 2 +- .../lib/tags/saved_objects/find_tags_by_name.ts | 2 +- .../server/usage/dashboards/get_dashboards_metrics.ts | 2 +- x-pack/plugins/security_solution/tsconfig.json | 1 - 57 files changed, 114 insertions(+), 112 deletions(-) diff --git a/src/plugins/saved_objects_tagging_oss/common/index.ts b/src/plugins/saved_objects_tagging_oss/common/index.ts index 7d0a78571cb3c..c07d4e612aa49 100644 --- a/src/plugins/saved_objects_tagging_oss/common/index.ts +++ b/src/plugins/saved_objects_tagging_oss/common/index.ts @@ -10,6 +10,7 @@ export type { Tag, TagAttributes, + CreateTagOptions, GetAllTagsOptions, ITagsClient, TagWithOptionalId, diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.ts b/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.ts index 86127c19e2811..44d55c660e99d 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.ts @@ -9,7 +9,8 @@ import { v5 as uuidv5 } from 'uuid'; import { uniqBy } from 'lodash'; import type { SavedObjectsImportSuccess } from '@kbn/core-saved-objects-common'; import { taggableTypes } from '@kbn/saved-objects-tagging-plugin/common/constants'; -import type { IAssignmentService, ITagsClient } from '@kbn/saved-objects-tagging-plugin/server'; +import type { IAssignmentService } from '@kbn/saved-objects-tagging-plugin/server'; +import type { ITagsClient } from '@kbn/saved-objects-tagging-plugin/common/types'; import type { KibanaAssetType } from '../../../../../common'; import type { PackageSpecTags } from '../../../../types'; diff --git a/x-pack/plugins/global_search_bar/public/components/result_tag_list.tsx b/x-pack/plugins/global_search_bar/public/components/result_tag_list.tsx index 5d8c90b536a1a..ce1069726ce0f 100644 --- a/x-pack/plugins/global_search_bar/public/components/result_tag_list.tsx +++ b/x-pack/plugins/global_search_bar/public/components/result_tag_list.tsx @@ -5,10 +5,10 @@ * 2.0. */ -import React, { FC } from 'react'; +import React, { type FC } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiBadge } from '@elastic/eui'; -import type { Tag } from '@kbn/saved-objects-tagging-plugin/public'; +import type { Tag } from '@kbn/saved-objects-tagging-oss-plugin/common'; const MAX_TAGS_TO_SHOW = 3; diff --git a/x-pack/plugins/global_search_bar/public/lib/result_to_option.test.ts b/x-pack/plugins/global_search_bar/public/lib/result_to_option.test.ts index 0a2c5c57e725c..bbba64c08fcd6 100644 --- a/x-pack/plugins/global_search_bar/public/lib/result_to_option.test.ts +++ b/x-pack/plugins/global_search_bar/public/lib/result_to_option.test.ts @@ -6,7 +6,7 @@ */ import type { GlobalSearchResult } from '@kbn/global-search-plugin/common/types'; -import { Tag } from '@kbn/saved-objects-tagging-plugin/public'; +import type { Tag } from '@kbn/saved-objects-tagging-oss-plugin/common'; import { resultToOption } from './result_to_option'; const createSearchResult = (parts: Partial = {}): GlobalSearchResult => ({ diff --git a/x-pack/plugins/global_search_bar/public/lib/result_to_option.tsx b/x-pack/plugins/global_search_bar/public/lib/result_to_option.tsx index 7b28844f9e4ad..4fe654da2ad93 100644 --- a/x-pack/plugins/global_search_bar/public/lib/result_to_option.tsx +++ b/x-pack/plugins/global_search_bar/public/lib/result_to_option.tsx @@ -8,7 +8,8 @@ import React from 'react'; import type { EuiSelectableTemplateSitewideOption } from '@elastic/eui'; import type { GlobalSearchResult } from '@kbn/global-search-plugin/common/types'; -import type { SavedObjectTaggingPluginStart, Tag } from '@kbn/saved-objects-tagging-plugin/public'; +import type { SavedObjectTaggingPluginStart } from '@kbn/saved-objects-tagging-plugin/public'; +import type { Tag } from '@kbn/saved-objects-tagging-oss-plugin/common'; import { ResultTagList } from '../components/result_tag_list'; const cleanMeta = (str: string) => (str.charAt(0).toUpperCase() + str.slice(1)).replace(/-/g, ' '); diff --git a/x-pack/plugins/saved_objects_tagging/common/index.ts b/x-pack/plugins/saved_objects_tagging/common/index.ts index 785692065a60c..d883ac78c7c05 100644 --- a/x-pack/plugins/saved_objects_tagging/common/index.ts +++ b/x-pack/plugins/saved_objects_tagging/common/index.ts @@ -8,14 +8,6 @@ export type { TagsCapabilities } from './capabilities'; export { getTagsCapabilities } from './capabilities'; export { tagFeatureId, tagSavedObjectTypeName, tagManagementSectionId } from './constants'; -export type { - TagWithRelations, - TagAttributes, - Tag, - ITagsClient, - TagSavedObject, - TagWithOptionalId, -} from './types'; export type { TagValidation } from './validation'; export { validateTagColor, diff --git a/x-pack/plugins/saved_objects_tagging/common/test_utils/index.ts b/x-pack/plugins/saved_objects_tagging/common/test_utils/index.ts index 03f3f6e50d0de..3f506413028d8 100644 --- a/x-pack/plugins/saved_objects_tagging/common/test_utils/index.ts +++ b/x-pack/plugins/saved_objects_tagging/common/test_utils/index.ts @@ -5,10 +5,10 @@ * 2.0. */ -import { SavedObject, SavedObjectReference } from '@kbn/core/types'; -import { Tag, TagAttributes } from '../types'; -import { TagsCapabilities } from '../capabilities'; -import { AssignableObject } from '../assignments'; +import type { SavedObject, SavedObjectReference } from '@kbn/core/types'; +import type { Tag, TagAttributes } from '../types'; +import type { TagsCapabilities } from '../capabilities'; +import type { AssignableObject } from '../assignments'; export const createReference = (type: string, id: string): SavedObjectReference => ({ type, diff --git a/x-pack/plugins/saved_objects_tagging/common/types.ts b/x-pack/plugins/saved_objects_tagging/common/types.ts index 2ea2ae0b4a363..e82c3c1e0443b 100644 --- a/x-pack/plugins/saved_objects_tagging/common/types.ts +++ b/x-pack/plugins/saved_objects_tagging/common/types.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { SavedObject } from '@kbn/core/types'; +import type { SavedObject } from '@kbn/core/types'; import type { Tag, TagAttributes } from '@kbn/saved-objects-tagging-oss-plugin/common'; export type TagSavedObject = SavedObject; @@ -20,6 +20,7 @@ export type TagWithRelations = Tag & { // re-export types from oss definition export type { Tag, + CreateTagOptions, TagAttributes, TagWithOptionalId, GetAllTagsOptions, diff --git a/x-pack/plugins/saved_objects_tagging/common/validation.ts b/x-pack/plugins/saved_objects_tagging/common/validation.ts index 6f5d7a672c0cc..feea7ba890448 100644 --- a/x-pack/plugins/saved_objects_tagging/common/validation.ts +++ b/x-pack/plugins/saved_objects_tagging/common/validation.ts @@ -6,7 +6,7 @@ */ import { i18n } from '@kbn/i18n'; -import { Tag } from './types'; +import type { Tag } from './types'; export const tagNameMinLength = 2; export const tagNameMaxLength = 50; diff --git a/x-pack/plugins/saved_objects_tagging/public/components/base/tag_badge.tsx b/x-pack/plugins/saved_objects_tagging/public/components/base/tag_badge.tsx index d2367219aa823..d6cbbb47fe451 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/base/tag_badge.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/components/base/tag_badge.tsx @@ -5,10 +5,10 @@ * 2.0. */ -import React, { ReactElement } from 'react'; +import React, { type ReactElement } from 'react'; import { EuiBadge } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { TagAttributes } from '../../../common/types'; +import type { TagAttributes } from '../../../common/types'; export interface TagBadgeProps { tag: T; diff --git a/x-pack/plugins/saved_objects_tagging/public/components/base/tag_list.tsx b/x-pack/plugins/saved_objects_tagging/public/components/base/tag_list.tsx index cfe67c5ed0827..9ed583147464f 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/base/tag_list.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/components/base/tag_list.tsx @@ -5,9 +5,9 @@ * 2.0. */ -import React, { FC } from 'react'; +import React, { type FC } from 'react'; import { EuiBadgeGroup } from '@elastic/eui'; -import { TagWithOptionalId } from '../../../common/types'; +import type { TagWithOptionalId } from '../../../common/types'; import { TagBadge } from './tag_badge'; export interface TagListProps { diff --git a/x-pack/plugins/saved_objects_tagging/public/components/base/tag_searchbar_option.tsx b/x-pack/plugins/saved_objects_tagging/public/components/base/tag_searchbar_option.tsx index 4abafe10345bb..c691d5120fa36 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/base/tag_searchbar_option.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/components/base/tag_searchbar_option.tsx @@ -5,9 +5,9 @@ * 2.0. */ -import React, { FC } from 'react'; +import React, { type FC } from 'react'; import { EuiHealth, EuiText } from '@elastic/eui'; -import { Tag } from '../../../common'; +import type { Tag } from '../../../common/types'; import { testSubjFriendly } from '../../utils'; export interface TagSearchBarOptionProps { diff --git a/x-pack/plugins/saved_objects_tagging/public/components/base/tag_selector.tsx b/x-pack/plugins/saved_objects_tagging/public/components/base/tag_selector.tsx index 119058cc54c1f..039ac294690ab 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/base/tag_selector.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/components/base/tag_selector.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { FC, useMemo, useCallback, useState } from 'react'; +import React, { type FC, useMemo, useCallback, useState } from 'react'; import { EuiComboBox, EuiHealth, @@ -17,9 +17,9 @@ import { EuiComboBoxProps, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { Tag } from '../../../common'; +import type { Tag } from '../../../common/types'; import { testSubjFriendly } from '../../utils'; -import { CreateModalOpener } from '../edition_modal'; +import type { CreateModalOpener } from '../edition_modal'; interface CreateOption { type: '__create_option__'; diff --git a/x-pack/plugins/saved_objects_tagging/public/components/connected/tag_list.tsx b/x-pack/plugins/saved_objects_tagging/public/components/connected/tag_list.tsx index 46deb57db7f40..d3c65926fa00f 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/connected/tag_list.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/components/connected/tag_list.tsx @@ -5,14 +5,14 @@ * 2.0. */ -import React, { FC, useMemo } from 'react'; +import React, { type FC, useMemo } from 'react'; import useObservable from 'react-use/lib/useObservable'; -import { SavedObjectReference } from '@kbn/core/types'; -import { TagListComponentProps } from '@kbn/saved-objects-tagging-oss-plugin/public'; -import { Tag, TagWithOptionalId } from '../../../common/types'; +import type { SavedObjectReference } from '@kbn/core/types'; +import type { TagListComponentProps } from '@kbn/saved-objects-tagging-oss-plugin/public'; +import type { Tag, TagWithOptionalId } from '../../../common/types'; import { getObjectTags } from '../../utils'; import { TagList } from '../base'; -import { ITagsCache } from '../../services'; +import type { ITagsCache } from '../../services'; import { byNameTagSorter } from '../../utils'; interface SavedObjectTagListProps { diff --git a/x-pack/plugins/saved_objects_tagging/public/components/connected/tag_selector.tsx b/x-pack/plugins/saved_objects_tagging/public/components/connected/tag_selector.tsx index f5d8ea56cf0ac..85d3b2df80c11 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/connected/tag_selector.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/components/connected/tag_selector.tsx @@ -5,13 +5,13 @@ * 2.0. */ -import React, { FC } from 'react'; +import React, { type FC } from 'react'; import useObservable from 'react-use/lib/useObservable'; -import { TagSelectorComponentProps } from '@kbn/saved-objects-tagging-oss-plugin/public'; -import { TagsCapabilities } from '../../../common'; +import type { TagSelectorComponentProps } from '@kbn/saved-objects-tagging-oss-plugin/public'; +import type { TagsCapabilities } from '../../../common'; import { TagSelector } from '../base'; -import { ITagsCache } from '../../services'; -import { CreateModalOpener } from '../edition_modal'; +import type { ITagsCache } from '../../services'; +import type { CreateModalOpener } from '../edition_modal'; interface GetConnectedTagSelectorOptions { cache: ITagsCache; diff --git a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/create_modal.test.tsx b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/create_modal.test.tsx index 35e1043928188..e0d5834bc5266 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/create_modal.test.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/create_modal.test.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import { CreateTagModal } from './create_modal'; -import { IToasts, NotificationsStart } from '@kbn/core-notifications-browser'; -import { ITagsClient, Tag } from '@kbn/saved-objects-tagging-oss-plugin/common'; +import type { IToasts, NotificationsStart } from '@kbn/core-notifications-browser'; +import type { ITagsClient, Tag } from '../../../common/types'; import { I18nProvider } from '@kbn/i18n-react'; import userEvent from '@testing-library/user-event'; import { duplicateTagNameErrorMessage, managedTagConflictMessage } from './utils'; diff --git a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/create_modal.tsx b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/create_modal.tsx index 9f270771b3cc7..22710253cfb2a 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/create_modal.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/create_modal.tsx @@ -5,12 +5,12 @@ * 2.0. */ -import React, { FC, useState, useCallback } from 'react'; +import React, { type FC, useState, useCallback } from 'react'; import { first, lastValueFrom } from 'rxjs'; import { i18n } from '@kbn/i18n'; import type { NotificationsStart } from '@kbn/core/public'; -import { ITagsClient, Tag, TagAttributes } from '../../../common/types'; +import type { ITagsClient, Tag, TagAttributes } from '../../../common/types'; import { isServerValidationError } from '../../services/tags'; import { getRandomColor, validateTag } from './utils'; import { CreateOrEditModal } from './create_or_edit_modal'; diff --git a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/create_or_edit_modal.tsx b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/create_or_edit_modal.tsx index 4c35b35a79343..2f9af6f33707e 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/create_or_edit_modal.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/create_or_edit_modal.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { FC, useState, useCallback, useMemo, useRef } from 'react'; +import React, { type FC, useState, useCallback, useMemo, useRef } from 'react'; import { EuiButtonEmpty, EuiButton, @@ -28,9 +28,9 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import useDebounce from 'react-use/lib/useDebounce'; +import type { TagAttributes } from '../../../common/types'; import { - TagAttributes, - TagValidation, + type TagValidation, validateTagColor, tagNameMaxLength, tagDescriptionMaxLength, diff --git a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/edit_modal.tsx b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/edit_modal.tsx index b8eb6f9a33246..df16cd971ce7c 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/edit_modal.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/edit_modal.tsx @@ -5,11 +5,11 @@ * 2.0. */ -import React, { FC, useState, useCallback } from 'react'; +import React, { type FC, useState, useCallback } from 'react'; import { i18n } from '@kbn/i18n'; import type { NotificationsStart } from '@kbn/core/public'; import { first, lastValueFrom } from 'rxjs'; -import { ITagsClient, Tag, TagAttributes } from '../../../common/types'; +import type { ITagsClient, Tag, TagAttributes } from '../../../common/types'; import { isServerValidationError } from '../../services/tags'; import { CreateOrEditModal } from './create_or_edit_modal'; import { validateTag } from './utils'; diff --git a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/open_modal.tsx b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/open_modal.tsx index 63a784aa09c4d..cb11d2b625a70 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/open_modal.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/open_modal.tsx @@ -9,9 +9,9 @@ import React from 'react'; import { EuiDelayRender, EuiLoadingSpinner } from '@elastic/eui'; import type { OverlayRef } from '@kbn/core/public'; import { toMountPoint } from '@kbn/react-kibana-mount'; -import { Tag, TagAttributes } from '../../../common/types'; -import { ITagInternalClient } from '../../services'; -import { StartServices } from '../../types'; +import type { Tag, TagAttributes } from '../../../common/types'; +import type { ITagInternalClient } from '../../services'; +import type { StartServices } from '../../types'; interface GetModalOpenerOptions extends StartServices { tagClient: ITagInternalClient; diff --git a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/use_validation.ts b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/use_validation.ts index 4c4c1d3ab4dac..7ea44dae656d4 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/use_validation.ts +++ b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/use_validation.ts @@ -9,8 +9,8 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { BehaviorSubject } from 'rxjs'; import useObservable from 'react-use/lib/useObservable'; -import { type TagValidation, validateTagName } from '../../../common'; import type { ITagsClient, TagAttributes } from '../../../common/types'; +import { type TagValidation, validateTagName } from '../../../common'; import { duplicateTagNameErrorMessage, managedTagConflictMessage, validateTag } from './utils'; const initialValidation: TagValidation = { diff --git a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/utils.ts b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/utils.ts index 773e8a40fab21..b58249597ee3c 100644 --- a/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/utils.ts +++ b/x-pack/plugins/saved_objects_tagging/public/components/edition_modal/utils.ts @@ -8,9 +8,9 @@ import { useCallback, useEffect, useRef } from 'react'; import { i18n } from '@kbn/i18n'; +import type { TagAttributes } from '../../../common/types'; import { - TagAttributes, - TagValidation, + type TagValidation, validateTagColor, validateTagName, validateTagDescription, diff --git a/x-pack/plugins/saved_objects_tagging/public/index.ts b/x-pack/plugins/saved_objects_tagging/public/index.ts index aecd9405af01a..e0e401be8d841 100644 --- a/x-pack/plugins/saved_objects_tagging/public/index.ts +++ b/x-pack/plugins/saved_objects_tagging/public/index.ts @@ -9,7 +9,6 @@ import { PluginInitializerContext } from '@kbn/core/public'; import { SavedObjectTaggingPlugin } from './plugin'; export type { SavedObjectTaggingPluginStart } from './types'; -export type { Tag } from '../common'; export const plugin = (initializerContext: PluginInitializerContext) => new SavedObjectTaggingPlugin(initializerContext); diff --git a/x-pack/plugins/saved_objects_tagging/public/management/actions/assign.ts b/x-pack/plugins/saved_objects_tagging/public/management/actions/assign.ts index 7513b9d89c14b..17c740eb68f43 100644 --- a/x-pack/plugins/saved_objects_tagging/public/management/actions/assign.ts +++ b/x-pack/plugins/saved_objects_tagging/public/management/actions/assign.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import { Observable, from, takeUntil } from 'rxjs'; -import { TagWithRelations } from '../../../common'; +import { TagWithRelations } from '../../../common/types'; import { getAssignFlyoutOpener } from '../../components/assign_flyout'; import { ITagAssignmentService } from '../../services/assignments'; import { ITagsCache } from '../../services/tags'; diff --git a/x-pack/plugins/saved_objects_tagging/public/management/actions/delete.ts b/x-pack/plugins/saved_objects_tagging/public/management/actions/delete.ts index 58aa3e71a65cc..48ad835170ffd 100644 --- a/x-pack/plugins/saved_objects_tagging/public/management/actions/delete.ts +++ b/x-pack/plugins/saved_objects_tagging/public/management/actions/delete.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import { NotificationsStart, OverlayStart } from '@kbn/core/public'; -import { TagWithRelations } from '../../../common'; +import { TagWithRelations } from '../../../common/types'; import { ITagInternalClient } from '../../services/tags'; import { TagAction } from './types'; diff --git a/x-pack/plugins/saved_objects_tagging/public/management/actions/edit.ts b/x-pack/plugins/saved_objects_tagging/public/management/actions/edit.ts index 87b1d4ff32fd3..e19157b53ff02 100644 --- a/x-pack/plugins/saved_objects_tagging/public/management/actions/edit.ts +++ b/x-pack/plugins/saved_objects_tagging/public/management/actions/edit.ts @@ -6,7 +6,7 @@ */ import { i18n } from '@kbn/i18n'; -import { TagWithRelations } from '../../../common'; +import { TagWithRelations } from '../../../common/types'; import { getEditModalOpener } from '../../components/edition_modal'; import { ITagInternalClient } from '../../services/tags'; import { StartServices } from '../../types'; diff --git a/x-pack/plugins/saved_objects_tagging/public/management/actions/types.ts b/x-pack/plugins/saved_objects_tagging/public/management/actions/types.ts index 6a4a47181c822..208e118c56c77 100644 --- a/x-pack/plugins/saved_objects_tagging/public/management/actions/types.ts +++ b/x-pack/plugins/saved_objects_tagging/public/management/actions/types.ts @@ -6,7 +6,7 @@ */ import { Action as EuiTableAction } from '@elastic/eui/src/components/basic_table/action_types'; -import { TagWithRelations } from '../../../common'; +import { TagWithRelations } from '../../../common/types'; export type TagAction = EuiTableAction & { id: string; diff --git a/x-pack/plugins/saved_objects_tagging/public/management/components/table.tsx b/x-pack/plugins/saved_objects_tagging/public/management/components/table.tsx index f75d89d4b0ddf..cde4049a3a82b 100644 --- a/x-pack/plugins/saved_objects_tagging/public/management/components/table.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/management/components/table.tsx @@ -10,7 +10,8 @@ import { EuiInMemoryTable, EuiBasicTableColumn, EuiLink, Query, EuiIconTip } fro import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { euiThemeVars } from '@kbn/ui-theme'; -import { TagsCapabilities, TagWithRelations } from '../../../common'; +import { TagsCapabilities } from '../../../common'; +import type { TagWithRelations } from '../../../common/types'; import { TagBadge } from '../../components'; import { TagAction } from '../actions'; diff --git a/x-pack/plugins/saved_objects_tagging/public/management/tag_management_page.tsx b/x-pack/plugins/saved_objects_tagging/public/management/tag_management_page.tsx index 659861a2a0eac..2a84ccdb9a6b5 100644 --- a/x-pack/plugins/saved_objects_tagging/public/management/tag_management_page.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/management/tag_management_page.tsx @@ -12,10 +12,11 @@ import { Query } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { ChromeBreadcrumb, CoreStart } from '@kbn/core/public'; import { EuiSpacer } from '@elastic/eui'; -import { TagWithRelations, TagsCapabilities } from '../../common'; +import { TagsCapabilities } from '../../common'; +import type { TagWithRelations } from '../../common/types'; import { getCreateModalOpener } from '../components/edition_modal'; import { ITagInternalClient, ITagAssignmentService, ITagsCache } from '../services'; -import { TagBulkAction } from './types'; +import type { TagBulkAction } from './types'; import { Header, TagTable, ActionBar } from './components'; import { getTableActions } from './actions'; import { getBulkActions } from './bulk_actions'; diff --git a/x-pack/plugins/saved_objects_tagging/public/management/utils/get_tag_connections_url.test.ts b/x-pack/plugins/saved_objects_tagging/public/management/utils/get_tag_connections_url.test.ts index 35996639332c4..f9457cec01a86 100644 --- a/x-pack/plugins/saved_objects_tagging/public/management/utils/get_tag_connections_url.test.ts +++ b/x-pack/plugins/saved_objects_tagging/public/management/utils/get_tag_connections_url.test.ts @@ -7,7 +7,7 @@ import { httpServiceMock } from '@kbn/core/public/mocks'; import { getTagConnectionsUrl } from './get_tag_connections_url'; -import { TagWithRelations } from '../../../common/types'; +import type { TagWithRelations } from '../../../common/types'; const createTag = (name: string): TagWithRelations => ({ id: 'tag-id', diff --git a/x-pack/plugins/saved_objects_tagging/public/management/utils/get_tag_connections_url.ts b/x-pack/plugins/saved_objects_tagging/public/management/utils/get_tag_connections_url.ts index 0afa8d6781732..8c1da4cfb1d34 100644 --- a/x-pack/plugins/saved_objects_tagging/public/management/utils/get_tag_connections_url.ts +++ b/x-pack/plugins/saved_objects_tagging/public/management/utils/get_tag_connections_url.ts @@ -5,8 +5,8 @@ * 2.0. */ -import { IBasePath } from '@kbn/core/public'; -import { TagWithRelations } from '../../../common/types'; +import type { IBasePath } from '@kbn/core/public'; +import type { TagWithRelations } from '../../../common/types'; /** * Returns the url to use to redirect to the SavedObject management section with given tag diff --git a/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_cache.test.ts b/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_cache.test.ts index 633c7185eac62..3d6217ff8e62e 100644 --- a/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_cache.test.ts +++ b/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_cache.test.ts @@ -6,8 +6,8 @@ */ import moment from 'moment'; -import { Tag, TagAttributes } from '../../../common/types'; -import { TagsCache, CacheRefreshHandler } from './tags_cache'; +import type { Tag, TagAttributes } from '../../../common/types'; +import { TagsCache, type CacheRefreshHandler } from './tags_cache'; const createTag = (parts: Partial): Tag => ({ id: 'tag-id', diff --git a/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_cache.ts b/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_cache.ts index 512c524cdbd27..facb5b263c818 100644 --- a/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_cache.ts +++ b/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_cache.ts @@ -5,11 +5,11 @@ * 2.0. */ -import { Duration } from 'moment'; -import { Observable, BehaviorSubject, Subject } from 'rxjs'; +import type { Duration } from 'moment'; +import { type Observable, BehaviorSubject, Subject } from 'rxjs'; import { takeUntil, first, mergeMap } from 'rxjs'; -import { ITagsCache } from '@kbn/saved-objects-tagging-oss-plugin/public'; -import { Tag, TagAttributes } from '../../../common/types'; +import type { ITagsCache } from '@kbn/saved-objects-tagging-oss-plugin/public'; +import type { Tag, TagAttributes } from '../../../common/types'; export type { ITagsCache }; diff --git a/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_client.test.ts b/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_client.test.ts index 6afafa3c2db21..576d4ce172c02 100644 --- a/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_client.test.ts +++ b/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_client.test.ts @@ -6,10 +6,10 @@ */ import { httpServiceMock } from '@kbn/core/public/mocks'; -import { Tag } from '../../../common/types'; +import type { Tag } from '../../../common/types'; import { createTag, createTagAttributes } from '../../../common/test_utils'; import { tagsCacheMock } from './tags_cache.mock'; -import { TagsClient, FindTagsOptions } from './tags_client'; +import { TagsClient, type FindTagsOptions } from './tags_client'; import { coreMock } from '@kbn/core/public/mocks'; describe('TagsClient', () => { diff --git a/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_client.ts b/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_client.ts index 224c658632523..17a138f051f82 100644 --- a/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_client.ts +++ b/x-pack/plugins/saved_objects_tagging/public/services/tags/tags_client.ts @@ -5,16 +5,16 @@ * 2.0. */ -import { HttpSetup, AnalyticsServiceStart } from '@kbn/core/public'; +import type { HttpSetup, AnalyticsServiceStart } from '@kbn/core/public'; import { reportPerformanceMetricEvent } from '@kbn/ebt-tools'; -import { +import type { Tag, TagAttributes, GetAllTagsOptions, ITagsClient, TagWithRelations, } from '../../../common/types'; -import { ITagsChangeListener } from './tags_cache'; +import type { ITagsChangeListener } from './tags_cache'; const BULK_DELETE_TAG_EVENT = 'bulkDeleteTag'; const CREATE_TAG_EVENT = 'createTag'; diff --git a/x-pack/plugins/saved_objects_tagging/public/ui_api/get_search_bar_filter.test.ts b/x-pack/plugins/saved_objects_tagging/public/ui_api/get_search_bar_filter.test.ts index e5216ea209177..7f200fcd3887d 100644 --- a/x-pack/plugins/saved_objects_tagging/public/ui_api/get_search_bar_filter.test.ts +++ b/x-pack/plugins/saved_objects_tagging/public/ui_api/get_search_bar_filter.test.ts @@ -5,9 +5,9 @@ * 2.0. */ -import { SavedObjectsTaggingApiUi } from '@kbn/saved-objects-tagging-oss-plugin/public'; +import type { SavedObjectsTaggingApiUi } from '@kbn/saved-objects-tagging-oss-plugin/public'; import { tagsCacheMock } from '../services/tags/tags_cache.mock'; -import { Tag } from '../../common/types'; +import type { Tag } from '../../common/types'; import { createTag } from '../../common/test_utils'; import { buildGetSearchBarFilter } from './get_search_bar_filter'; diff --git a/x-pack/plugins/saved_objects_tagging/public/ui_api/get_search_bar_filter.tsx b/x-pack/plugins/saved_objects_tagging/public/ui_api/get_search_bar_filter.tsx index 25e674bbf39d2..a70facdb21b3d 100644 --- a/x-pack/plugins/saved_objects_tagging/public/ui_api/get_search_bar_filter.tsx +++ b/x-pack/plugins/saved_objects_tagging/public/ui_api/get_search_bar_filter.tsx @@ -7,12 +7,12 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { +import type { SavedObjectsTaggingApiUi, GetSearchBarFilterOptions, } from '@kbn/saved-objects-tagging-oss-plugin/public'; -import { Tag } from '../../common'; +import type { Tag } from '../../common/types'; import { TagSearchBarOption } from '../components'; export interface BuildGetSearchBarFilterOptions { diff --git a/x-pack/plugins/saved_objects_tagging/public/utils.ts b/x-pack/plugins/saved_objects_tagging/public/utils.ts index fc8ec8ebd3029..14b47bfd8b815 100644 --- a/x-pack/plugins/saved_objects_tagging/public/utils.ts +++ b/x-pack/plugins/saved_objects_tagging/public/utils.ts @@ -5,9 +5,10 @@ * 2.0. */ -import { SavedObject, SavedObjectReference } from '@kbn/core/types'; -import { SavedObjectsFindOptionsReference } from '@kbn/core/public'; -import { Tag, tagSavedObjectTypeName } from '../common'; +import type { SavedObject, SavedObjectReference } from '@kbn/core/types'; +import type { SavedObjectsFindOptionsReference } from '@kbn/core/public'; +import type { Tag } from '../common/types'; +import { tagSavedObjectTypeName } from '../common'; type SavedObjectReferenceLike = SavedObjectReference | SavedObjectsFindOptionsReference; diff --git a/x-pack/plugins/saved_objects_tagging/server/index.ts b/x-pack/plugins/saved_objects_tagging/server/index.ts index 8c0d4f98b6994..3a33c6073c546 100644 --- a/x-pack/plugins/saved_objects_tagging/server/index.ts +++ b/x-pack/plugins/saved_objects_tagging/server/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { PluginInitializerContext } from '@kbn/core/server'; +import type { PluginInitializerContext } from '@kbn/core/server'; export { config } from './config'; export type { @@ -14,7 +14,6 @@ export type { CreateTagClientOptions, } from './types'; export type { IAssignmentService } from './services'; -export type { ITagsClient } from '../common'; export const plugin = async (initializerContext: PluginInitializerContext) => { const { SavedObjectTaggingPlugin } = await import('./plugin'); diff --git a/x-pack/plugins/saved_objects_tagging/server/request_handler_context.ts b/x-pack/plugins/saved_objects_tagging/server/request_handler_context.ts index 00f0de038851c..92cf2a7189f14 100644 --- a/x-pack/plugins/saved_objects_tagging/server/request_handler_context.ts +++ b/x-pack/plugins/saved_objects_tagging/server/request_handler_context.ts @@ -6,10 +6,10 @@ */ import type { CoreRequestHandlerContext, KibanaRequest } from '@kbn/core/server'; -import { SecurityPluginSetup } from '@kbn/security-plugin/server'; -import { ITagsClient } from '../common/types'; -import { ITagsRequestHandlerContext } from './types'; -import { TagsClient, IAssignmentService, AssignmentService } from './services'; +import type { SecurityPluginSetup } from '@kbn/security-plugin/server'; +import type { ITagsClient } from '../common/types'; +import type { ITagsRequestHandlerContext } from './types'; +import { TagsClient, type IAssignmentService, AssignmentService } from './services'; export class TagsRequestHandlerContext implements ITagsRequestHandlerContext { #client?: ITagsClient; diff --git a/x-pack/plugins/saved_objects_tagging/server/routes/internal/find_tags.ts b/x-pack/plugins/saved_objects_tagging/server/routes/internal/find_tags.ts index 8da060eda0cca..78286b160d218 100644 --- a/x-pack/plugins/saved_objects_tagging/server/routes/internal/find_tags.ts +++ b/x-pack/plugins/saved_objects_tagging/server/routes/internal/find_tags.ts @@ -6,9 +6,9 @@ */ import { schema } from '@kbn/config-schema'; +import type { TagAttributes } from '../../../common/types'; import type { TagsPluginRouter } from '../../types'; import { tagSavedObjectTypeName } from '../../../common/constants'; -import { TagAttributes } from '../../../common/types'; import { savedObjectToTag } from '../../services/tags'; import { addConnectionCount } from '../lib'; diff --git a/x-pack/plugins/saved_objects_tagging/server/routes/lib/get_connection_count.ts b/x-pack/plugins/saved_objects_tagging/server/routes/lib/get_connection_count.ts index e0fe44d65c015..cfbe0f15d2dd7 100644 --- a/x-pack/plugins/saved_objects_tagging/server/routes/lib/get_connection_count.ts +++ b/x-pack/plugins/saved_objects_tagging/server/routes/lib/get_connection_count.ts @@ -5,13 +5,13 @@ * 2.0. */ -import { +import type { SavedObjectsClientContract, SavedObjectsFindOptionsReference, SavedObject, } from '@kbn/core/server'; +import type { Tag, TagAttributes, TagWithRelations } from '../../../common/types'; import { tagSavedObjectTypeName } from '../../../common/constants'; -import { Tag, TagAttributes, TagWithRelations } from '../../../common/types'; export const addConnectionCount = async ( tags: Tag[], diff --git a/x-pack/plugins/saved_objects_tagging/server/saved_objects/tag.ts b/x-pack/plugins/saved_objects_tagging/server/saved_objects/tag.ts index d9e51dddea553..53e75ce6fa34c 100644 --- a/x-pack/plugins/saved_objects_tagging/server/saved_objects/tag.ts +++ b/x-pack/plugins/saved_objects_tagging/server/saved_objects/tag.ts @@ -5,8 +5,9 @@ * 2.0. */ -import { SavedObject, SavedObjectsType } from '@kbn/core/server'; -import { tagSavedObjectTypeName, TagAttributes } from '../../common'; +import type { SavedObject, SavedObjectsType } from '@kbn/core/server'; +import type { TagAttributes } from '../../common/types'; +import { tagSavedObjectTypeName } from '../../common'; export const tagType: SavedObjectsType = { name: tagSavedObjectTypeName, diff --git a/x-pack/plugins/saved_objects_tagging/server/services/tags/tags_client.mock.ts b/x-pack/plugins/saved_objects_tagging/server/services/tags/tags_client.mock.ts index 9507208971d84..5189f828f9606 100644 --- a/x-pack/plugins/saved_objects_tagging/server/services/tags/tags_client.mock.ts +++ b/x-pack/plugins/saved_objects_tagging/server/services/tags/tags_client.mock.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ITagsClient } from '../../../common/types'; +import type { ITagsClient } from '../../../common/types'; const createClientMock = () => { const mock: jest.Mocked = { diff --git a/x-pack/plugins/saved_objects_tagging/server/services/tags/tags_client.test.ts b/x-pack/plugins/saved_objects_tagging/server/services/tags/tags_client.test.ts index f12e147d87270..4666d0db2462d 100644 --- a/x-pack/plugins/saved_objects_tagging/server/services/tags/tags_client.test.ts +++ b/x-pack/plugins/saved_objects_tagging/server/services/tags/tags_client.test.ts @@ -8,8 +8,8 @@ import { validateTagMock } from './tags_client.test.mocks'; import { savedObjectsClientMock } from '@kbn/core/server/mocks'; -import { TagAttributes, TagSavedObject } from '../../../common/types'; -import { TagValidation } from '../../../common/validation'; +import type { TagAttributes, TagSavedObject } from '../../../common/types'; +import type { TagValidation } from '../../../common/validation'; import { TagsClient } from './tags_client'; import { TagValidationError } from './errors'; diff --git a/x-pack/plugins/saved_objects_tagging/server/services/tags/tags_client.ts b/x-pack/plugins/saved_objects_tagging/server/services/tags/tags_client.ts index f213f279975a3..8917eda90ca17 100644 --- a/x-pack/plugins/saved_objects_tagging/server/services/tags/tags_client.ts +++ b/x-pack/plugins/saved_objects_tagging/server/services/tags/tags_client.ts @@ -5,9 +5,14 @@ * 2.0. */ -import { SavedObjectsClientContract } from '@kbn/core/server'; -import { CreateTagOptions, Tag } from '@kbn/saved-objects-tagging-oss-plugin/common/types'; -import { TagSavedObject, TagAttributes, ITagsClient } from '../../../common/types'; +import type { SavedObjectsClientContract } from '@kbn/core/server'; +import type { + CreateTagOptions, + ITagsClient, + Tag, + TagAttributes, + TagSavedObject, +} from '../../../common/types'; import { tagSavedObjectTypeName } from '../../../common/constants'; import { TagValidationError } from './errors'; import { validateTag } from './validate_tag'; diff --git a/x-pack/plugins/saved_objects_tagging/server/services/tags/utils.ts b/x-pack/plugins/saved_objects_tagging/server/services/tags/utils.ts index e6ce04d40c409..203fc9f69c2eb 100644 --- a/x-pack/plugins/saved_objects_tagging/server/services/tags/utils.ts +++ b/x-pack/plugins/saved_objects_tagging/server/services/tags/utils.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { Tag, TagSavedObject } from '../../../common/types'; +import type { Tag, TagSavedObject } from '../../../common/types'; export const savedObjectToTag = (savedObject: TagSavedObject): Tag => { return { diff --git a/x-pack/plugins/saved_objects_tagging/server/services/tags/validate_tag.test.ts b/x-pack/plugins/saved_objects_tagging/server/services/tags/validate_tag.test.ts index d5ede58b6c8c2..857471bc6ce2c 100644 --- a/x-pack/plugins/saved_objects_tagging/server/services/tags/validate_tag.test.ts +++ b/x-pack/plugins/saved_objects_tagging/server/services/tags/validate_tag.test.ts @@ -5,13 +5,13 @@ * 2.0. */ +import type { TagAttributes } from '../../../common/types'; import { validateTagColorMock, validateTagNameMock, validateTagDescriptionMock, } from './validate_tag.test.mocks'; -import { TagAttributes } from '../../../common/types'; import { validateTag } from './validate_tag'; const createAttributes = (parts: Partial = {}): TagAttributes => ({ diff --git a/x-pack/plugins/saved_objects_tagging/server/services/tags/validate_tag.ts b/x-pack/plugins/saved_objects_tagging/server/services/tags/validate_tag.ts index 1bc1bc759868f..f3d72f2098dcc 100644 --- a/x-pack/plugins/saved_objects_tagging/server/services/tags/validate_tag.ts +++ b/x-pack/plugins/saved_objects_tagging/server/services/tags/validate_tag.ts @@ -5,9 +5,9 @@ * 2.0. */ -import { TagAttributes } from '../../../common/types'; +import type { TagAttributes } from '../../../common/types'; import { - TagValidation, + type TagValidation, validateTagColor, validateTagName, validateTagDescription, diff --git a/x-pack/plugins/saved_objects_tagging/server/types.ts b/x-pack/plugins/saved_objects_tagging/server/types.ts index 0bc023214151d..156be38e79a0d 100644 --- a/x-pack/plugins/saved_objects_tagging/server/types.ts +++ b/x-pack/plugins/saved_objects_tagging/server/types.ts @@ -10,8 +10,8 @@ import type { CustomRequestHandlerContext, SavedObjectsClientContract, } from '@kbn/core/server'; -import { ITagsClient } from '../common/types'; -import { IAssignmentService } from './services'; +import type { ITagsClient } from '../common/types'; +import type { IAssignmentService } from './services'; export interface ITagsRequestHandlerContext { tagsClient: ITagsClient; diff --git a/x-pack/plugins/security_solution/public/common/containers/tags/api.ts b/x-pack/plugins/security_solution/public/common/containers/tags/api.ts index 7e0f307c9926d..e0c38aeaecea7 100644 --- a/x-pack/plugins/security_solution/public/common/containers/tags/api.ts +++ b/x-pack/plugins/security_solution/public/common/containers/tags/api.ts @@ -10,7 +10,7 @@ import type { ITagsClient, TagAttributes, Tag as TagResponse, -} from '@kbn/saved-objects-tagging-plugin/common'; +} from '@kbn/saved-objects-tagging-oss-plugin/common'; import { INTERNAL_TAGS_URL } from '../../../../common/constants'; export interface Tag { diff --git a/x-pack/plugins/security_solution/public/dashboards/containers/use_fetch_security_tags.test.ts b/x-pack/plugins/security_solution/public/dashboards/containers/use_fetch_security_tags.test.ts index 3dadc008a9efa..e3da086796794 100644 --- a/x-pack/plugins/security_solution/public/dashboards/containers/use_fetch_security_tags.test.ts +++ b/x-pack/plugins/security_solution/public/dashboards/containers/use_fetch_security_tags.test.ts @@ -15,7 +15,7 @@ import { import { useKibana } from '../../common/lib/kibana'; import { useFetchSecurityTags } from './use_fetch_security_tags'; import { DEFAULT_TAGS_RESPONSE } from '../../common/containers/tags/__mocks__/api'; -import type { ITagsClient } from '@kbn/saved-objects-tagging-plugin/common'; +import type { ITagsClient } from '@kbn/saved-objects-tagging-oss-plugin/common'; import type { SavedObjectsTaggingApi } from '@kbn/saved-objects-tagging-oss-plugin/public'; jest.mock('../../common/lib/kibana'); diff --git a/x-pack/plugins/security_solution/public/dashboards/context/dashboard_context.tsx b/x-pack/plugins/security_solution/public/dashboards/context/dashboard_context.tsx index 54b194a2dcbae..1ab2cf16fe7ce 100644 --- a/x-pack/plugins/security_solution/public/dashboards/context/dashboard_context.tsx +++ b/x-pack/plugins/security_solution/public/dashboards/context/dashboard_context.tsx @@ -7,7 +7,7 @@ import type { FC, PropsWithChildren } from 'react'; import React from 'react'; -import type { Tag } from '@kbn/saved-objects-tagging-plugin/common'; +import type { Tag } from '@kbn/saved-objects-tagging-oss-plugin/common'; import { useFetchSecurityTags } from '../containers/use_fetch_security_tags'; export interface TagReference extends Tag { diff --git a/x-pack/plugins/security_solution/server/lib/tags/saved_objects/create_tag.ts b/x-pack/plugins/security_solution/server/lib/tags/saved_objects/create_tag.ts index fac8e22737f12..774851a8a5265 100644 --- a/x-pack/plugins/security_solution/server/lib/tags/saved_objects/create_tag.ts +++ b/x-pack/plugins/security_solution/server/lib/tags/saved_objects/create_tag.ts @@ -10,7 +10,7 @@ import type { SavedObjectReference, SavedObjectsClientContract, } from '@kbn/core/server'; -import type { TagAttributes } from '@kbn/saved-objects-tagging-plugin/common'; +import type { TagAttributes } from '@kbn/saved-objects-tagging-oss-plugin/common'; import { getRandomColor } from '../../../../common/utils/get_ramdom_color'; interface CreateTagParams { diff --git a/x-pack/plugins/security_solution/server/lib/tags/saved_objects/find_tags_by_name.ts b/x-pack/plugins/security_solution/server/lib/tags/saved_objects/find_tags_by_name.ts index 7bcfb38b4313e..1b314c0c961a5 100644 --- a/x-pack/plugins/security_solution/server/lib/tags/saved_objects/find_tags_by_name.ts +++ b/x-pack/plugins/security_solution/server/lib/tags/saved_objects/find_tags_by_name.ts @@ -6,7 +6,7 @@ */ import type { SavedObjectsClientContract, SavedObjectsFindResult } from '@kbn/core/server'; -import type { TagAttributes } from '@kbn/saved-objects-tagging-plugin/common'; +import type { TagAttributes } from '@kbn/saved-objects-tagging-oss-plugin/common'; export const findTagsByName = async ({ savedObjectsClient, diff --git a/x-pack/plugins/security_solution/server/usage/dashboards/get_dashboards_metrics.ts b/x-pack/plugins/security_solution/server/usage/dashboards/get_dashboards_metrics.ts index df56f7c705435..ce964942723d8 100644 --- a/x-pack/plugins/security_solution/server/usage/dashboards/get_dashboards_metrics.ts +++ b/x-pack/plugins/security_solution/server/usage/dashboards/get_dashboards_metrics.ts @@ -6,7 +6,7 @@ */ import type { SavedObjectsClientContract, Logger, SavedObjectsFindResult } from '@kbn/core/server'; -import type { TagWithOptionalId } from '@kbn/saved-objects-tagging-plugin/common'; +import type { TagWithOptionalId } from '@kbn/saved-objects-tagging-oss-plugin/common'; import { SECURITY_TAG_NAME } from '../../../common/constants'; interface GetDashboardMetricsOptions { diff --git a/x-pack/plugins/security_solution/tsconfig.json b/x-pack/plugins/security_solution/tsconfig.json index 0459b62bb1f6f..2b11529ea4d72 100644 --- a/x-pack/plugins/security_solution/tsconfig.json +++ b/x-pack/plugins/security_solution/tsconfig.json @@ -95,7 +95,6 @@ "@kbn/securitysolution-exceptions-common", "@kbn/rison", "@kbn/shared-ux-page-kibana-template", - "@kbn/saved-objects-tagging-plugin", "@kbn/securitysolution-hook-utils", "@kbn/test-jest-helpers", "@kbn/safer-lodash-set", From 27a98aa9c30b1ad6f1e620dc1be2e644481ab96d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Fri, 25 Oct 2024 11:56:45 +0200 Subject: [PATCH 016/135] [ML] Changes inference processor description (#197645) Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../components/processor_form/processors/inference.tsx | 7 ++++--- .../components/shared/map_processor_type_to_form.tsx | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/inference.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/inference.tsx index 550ed8927985f..a2623ca2aea97 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/inference.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/inference.tsx @@ -56,13 +56,14 @@ const fieldsConfig: FieldsConfig = { model_id: { type: FIELD_TYPES.TEXT, label: i18n.translate('xpack.ingestPipelines.pipelineEditor.inferenceForm.modelIDFieldLabel', { - defaultMessage: 'Model ID', + defaultMessage: 'Deployment, inference, or model ID', }), deserializer: String, helpText: i18n.translate( 'xpack.ingestPipelines.pipelineEditor.inferenceForm.modelIDFieldHelpText', { - defaultMessage: 'ID of the model to infer against.', + defaultMessage: + 'ID of the deployment, the inference endpoint, or the model to infer against.', } ), validations: [ @@ -71,7 +72,7 @@ const fieldsConfig: FieldsConfig = { i18n.translate( 'xpack.ingestPipelines.pipelineEditor.inferenceForm.patternRequiredError', { - defaultMessage: 'A model ID value is required.', + defaultMessage: 'A deployment, an inference, or a model ID value is required.', } ) ), diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx index ea5ace9350a9c..b6d115cc61275 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/shared/map_processor_type_to_form.tsx @@ -572,7 +572,8 @@ export const mapProcessorTypeToDescriptor: MapProcessorTypeToDescriptor = { defaultMessage: 'Inference', }), typeDescription: i18n.translate('xpack.ingestPipelines.processors.description.inference', { - defaultMessage: 'Uses a trained model to infer against incoming data.', + defaultMessage: + 'Uses an inference endpoint or a trained model to infer against incoming data.', }), getDefaultDescription: ({ model_id: modelId, From 3bc5e2db73799dc9c7831b6f9da4a52063cf112f Mon Sep 17 00:00:00 2001 From: Sander Philipse <94373878+sphilipse@users.noreply.github.com> Date: Fri, 25 Oct 2024 12:03:04 +0200 Subject: [PATCH 017/135] [AI Assistant] Add assistant to Serverless Search (#196832) ## Summary This adds the AI assistant to Serverless Elasticsearch. It also disables the knowledge base, and disables a few config values we don't want users to be able to set in that context. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elena Shostak <165678770+elena-shostak@users.noreply.github.com> --- config/serverless.es.yml | 13 +- config/serverless.oblt.yml | 1 + .../test_suites/core_plugins/rendering.ts | 3 + .../src/chat/chat_actions_menu.tsx | 24 +-- .../src/chat/chat_body.stories.tsx | 1 + .../kbn-ai-assistant/src/chat/chat_body.tsx | 2 +- .../kbn-ai-assistant/src/chat/chat_flyout.tsx | 14 +- .../kbn-ai-assistant/src/chat/chat_header.tsx | 49 +++--- .../src/chat/chat_timeline.stories.tsx | 1 + .../chat/knowledge_base_callout.stories.tsx | 12 +- .../src/chat/welcome_message.tsx | 5 +- .../src/conversation/conversation_view.tsx | 8 +- .../__storybook_mocks__/use_knowledge_base.ts | 1 + .../src/hooks/use_knowledge_base.tsx | 1 + .../server/config.ts | 1 + .../server/plugin.ts | 5 +- .../server/routes/knowledge_base/route.ts | 1 + .../server/service/client/index.ts | 18 ++- .../server/service/index.ts | 144 +++++++++-------- .../service/knowledge_base_service/index.ts | 36 ++++- .../public/components/nav_control/index.tsx | 2 +- .../kibana.jsonc | 23 ++- .../public/app.tsx | 11 +- .../public/context/app_context.tsx | 2 + .../public/helpers/test_helper.tsx | 5 + .../public/index.ts | 21 ++- .../public/plugin.ts | 15 +- .../routes/components/settings_page.test.tsx | 23 ++- .../routes/components/settings_page.tsx | 3 + .../settings_tab/settings_tab.test.tsx | 4 + .../components/settings_tab/settings_tab.tsx | 80 ++++----- .../components/settings_tab/ui_settings.tsx | 29 ++-- .../server/config.ts | 22 +++ .../server/index.ts | 2 + .../tsconfig.json | 13 +- x-pack/plugins/search_assistant/kibana.jsonc | 1 - .../search_assistant/public/application.tsx | 34 ---- .../public/components/app.tsx | 15 -- .../public/components/nav_control/index.tsx | 152 ++++++++++++++++++ .../nav_control/lazy_nav_control.tsx | 26 +++ .../conversation_view_with_props.tsx | 36 ----- .../public/components/routes/router.tsx | 32 ---- .../public/{plugin.ts => plugin.tsx} | 65 ++++---- .../plugins/search_assistant/public/types.ts | 8 + x-pack/plugins/search_assistant/tsconfig.json | 13 +- .../search_inference_endpoints/kibana.jsonc | 2 +- .../knowledge_base_status.spec.ts | 1 + .../knowledge_base_status.spec.ts | 1 + .../page_objects/svl_search_homepage.ts | 3 + .../test_suites/search/search_homepage.ts | 4 + 50 files changed, 639 insertions(+), 349 deletions(-) create mode 100644 x-pack/plugins/observability_solution/observability_ai_assistant_management/server/config.ts delete mode 100644 x-pack/plugins/search_assistant/public/application.tsx delete mode 100644 x-pack/plugins/search_assistant/public/components/app.tsx create mode 100644 x-pack/plugins/search_assistant/public/components/nav_control/index.tsx create mode 100644 x-pack/plugins/search_assistant/public/components/nav_control/lazy_nav_control.tsx delete mode 100644 x-pack/plugins/search_assistant/public/components/routes/conversations/conversation_view_with_props.tsx delete mode 100644 x-pack/plugins/search_assistant/public/components/routes/router.tsx rename x-pack/plugins/search_assistant/public/{plugin.ts => plugin.tsx} (51%) diff --git a/config/serverless.es.yml b/config/serverless.es.yml index b3b953e5316ac..eafa7f3113395 100644 --- a/config/serverless.es.yml +++ b/config/serverless.es.yml @@ -10,7 +10,6 @@ xpack.observability.enabled: false xpack.securitySolution.enabled: false xpack.serverless.observability.enabled: false enterpriseSearch.enabled: false -xpack.observabilityAIAssistant.enabled: false xpack.osquery.enabled: false # Enable fleet on search projects for agentless features @@ -120,4 +119,16 @@ xpack.searchInferenceEndpoints.ui.enabled: false xpack.search.notebooks.catalog.url: https://elastic-enterprise-search.s3.us-east-2.amazonaws.com/serverless/catalog.json # Semantic text UI + xpack.index_management.dev.enableSemanticText: true + +# AI Assistant config +xpack.observabilityAIAssistant.enabled: true +xpack.searchAssistant.enabled: true +xpack.searchAssistant.ui.enabled: true +xpack.observabilityAIAssistant.scope: "search" +xpack.observabilityAIAssistant.enableKnowledgeBase: false +aiAssistantManagementSelection.preferredAIAssistantType: "observability" +xpack.observabilityAiAssistantManagement.logSourcesEnabled: false +xpack.observabilityAiAssistantManagement.spacesEnabled: false +xpack.observabilityAiAssistantManagement.visibilityEnabled: false diff --git a/config/serverless.oblt.yml b/config/serverless.oblt.yml index 2155565a63ef2..059094ac87cdd 100644 --- a/config/serverless.oblt.yml +++ b/config/serverless.oblt.yml @@ -183,6 +183,7 @@ xpack.apm.featureFlags.storageExplorerAvailable: false ## Set the AI Assistant type aiAssistantManagementSelection.preferredAIAssistantType: "observability" +xpack.observabilityAIAssistant.scope: "observability" # Specify in telemetry the project type telemetry.labels.serverless: observability diff --git a/test/plugin_functional/test_suites/core_plugins/rendering.ts b/test/plugin_functional/test_suites/core_plugins/rendering.ts index 6a863a78cff15..83ef8629a6efc 100644 --- a/test/plugin_functional/test_suites/core_plugins/rendering.ts +++ b/test/plugin_functional/test_suites/core_plugins/rendering.ts @@ -362,6 +362,9 @@ export default function ({ getService }: PluginFunctionalProviderContext) { 'xpack.observability_onboarding.ui.enabled (boolean?)', 'xpack.observabilityLogsExplorer.navigation.showAppLink (boolean?|never)', 'xpack.observabilityAIAssistant.scope (observability?|search?)', + 'xpack.observabilityAiAssistantManagement.logSourcesEnabled (boolean?)', + 'xpack.observabilityAiAssistantManagement.spacesEnabled (boolean?)', + 'xpack.observabilityAiAssistantManagement.visibilityEnabled (boolean?)', 'share.new_version.enabled (boolean?)', 'aiAssistantManagementSelection.preferredAIAssistantType (default?|never?|observability?)', /** diff --git a/x-pack/packages/kbn-ai-assistant/src/chat/chat_actions_menu.tsx b/x-pack/packages/kbn-ai-assistant/src/chat/chat_actions_menu.tsx index ac25fe6c3703a..4a19272e8938b 100644 --- a/x-pack/packages/kbn-ai-assistant/src/chat/chat_actions_menu.tsx +++ b/x-pack/packages/kbn-ai-assistant/src/chat/chat_actions_menu.tsx @@ -18,6 +18,7 @@ import { import { ConnectorSelectorBase } from '@kbn/observability-ai-assistant-plugin/public'; import type { UseGenAIConnectorsResult } from '../hooks/use_genai_connectors'; import { useKibana } from '../hooks/use_kibana'; +import { useKnowledgeBase } from '../hooks'; export function ChatActionsMenu({ connectors, @@ -31,6 +32,7 @@ export function ChatActionsMenu({ onCopyConversationClick: () => void; }) { const { application, http } = useKibana().services; + const knowledgeBase = useKnowledgeBase(); const [isOpen, setIsOpen] = useState(false); const handleNavigateToConnectors = () => { @@ -91,15 +93,19 @@ export function ChatActionsMenu({ defaultMessage: 'Actions', }), items: [ - { - name: i18n.translate('xpack.aiAssistant.chatHeader.actions.knowledgeBase', { - defaultMessage: 'Manage knowledge base', - }), - onClick: () => { - toggleActionsMenu(); - handleNavigateToSettingsKnowledgeBase(); - }, - }, + ...(knowledgeBase?.status.value?.enabled + ? [ + { + name: i18n.translate('xpack.aiAssistant.chatHeader.actions.knowledgeBase', { + defaultMessage: 'Manage knowledge base', + }), + onClick: () => { + toggleActionsMenu(); + handleNavigateToSettingsKnowledgeBase(); + }, + }, + ] + : []), { name: i18n.translate('xpack.aiAssistant.chatHeader.actions.settings', { defaultMessage: 'AI Assistant Settings', diff --git a/x-pack/packages/kbn-ai-assistant/src/chat/chat_body.stories.tsx b/x-pack/packages/kbn-ai-assistant/src/chat/chat_body.stories.tsx index 182cb046cba70..3809e97f059b6 100644 --- a/x-pack/packages/kbn-ai-assistant/src/chat/chat_body.stories.tsx +++ b/x-pack/packages/kbn-ai-assistant/src/chat/chat_body.stories.tsx @@ -37,6 +37,7 @@ const defaultProps: ComponentStoryObj = { loading: false, value: { ready: true, + enabled: true, }, refresh: () => {}, }, diff --git a/x-pack/packages/kbn-ai-assistant/src/chat/chat_body.tsx b/x-pack/packages/kbn-ai-assistant/src/chat/chat_body.tsx index 5b80a34e0bf7b..12cb747d148c4 100644 --- a/x-pack/packages/kbn-ai-assistant/src/chat/chat_body.tsx +++ b/x-pack/packages/kbn-ai-assistant/src/chat/chat_body.tsx @@ -123,7 +123,7 @@ export function ChatBody({ showLinkToConversationsApp: boolean; onConversationUpdate: (conversation: { conversation: Conversation['conversation'] }) => void; onToggleFlyoutPositionMode?: (flyoutPositionMode: FlyoutPositionMode) => void; - navigateToConversation: (conversationId?: string) => void; + navigateToConversation?: (conversationId?: string) => void; }) { const license = useLicense(); const hasCorrectLicense = license?.hasAtLeast('enterprise'); diff --git a/x-pack/packages/kbn-ai-assistant/src/chat/chat_flyout.tsx b/x-pack/packages/kbn-ai-assistant/src/chat/chat_flyout.tsx index 8d636374ac768..1343f5ed9a4bb 100644 --- a/x-pack/packages/kbn-ai-assistant/src/chat/chat_flyout.tsx +++ b/x-pack/packages/kbn-ai-assistant/src/chat/chat_flyout.tsx @@ -53,7 +53,7 @@ export function ChatFlyout({ initialFlyoutPositionMode?: FlyoutPositionMode; isOpen: boolean; onClose: () => void; - navigateToConversation(conversationId?: string): void; + navigateToConversation?: (conversationId?: string) => void; }) { const { euiTheme } = useEuiTheme(); const breakpoint = useCurrentEuiBreakpoint(); @@ -272,10 +272,14 @@ export function ChatFlyout({ conversationList.conversations.refresh(); }} onToggleFlyoutPositionMode={handleToggleFlyoutPositionMode} - navigateToConversation={(newConversationId?: string) => { - if (onClose) onClose(); - navigateToConversation(newConversationId); - }} + navigateToConversation={ + navigateToConversation + ? (newConversationId?: string) => { + if (onClose) onClose(); + navigateToConversation(newConversationId); + } + : undefined + } /> diff --git a/x-pack/packages/kbn-ai-assistant/src/chat/chat_header.tsx b/x-pack/packages/kbn-ai-assistant/src/chat/chat_header.tsx index c9f0588a1c90f..5110eec04c6e6 100644 --- a/x-pack/packages/kbn-ai-assistant/src/chat/chat_header.tsx +++ b/x-pack/packages/kbn-ai-assistant/src/chat/chat_header.tsx @@ -60,7 +60,7 @@ export function ChatHeader({ onCopyConversation: () => void; onSaveTitle: (title: string) => void; onToggleFlyoutPositionMode?: (newFlyoutPositionMode: FlyoutPositionMode) => void; - navigateToConversation: (nextConversationId?: string) => void; + navigateToConversation?: (nextConversationId?: string) => void; }) { const theme = useEuiTheme(); const breakpoint = useCurrentEuiBreakpoint(); @@ -164,31 +164,32 @@ export function ChatHeader({ } /> - - - - + navigateToConversation(conversationId)} - /> - - } - /> - + display="block" + > + navigateToConversation(conversationId)} + /> + + } + /> + + ) : null} ) : null} diff --git a/x-pack/packages/kbn-ai-assistant/src/chat/chat_timeline.stories.tsx b/x-pack/packages/kbn-ai-assistant/src/chat/chat_timeline.stories.tsx index 0afb0c7e79fc0..7c04c3ad0bae7 100644 --- a/x-pack/packages/kbn-ai-assistant/src/chat/chat_timeline.stories.tsx +++ b/x-pack/packages/kbn-ai-assistant/src/chat/chat_timeline.stories.tsx @@ -58,6 +58,7 @@ const defaultProps: ComponentProps = { loading: false, value: { ready: true, + enabled: true, }, refresh: () => {}, }, diff --git a/x-pack/packages/kbn-ai-assistant/src/chat/knowledge_base_callout.stories.tsx b/x-pack/packages/kbn-ai-assistant/src/chat/knowledge_base_callout.stories.tsx index e87aa161d80c3..84c730129348e 100644 --- a/x-pack/packages/kbn-ai-assistant/src/chat/knowledge_base_callout.stories.tsx +++ b/x-pack/packages/kbn-ai-assistant/src/chat/knowledge_base_callout.stories.tsx @@ -24,6 +24,7 @@ const defaultProps: ComponentStoryObj = { loading: false, value: { ready: false, + enabled: true, }, refresh: () => {}, }, @@ -43,12 +44,15 @@ export const Loading: ComponentStoryObj = merge({}, defaultPro }); export const NotInstalled: ComponentStoryObj = merge({}, defaultProps, { - args: { knowledgeBase: { status: { loading: false, value: { ready: false } } } }, + args: { knowledgeBase: { status: { loading: false, value: { ready: false, enabled: true } } } }, }); export const Installing: ComponentStoryObj = merge({}, defaultProps, { args: { - knowledgeBase: { status: { loading: false, value: { ready: false } }, isInstalling: true }, + knowledgeBase: { + status: { loading: false, value: { ready: false, enabled: true } }, + isInstalling: true, + }, }, }); @@ -57,7 +61,7 @@ export const InstallError: ComponentStoryObj = merge({}, defau knowledgeBase: { status: { loading: false, - value: { ready: false }, + value: { ready: false, enabled: true }, }, isInstalling: false, installError: new Error(), @@ -66,5 +70,5 @@ export const InstallError: ComponentStoryObj = merge({}, defau }); export const Installed: ComponentStoryObj = merge({}, defaultProps, { - args: { knowledgeBase: { status: { loading: false, value: { ready: true } } } }, + args: { knowledgeBase: { status: { loading: false, value: { ready: true, enabled: true } } } }, }); diff --git a/x-pack/packages/kbn-ai-assistant/src/chat/welcome_message.tsx b/x-pack/packages/kbn-ai-assistant/src/chat/welcome_message.tsx index a449235ba44e6..2ce11d16905af 100644 --- a/x-pack/packages/kbn-ai-assistant/src/chat/welcome_message.tsx +++ b/x-pack/packages/kbn-ai-assistant/src/chat/welcome_message.tsx @@ -85,8 +85,9 @@ export function WelcomeMessage({ connectors={connectors} onSetupConnectorClick={handleConnectorClick} /> - - + {knowledgeBase.status.value?.enabled ? ( + + ) : null} diff --git a/x-pack/packages/kbn-ai-assistant/src/conversation/conversation_view.tsx b/x-pack/packages/kbn-ai-assistant/src/conversation/conversation_view.tsx index fe71a9585dd1e..fb74ff7647a21 100644 --- a/x-pack/packages/kbn-ai-assistant/src/conversation/conversation_view.tsx +++ b/x-pack/packages/kbn-ai-assistant/src/conversation/conversation_view.tsx @@ -25,7 +25,7 @@ const SECOND_SLOT_CONTAINER_WIDTH = 400; interface ConversationViewProps { conversationId?: string; - navigateToConversation: (nextConversationId?: string) => void; + navigateToConversation?: (nextConversationId?: string) => void; getConversationHref?: (conversationId: string) => string; newConversationHref?: string; scopes?: AssistantScope[]; @@ -81,7 +81,9 @@ export const ConversationView: React.FC = ({ const handleConversationUpdate = (conversation: { conversation: { id: string } }) => { if (!conversationId) { updateConversationIdInPlace(conversation.conversation.id); - navigateToConversation(conversation.conversation.id); + if (navigateToConversation) { + navigateToConversation(conversation.conversation.id); + } } handleRefreshConversations(); }; @@ -143,7 +145,7 @@ export const ConversationView: React.FC = ({ isLoading={conversationList.isLoading} onConversationDeleteClick={(deletedConversationId) => { conversationList.deleteConversation(deletedConversationId).then(() => { - if (deletedConversationId === conversationId) { + if (deletedConversationId === conversationId && navigateToConversation) { navigateToConversation(undefined); } }); diff --git a/x-pack/packages/kbn-ai-assistant/src/hooks/__storybook_mocks__/use_knowledge_base.ts b/x-pack/packages/kbn-ai-assistant/src/hooks/__storybook_mocks__/use_knowledge_base.ts index bcb1725d35109..8859cc716cc52 100644 --- a/x-pack/packages/kbn-ai-assistant/src/hooks/__storybook_mocks__/use_knowledge_base.ts +++ b/x-pack/packages/kbn-ai-assistant/src/hooks/__storybook_mocks__/use_knowledge_base.ts @@ -17,6 +17,7 @@ export function useKnowledgeBase(): UseKnowledgeBaseResult { error: undefined, value: { ready: true, + enabled: true, }, }, }; diff --git a/x-pack/packages/kbn-ai-assistant/src/hooks/use_knowledge_base.tsx b/x-pack/packages/kbn-ai-assistant/src/hooks/use_knowledge_base.tsx index 0b949fcdbff0e..72d4fa0acf737 100644 --- a/x-pack/packages/kbn-ai-assistant/src/hooks/use_knowledge_base.tsx +++ b/x-pack/packages/kbn-ai-assistant/src/hooks/use_knowledge_base.tsx @@ -20,6 +20,7 @@ import { useAIAssistantAppService } from './use_ai_assistant_app_service'; export interface UseKnowledgeBaseResult { status: AbortableAsyncState<{ ready: boolean; + enabled: boolean; error?: any; deployment_state?: MlDeploymentState; allocation_state?: MlDeploymentAllocationState; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/config.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/config.ts index dc9a780c82a1f..4d0b9fef3f2f4 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/config.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/config.ts @@ -11,6 +11,7 @@ export const config = schema.object({ enabled: schema.boolean({ defaultValue: true }), modelId: schema.maybe(schema.string()), scope: schema.maybe(schema.oneOf([schema.literal('observability'), schema.literal('search')])), + enableKnowledgeBase: schema.boolean({ defaultValue: true }), }); export type ObservabilityAIAssistantConfig = TypeOf; 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 50687920478af..81f4e24d4d21f 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 @@ -159,11 +159,14 @@ export class ObservabilityAIAssistantPlugin core, taskManager: plugins.taskManager, getModelId, + enableKnowledgeBase: this.config.enableKnowledgeBase, })); service.register(registerFunctions); - addLensDocsToKb({ service, logger: this.logger.get('kb').get('lens') }); + if (this.config.enableKnowledgeBase) { + addLensDocsToKb({ service, logger: this.logger.get('kb').get('lens') }); + } registerServerRoutes({ core, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/knowledge_base/route.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/knowledge_base/route.ts index 6bb024b913cde..1eb1650545781 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/knowledge_base/route.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/knowledge_base/route.ts @@ -28,6 +28,7 @@ const getKnowledgeBaseStatus = createObservabilityAIAssistantServerRoute({ handler: async ( resources ): Promise<{ + enabled: boolean; ready: boolean; error?: any; deployment_state?: MlDeploymentState; 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 19a3dd827107b..a050edc8008fb 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 @@ -707,14 +707,16 @@ export class ObservabilityAIAssistantClient { queries: Array<{ text: string; boost?: number }>; categories?: string[]; }): Promise<{ entries: RecalledEntry[] }> => { - return this.dependencies.knowledgeBaseService.recall({ - namespace: this.dependencies.namespace, - user: this.dependencies.user, - queries, - categories, - esClient: this.dependencies.esClient, - uiSettingsClient: this.dependencies.uiSettingsClient, - }); + return ( + this.dependencies.knowledgeBaseService?.recall({ + namespace: this.dependencies.namespace, + user: this.dependencies.user, + queries, + categories, + esClient: this.dependencies.esClient, + uiSettingsClient: this.dependencies.uiSettingsClient, + }) || { entries: [] } + ); }; getKnowledgeBaseStatus = () => { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/index.ts index 63e2ee240927c..d1aba4f232b0d 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/index.ts @@ -70,6 +70,7 @@ export class ObservabilityAIAssistantService { private readonly logger: Logger; private readonly getModelId: () => Promise; private kbService?: KnowledgeBaseService; + private enableKnowledgeBase: boolean; private readonly registrations: RegistrationCallback[] = []; @@ -78,36 +79,40 @@ export class ObservabilityAIAssistantService { core, taskManager, getModelId, + enableKnowledgeBase, }: { logger: Logger; core: CoreSetup; taskManager: TaskManagerSetupContract; getModelId: () => Promise; + enableKnowledgeBase: boolean; }) { this.core = core; this.logger = logger; this.getModelId = getModelId; + this.enableKnowledgeBase = enableKnowledgeBase; this.allowInit(); - - taskManager.registerTaskDefinitions({ - [INDEX_QUEUED_DOCUMENTS_TASK_TYPE]: { - title: 'Index queued KB articles', - description: - 'Indexes previously registered entries into the knowledge base when it is ready', - timeout: '30m', - maxAttempts: 2, - createTaskRunner: (context) => { - return { - run: async () => { - if (this.kbService) { - await this.kbService.processQueue(); - } - }, - }; + if (enableKnowledgeBase) { + taskManager.registerTaskDefinitions({ + [INDEX_QUEUED_DOCUMENTS_TASK_TYPE]: { + title: 'Index queued KB articles', + description: + 'Indexes previously registered entries into the knowledge base when it is ready', + timeout: '30m', + maxAttempts: 2, + createTaskRunner: (context) => { + return { + run: async () => { + if (this.kbService) { + await this.kbService.processQueue(); + } + }, + }; + }, }, - }, - }); + }); + } } getKnowledgeBaseStatus() { @@ -237,6 +242,7 @@ export class ObservabilityAIAssistantService { esClient, taskManagerStart: pluginsStart.taskManager, getModelId: this.getModelId, + enabled: this.enableKnowledgeBase, }); this.logger.info('Successfully set up index assets'); @@ -331,58 +337,62 @@ export class ObservabilityAIAssistantService { } addToKnowledgeBaseQueue(entries: KnowledgeBaseEntryRequest[]): void { - this.init() - .then(() => { - this.kbService!.queue( - entries.flatMap((entry) => { - const entryWithSystemProperties = { - ...entry, - '@timestamp': new Date().toISOString(), - doc_id: entry.id, - public: true, - confidence: 'high' as const, - type: 'contextual' as const, - is_correction: false, - labels: { - ...entry.labels, - }, - role: KnowledgeBaseEntryRole.Elastic, - }; - - const operations = - 'texts' in entryWithSystemProperties - ? splitKbText(entryWithSystemProperties) - : [ - { - type: KnowledgeBaseEntryOperationType.Index, - document: entryWithSystemProperties, - }, - ]; - - return operations; - }) - ); - }) - .catch((error) => { - this.logger.error( - `Could not index ${entries.length} entries because of an initialisation error` - ); - this.logger.error(error); - }); + if (this.enableKnowledgeBase) { + this.init() + .then(() => { + this.kbService!.queue( + entries.flatMap((entry) => { + const entryWithSystemProperties = { + ...entry, + '@timestamp': new Date().toISOString(), + doc_id: entry.id, + public: true, + confidence: 'high' as const, + type: 'contextual' as const, + is_correction: false, + labels: { + ...entry.labels, + }, + role: KnowledgeBaseEntryRole.Elastic, + }; + + const operations = + 'texts' in entryWithSystemProperties + ? splitKbText(entryWithSystemProperties) + : [ + { + type: KnowledgeBaseEntryOperationType.Index, + document: entryWithSystemProperties, + }, + ]; + + return operations; + }) + ); + }) + .catch((error) => { + this.logger.error( + `Could not index ${entries.length} entries because of an initialisation error` + ); + this.logger.error(error); + }); + } } addCategoryToKnowledgeBase(categoryId: string, entries: KnowledgeBaseEntryRequest[]) { - this.addToKnowledgeBaseQueue( - entries.map((entry) => { - return { - ...entry, - labels: { - ...entry.labels, - category: categoryId, - }, - }; - }) - ); + if (this.enableKnowledgeBase) { + this.addToKnowledgeBaseQueue( + entries.map((entry) => { + return { + ...entry, + labels: { + ...entry.labels, + category: categoryId, + }, + }; + }) + ); + } } register(cb: RegistrationCallback) { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts index ee977b30f5cc7..7306a0df7c572 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts @@ -34,6 +34,7 @@ interface Dependencies { logger: Logger; taskManagerStart: TaskManagerStartContract; getModelId: () => Promise; + enabled: boolean; } export interface RecalledEntry { @@ -92,6 +93,9 @@ export class KnowledgeBaseService { } setup = async () => { + if (!this.dependencies.enabled) { + return; + } const elserModelId = await this.dependencies.getModelId(); const retryOptions = { factor: 1, minTimeout: 10000, retries: 12 }; @@ -113,9 +117,9 @@ export class KnowledgeBaseService { } catch (error) { if (isModelMissingOrUnavailableError(error)) { return false; - } else { - throw error; } + + throw error; } }; @@ -202,6 +206,9 @@ export class KnowledgeBaseService { }; private ensureTaskScheduled() { + if (!this.dependencies.enabled) { + return; + } this.dependencies.taskManagerStart .ensureScheduled({ taskType: INDEX_QUEUED_DOCUMENTS_TASK_TYPE, @@ -251,7 +258,7 @@ export class KnowledgeBaseService { } async processQueue() { - if (!this._queue.length) { + if (!this._queue.length || !this.dependencies.enabled) { return; } @@ -305,6 +312,9 @@ export class KnowledgeBaseService { } status = async () => { + if (!this.dependencies.enabled) { + return { ready: false, enabled: false }; + } const elserModelId = await this.dependencies.getModelId(); try { @@ -320,11 +330,13 @@ export class KnowledgeBaseService { deployment_state: deploymentState, allocation_state: allocationState, model_name: elserModelId, + enabled: true, }; } catch (error) { return { error: error instanceof errors.ResponseError ? error.body.error : String(error), ready: false, + enabled: true, model_name: elserModelId, }; } @@ -402,6 +414,9 @@ export class KnowledgeBaseService { }): Promise<{ entries: RecalledEntry[]; }> => { + if (!this.dependencies.enabled) { + return { entries: [] }; + } this.dependencies.logger.debug( () => `Recalling entries from KB for queries: "${JSON.stringify(queries)}"` ); @@ -474,6 +489,9 @@ export class KnowledgeBaseService { namespace: string, user?: { name: string } ): Promise> => { + if (!this.dependencies.enabled) { + return []; + } try { const response = await this.dependencies.esClient.asInternalUser.search({ index: resourceNames.aliases.kb, @@ -514,6 +532,9 @@ export class KnowledgeBaseService { sortBy?: string; sortDirection?: 'asc' | 'desc'; }): Promise<{ entries: KnowledgeBaseEntry[] }> => { + if (!this.dependencies.enabled) { + return { entries: [] }; + } try { const response = await this.dependencies.esClient.asInternalUser.search({ index: resourceNames.aliases.kb, @@ -578,6 +599,9 @@ export class KnowledgeBaseService { user?: { name: string; id?: string }; namespace?: string; }) => { + if (!this.dependencies.enabled) { + return null; + } const res = await this.dependencies.esClient.asInternalUser.search< Pick >({ @@ -607,6 +631,9 @@ export class KnowledgeBaseService { user?: { name: string; id?: string }; namespace?: string; }): Promise => { + if (!this.dependencies.enabled) { + return; + } // for now we want to limit the number of user instructions to 1 per user if (document.type === KnowledgeBaseType.UserInstruction) { const existingId = await this.getExistingUserInstructionId({ @@ -647,6 +674,9 @@ export class KnowledgeBaseService { }: { operations: KnowledgeBaseEntryOperation[]; }): Promise => { + if (!this.dependencies.enabled) { + return; + } this.dependencies.logger.info(`Starting import of ${operations.length} entries`); const limiter = pLimit(5); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/nav_control/index.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/nav_control/index.tsx index 01202b385917a..883317c02274f 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/nav_control/index.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/nav_control/index.tsx @@ -164,7 +164,7 @@ export function NavControl() { onClose={() => { setIsOpen(false); }} - navigateToConversation={(conversationId: string) => { + navigateToConversation={(conversationId?: string) => { application.navigateToUrl( http.basePath.prepend( `/app/observabilityAIAssistant/conversations/${conversationId || ''}` diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/kibana.jsonc b/x-pack/plugins/observability_solution/observability_ai_assistant_management/kibana.jsonc index ddf00c84c0ac3..f42dc2d2074d8 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/kibana.jsonc @@ -6,9 +6,24 @@ "id": "observabilityAiAssistantManagement", "server": true, "browser": true, - "configPath": ["xpack", "observabilityAiAssistantManagement"], - "requiredPlugins": ["management", "observabilityAIAssistant", "observabilityShared"], - "optionalPlugins": ["actions", "home", "serverless", "enterpriseSearch"], - "requiredBundles": ["kibanaReact", "logsDataAccess"] + "configPath": [ + "xpack", + "observabilityAiAssistantManagement" + ], + "requiredPlugins": [ + "actions", + "management", + "observabilityAIAssistant", + "observabilityShared" + ], + "optionalPlugins": [ + "home", + "serverless", + "enterpriseSearch" + ], + "requiredBundles": [ + "kibanaReact", + "logsDataAccess", + ] } } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/app.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/app.tsx index 4522e00fb37d2..9ab40cc467853 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/app.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/app.tsx @@ -15,7 +15,11 @@ import { i18n } from '@kbn/i18n'; import { CoreSetup } from '@kbn/core/public'; import { wrapWithTheme } from '@kbn/kibana-react-plugin/public'; import { ManagementAppMountParams } from '@kbn/management-plugin/public'; -import { StartDependencies, AiAssistantManagementObservabilityPluginStart } from './plugin'; +import { + StartDependencies, + AiAssistantManagementObservabilityPluginStart, + ConfigSchema, +} from './plugin'; import { aIAssistantManagementObservabilityRouter } from './routes/config'; import { RedirectToHomeIfUnauthorized } from './routes/components/redirect_to_home_if_unauthorized'; import { AppContextProvider } from './context/app_context'; @@ -23,9 +27,10 @@ import { AppContextProvider } from './context/app_context'; interface MountParams { core: CoreSetup; mountParams: ManagementAppMountParams; + config: ConfigSchema; } -export const mountManagementSection = async ({ core, mountParams }: MountParams) => { +export const mountManagementSection = async ({ core, mountParams, config }: MountParams) => { const [coreStart, startDeps] = await core.getStartServices(); if (!startDeps.observabilityAIAssistant) return () => {}; @@ -46,7 +51,7 @@ export const mountManagementSection = async ({ core, mountParams }: MountParams) - + void; + config: ConfigSchema; } export const AppContext = createContext(null as any); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/helpers/test_helper.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/helpers/test_helper.tsx index d3941b3cd50d8..a12fb8e12d90f 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/helpers/test_helper.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/helpers/test_helper.tsx @@ -70,6 +70,11 @@ export const render = ( const appContextValue = mocks?.appContextValue ?? { setBreadcrumbs: () => {}, + config: { + logSourcesEnabled: true, + spacesEnabled: true, + visibilityEnabled: true, + }, }; return testLibRender( diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/index.ts index 56d5051243f69..f61a188f37c62 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/index.ts @@ -5,13 +5,26 @@ * 2.0. */ -import { AiAssistantManagementObservabilityPlugin as AiAssistantManagementObservabilityPlugin } from './plugin'; +import { PluginInitializer, PluginInitializerContext } from '@kbn/core-plugins-browser'; +import { + AiAssistantManagementObservabilityPlugin, + AiAssistantManagementObservabilityPluginSetup, + AiAssistantManagementObservabilityPluginStart, + ConfigSchema, + SetupDependencies, + StartDependencies, +} from './plugin'; export type { AiAssistantManagementObservabilityPluginSetup, AiAssistantManagementObservabilityPluginStart, } from './plugin'; -export function plugin() { - return new AiAssistantManagementObservabilityPlugin(); -} +export const plugin: PluginInitializer< + AiAssistantManagementObservabilityPluginSetup, + AiAssistantManagementObservabilityPluginStart, + SetupDependencies, + StartDependencies +> = (pluginInitializerContext: PluginInitializerContext) => { + return new AiAssistantManagementObservabilityPlugin(pluginInitializerContext); +}; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/plugin.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/plugin.ts index e2e69ef5600cf..88d007045052e 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/plugin.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/plugin.ts @@ -6,7 +6,7 @@ */ import { i18n } from '@kbn/i18n'; -import { CoreSetup, Plugin } from '@kbn/core/public'; +import { CoreSetup, Plugin, PluginInitializerContext } from '@kbn/core/public'; import { ManagementSetup } from '@kbn/management-plugin/public'; import { HomePublicPluginSetup } from '@kbn/home-plugin/public'; import { ServerlessPluginStart } from '@kbn/serverless/public'; @@ -35,6 +35,12 @@ export interface StartDependencies { enterpriseSearch?: EnterpriseSearchPublicStart; } +export interface ConfigSchema { + logSourcesEnabled: boolean; + spacesEnabled: boolean; + visibilityEnabled: boolean; +} + export class AiAssistantManagementObservabilityPlugin implements Plugin< @@ -44,6 +50,12 @@ export class AiAssistantManagementObservabilityPlugin StartDependencies > { + private readonly config: ConfigSchema; + + constructor(context: PluginInitializerContext) { + this.config = context.config.get(); + } + public setup( core: CoreSetup, { home, management, observabilityAIAssistant }: SetupDependencies @@ -78,6 +90,7 @@ export class AiAssistantManagementObservabilityPlugin return mountManagementSection({ core, mountParams, + config: this.config, }); }, }); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_page.test.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_page.test.tsx index 9a543be1938ea..c4051b9665b57 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_page.test.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_page.test.tsx @@ -8,8 +8,24 @@ import React from 'react'; import { coreStartMock, render } from '../../helpers/test_helper'; import { SettingsPage } from './settings_page'; +import { useKnowledgeBase } from '@kbn/ai-assistant'; + +jest.mock('@kbn/ai-assistant'); + +const useKnowledgeBaseMock = useKnowledgeBase as jest.Mock; describe('Settings Page', () => { + const appContextValue = { + config: { spacesEnabled: true, visibilityEnabled: true, logSourcesEnabled: true }, + setBreadcrumbs: () => {}, + }; + useKnowledgeBaseMock.mockReturnValue({ + status: { + value: { + enabled: true, + }, + }, + }); it('should navigate to home when not authorized', () => { render(, { coreStart: { @@ -21,13 +37,16 @@ describe('Settings Page', () => { }, }, }, + appContextValue, }); expect(coreStartMock.application.navigateToApp).toBeCalledWith('home'); }); it('should render settings and knowledge base tabs', () => { - const { getByTestId } = render(); + const { getByTestId } = render(, { + appContextValue, + }); expect(getByTestId('settingsPageTab-settings')).toBeInTheDocument(); expect(getByTestId('settingsPageTab-knowledge_base')).toBeInTheDocument(); @@ -36,7 +55,7 @@ describe('Settings Page', () => { it('should set breadcrumbs', () => { const setBreadcrumbs = jest.fn(); render(, { - appContextValue: { setBreadcrumbs }, + appContextValue: { ...appContextValue, setBreadcrumbs }, }); expect(setBreadcrumbs).toHaveBeenCalledWith([ diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_page.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_page.tsx index 075aaeb0aeb75..57a167b1080fa 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_page.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_page.tsx @@ -8,6 +8,7 @@ import React, { useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiSpacer, EuiTab, EuiTabs, EuiTitle } from '@elastic/eui'; +import { useKnowledgeBase } from '@kbn/ai-assistant'; import { useAppContext } from '../../hooks/use_app_context'; import { SettingsTab } from './settings_tab/settings_tab'; import { KnowledgeBaseTab } from './knowledge_base_tab'; @@ -28,6 +29,7 @@ export function SettingsPage() { } = useKibana(); const router = useObservabilityAIAssistantManagementRouter(); + const knowledgeBase = useKnowledgeBase(); const { query: { tab }, @@ -85,6 +87,7 @@ export function SettingsPage() { } ), content: , + disabled: !knowledgeBase.status.value?.enabled, }, { id: 'search_connector', diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.test.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.test.tsx index 2bed5aed37160..02ee9ba06b1ee 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.test.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.test.tsx @@ -9,10 +9,14 @@ import React from 'react'; import { fireEvent } from '@testing-library/react'; import { render } from '../../../helpers/test_helper'; import { SettingsTab } from './settings_tab'; +import { useAppContext } from '../../../hooks/use_app_context'; jest.mock('../../../hooks/use_app_context'); +const useAppContextMock = useAppContext as jest.Mock; + describe('SettingsTab', () => { + useAppContextMock.mockReturnValue({ config: { spacesEnabled: true, visibilityEnabled: true } }); it('should offer a way to configure Observability AI Assistant visibility in apps', () => { const navigateToAppMock = jest.fn(() => Promise.resolve()); const { getByTestId } = render(, { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx index 71b758f27f580..831ba9ff58054 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { EuiButton, EuiDescribedFormGroup, EuiFormRow, EuiPanel } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { useAppContext } from '../../../hooks/use_app_context'; import { useKibana } from '../../../hooks/use_kibana'; import { UISettings } from './ui_settings'; @@ -15,6 +16,7 @@ export function SettingsTab() { const { application: { navigateToApp }, } = useKibana().services; + const { config } = useAppContext(); const handleNavigateToConnectors = () => { navigateToApp('management', { @@ -30,44 +32,46 @@ export function SettingsTab() { return ( - - {i18n.translate( - 'xpack.observabilityAiAssistantManagement.settingsPage.showAIAssistantButtonLabel', - { - defaultMessage: - 'Show AI Assistant button and Contextual Insights in Observability apps', - } - )} -
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

Paatp}g^5;MK$r?=`HX1@j#s~w60Ua>4=9CO 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

+ } + description={ +

+ {i18n.translate( + 'xpack.observabilityAiAssistantManagement.settingsPage.showAIAssistantDescriptionLabel', + { + defaultMessage: + 'Toggle the AI Assistant button and Contextual Insights on or off in Observability apps by checking or unchecking the AI Assistant feature in Spaces > > Features.', + ignoreTag: true, + } + )} +

+ } + > + + + {i18n.translate( + 'xpack.observabilityAiAssistantManagement.settingsPage.goToFeatureControlsButtonLabel', + { defaultMessage: 'Go to Spaces' } + )} + + + + )} ); })} - - + {config.logSourcesEnabled && ( + + )} {!isEmpty(unsavedChanges) && ( ; + +export const config: PluginConfigDescriptor = { + schema: configSchema, + exposeToBrowser: { logSourcesEnabled: true, spacesEnabled: true, visibilityEnabled: true }, +}; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/server/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_management/server/index.ts index 55332dbba35c5..1592b6f4cd72e 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/server/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/server/index.ts @@ -5,6 +5,8 @@ * 2.0. */ +export { config } from './config'; + export const plugin = async () => { const { AiAssistantManagementPlugin } = await import('./plugin'); return new AiAssistantManagementPlugin(); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/tsconfig.json b/x-pack/plugins/observability_solution/observability_ai_assistant_management/tsconfig.json index 12148ec014725..99bce73e1722f 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/tsconfig.json +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/tsconfig.json @@ -3,7 +3,11 @@ "compilerOptions": { "outDir": "target/types" }, - "include": ["common/**/*", "public/**/*", "server/**/*"], + "include": [ + "common/**/*", + "public/**/*", + "server/**/*" + ], "kbn_references": [ "@kbn/core", "@kbn/home-plugin", @@ -22,6 +26,11 @@ "@kbn/config-schema", "@kbn/core-ui-settings-common", "@kbn/logs-data-access-plugin", + "@kbn/core-plugins-browser", + "@kbn/ai-assistant", + "@kbn/core-plugins-server" ], - "exclude": ["target/**/*"] + "exclude": [ + "target/**/*" + ] } diff --git a/x-pack/plugins/search_assistant/kibana.jsonc b/x-pack/plugins/search_assistant/kibana.jsonc index 53af40cee6cc6..0f94105943037 100644 --- a/x-pack/plugins/search_assistant/kibana.jsonc +++ b/x-pack/plugins/search_assistant/kibana.jsonc @@ -15,7 +15,6 @@ "actions", "licensing", "observabilityAIAssistant", - "observabilityAIAssistantApp", "triggersActionsUi", "share" ], diff --git a/x-pack/plugins/search_assistant/public/application.tsx b/x-pack/plugins/search_assistant/public/application.tsx deleted file mode 100644 index 1bbf7063ec373..0000000000000 --- a/x-pack/plugins/search_assistant/public/application.tsx +++ /dev/null @@ -1,34 +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 React from 'react'; -import ReactDOM from 'react-dom'; -import type { AppMountParameters, CoreStart } from '@kbn/core/public'; -import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; -import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { I18nProvider } from '@kbn/i18n-react'; -import type { SearchAssistantPluginStartDependencies } from './types'; -import { SearchAssistantRouter } from './components/routes/router'; - -export const renderApp = ( - core: CoreStart, - services: SearchAssistantPluginStartDependencies, - appMountParameters: AppMountParameters -) => { - ReactDOM.render( - - - - - - - , - appMountParameters.element - ); - - return () => ReactDOM.unmountComponentAtNode(appMountParameters.element); -}; diff --git a/x-pack/plugins/search_assistant/public/components/app.tsx b/x-pack/plugins/search_assistant/public/components/app.tsx deleted file mode 100644 index 7d9497c0e1457..0000000000000 --- a/x-pack/plugins/search_assistant/public/components/app.tsx +++ /dev/null @@ -1,15 +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 React from 'react'; -import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; -export const App: React.FC = () => { - return ( - - ); From f05b25bc8610e795dd5f46160ee77daa485b6af2 Mon Sep 17 00:00:00 2001 From: Marco Vettorello Date: Mon, 28 Oct 2024 17:48:44 +0100 Subject: [PATCH 088/135] [Lens] fix showing points on line by default (#197828) ## Summary Fix the missing style to show points in line charts. Line charts should show data points whenever the distance between points is larger than 40px. --- .../expression_xy/public/components/xy_chart.test.tsx | 2 +- .../expression_xy/public/helpers/data_layers.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/chart_expressions/expression_xy/public/components/xy_chart.test.tsx b/src/plugins/chart_expressions/expression_xy/public/components/xy_chart.test.tsx index ae9c5a844dcc3..467e6afa6a897 100644 --- a/src/plugins/chart_expressions/expression_xy/public/components/xy_chart.test.tsx +++ b/src/plugins/chart_expressions/expression_xy/public/components/xy_chart.test.tsx @@ -842,7 +842,7 @@ describe('XYChart component', () => { const lineArea = dataLayers.find(LineSeries).at(0); const expectedSeriesStyle = expect.objectContaining({ point: expect.objectContaining({ - visible: showPoints ? 'always' : 'never', + visible: showPoints ? 'always' : 'auto', }), }); expect(lineArea.prop('areaSeriesStyle')).toEqual(expectedSeriesStyle); diff --git a/src/plugins/chart_expressions/expression_xy/public/helpers/data_layers.tsx b/src/plugins/chart_expressions/expression_xy/public/helpers/data_layers.tsx index 473562b63ad5e..942909880f301 100644 --- a/src/plugins/chart_expressions/expression_xy/public/helpers/data_layers.tsx +++ b/src/plugins/chart_expressions/expression_xy/public/helpers/data_layers.tsx @@ -298,7 +298,7 @@ export const getSeriesName: GetSeriesNameFn = ( const getPointConfig: GetPointConfigFn = ({ markSizeAccessor, showPoints, pointsRadius }) => { return { - visible: showPoints || markSizeAccessor ? 'always' : 'never', + visible: showPoints || markSizeAccessor ? 'always' : 'auto', radius: pointsRadius, fill: markSizeAccessor ? ColorVariant.Series : undefined, }; From a5db34b2f58888913ae1bb433803b9999df7a739 Mon Sep 17 00:00:00 2001 From: Cristina Amico Date: Mon, 28 Oct 2024 17:57:10 +0100 Subject: [PATCH 089/135] [Fleet] Fix flaky agentless test (#197951) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/elastic/kibana/issues/189038 ## Summary Attempt to fix [this flaky test ](https://buildkite.com/elastic/kibana-on-merge/builds/53472#0192c57d-51ca-4b9b-a934-dc13b0b9b7ca) failing with ``` Timed out in waitForNextUpdate after 1000ms. --   |     | at waitForNextUpdate (node_modules/@testing-library/react-hooks/lib/core/asyncUtils.js:96:13) ``` I'm adding a longer timeout hoping to resolve this issue. There is no way to run jest tests with flaky test runner so I'm not sure how to verify that the flakiness is really gone. --------- Co-authored-by: Elastic Machine --- .../hooks/setup_technology.test.ts | 21 +++++++------------ .../public/mock/create_test_renderer.tsx | 12 ++++++++++- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts index bd57576a4cafa..958dec6d20a08 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts @@ -592,7 +592,7 @@ describe('useSetupTechnology', () => { }); it('should revert the agent policy name to the original value when switching from agentless back to agent-based', async () => { - const { result, waitForNextUpdate } = renderHook(() => + const { result, rerender } = renderHook(() => useSetupTechnology({ setNewAgentPolicy, newAgentPolicy: newAgentPolicyMock, @@ -601,8 +601,7 @@ describe('useSetupTechnology', () => { packagePolicy: packagePolicyMock, }) ); - - await waitForNextUpdate(); + await rerender(); expect(result.current.selectedSetupTechnology).toBe(SetupTechnology.AGENT_BASED); @@ -611,21 +610,17 @@ describe('useSetupTechnology', () => { }); expect(result.current.selectedSetupTechnology).toBe(SetupTechnology.AGENTLESS); - - waitFor(() => { - expect(setNewAgentPolicy).toHaveBeenCalledWith({ - name: 'Agentless policy for endpoint-1', - supports_agentless: true, - inactivity_timeout: 3600, - }); + expect(setNewAgentPolicy).toHaveBeenCalledWith({ + id: 'agentless-policy-id', }); act(() => { result.current.handleSetupTechnologyChange(SetupTechnology.AGENT_BASED); }); - - expect(result.current.selectedSetupTechnology).toBe(SetupTechnology.AGENT_BASED); - expect(setNewAgentPolicy).toHaveBeenCalledWith(newAgentPolicyMock); + await waitFor(() => { + expect(result.current.selectedSetupTechnology).toBe(SetupTechnology.AGENT_BASED); + expect(setNewAgentPolicy).toHaveBeenCalledWith(newAgentPolicyMock); + }); }); it('should have global_data_tags with the integration team when updating the agentless policy', async () => { diff --git a/x-pack/plugins/fleet/public/mock/create_test_renderer.tsx b/x-pack/plugins/fleet/public/mock/create_test_renderer.tsx index 3a69f5fdc52e3..66155cee7bb35 100644 --- a/x-pack/plugins/fleet/public/mock/create_test_renderer.tsx +++ b/x-pack/plugins/fleet/public/mock/create_test_renderer.tsx @@ -59,7 +59,17 @@ export interface TestRenderer { setHeaderActionMenu: Function; } -const queryClient = new QueryClient(); +// disable retries to avoid test flakiness +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: false, + }, + mutations: { + retry: false, + }, + }, +}); export const createFleetTestRendererMock = (): TestRenderer => { const basePath = '/mock'; From f0865950480d1a2bf7985ee1c3387a1721556b6f Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Mon, 28 Oct 2024 18:10:47 +0100 Subject: [PATCH 090/135] Serverless tests - enable dot-prefixed index validation (#197141) ## Summary This PR enables Elasticsearch dot-prefixed index validation for serverless tests. --- x-pack/test_serverless/shared/config.base.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/test_serverless/shared/config.base.ts b/x-pack/test_serverless/shared/config.base.ts index 8b0be99b58ae4..d0985ff6be46a 100644 --- a/x-pack/test_serverless/shared/config.base.ts +++ b/x-pack/test_serverless/shared/config.base.ts @@ -94,6 +94,7 @@ export default async () => { 'xpack.security.authc.realms.jwt.jwt1.order=-98', `xpack.security.authc.realms.jwt.jwt1.pkc_jwkset_path=${getDockerFileMountPath(jwksPath)}`, `xpack.security.authc.realms.jwt.jwt1.token_type=access_token`, + 'serverless.indices.validate_dot_prefixes=true', ], ssl: true, // SSL is required for SAML realm }, From 2a65933ee24e4bdcdf419fc953c8908c259cb09d Mon Sep 17 00:00:00 2001 From: jennypavlova Date: Mon, 28 Oct 2024 18:17:02 +0100 Subject: [PATCH 091/135] [ObsUx][Infra] Remove no longer used feature flags for GA features (#197684) Closes #197612 ## Summary This PR removes the feature flags (`observability:enableInfrastructureHostsView` and `enableInfrastructureContainerAssetView` ) for host and container views Feature settings under `Infrastructure > Settings` (ignore the profiling one) | Before | After | | ------ | ----- | |![image](https://github.com/user-attachments/assets/f7ee9585-e96c-4492-9116-8de3c5e0c9c6) | ![image](https://github.com/user-attachments/assets/1c75e229-bd29-45c5-a354-cfdcb324ea9d) | ## Testing: The feature flags should not appear in the settings The Host menu item should be visible The Container asset views should be always enabled and visible (without an option to disable them) The Host asset views should be always enabled and visible (without an option to disable them) https://github.com/user-attachments/assets/a4d574d0-2669-4f96-88a4-a40c2f5023c2 --- .../kbn_management_settings_ids.devdocs.json | 30 --- api_docs/observability.devdocs.json | 228 ------------------ .../settings/setting_ids/index.ts | 4 - .../settings/observability_project/index.ts | 2 - .../server/collectors/management/schema.ts | 8 - .../server/collectors/management/types.ts | 2 - src/plugins/telemetry/schema/oss_plugins.json | 12 - .../infra/public/pages/metrics/index.tsx | 6 +- .../inventory_view/components/waffle/node.tsx | 6 +- .../pages/metrics/metric_detail/index.tsx | 7 +- .../settings/features_configuration_panel.tsx | 14 -- .../source_configuration_settings.tsx | 4 - .../infra/public/plugin.ts | 50 ++-- .../observability/common/index.ts | 2 - .../observability/common/ui_settings_keys.ts | 3 - .../observability/public/index.ts | 2 - .../observability/server/ui_settings.ts | 27 --- .../translations/translations/fr-FR.json | 4 - .../translations/translations/ja-JP.json | 4 - .../translations/translations/zh-CN.json | 4 - .../functional/apps/infra/node_details.ts | 30 +-- .../observability/infra/navigation.ts | 23 -- 22 files changed, 21 insertions(+), 451 deletions(-) diff --git a/api_docs/kbn_management_settings_ids.devdocs.json b/api_docs/kbn_management_settings_ids.devdocs.json index 716f5512821b5..068892a8dc375 100644 --- a/api_docs/kbn_management_settings_ids.devdocs.json +++ b/api_docs/kbn_management_settings_ids.devdocs.json @@ -1372,36 +1372,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "@kbn/management-settings-ids", - "id": "def-common.OBSERVABILITY_ENABLE_INFRASTRUCTURE_CONTAINER_ASSET_VIEW_ID", - "type": "string", - "tags": [], - "label": "OBSERVABILITY_ENABLE_INFRASTRUCTURE_CONTAINER_ASSET_VIEW_ID", - "description": [], - "signature": [ - "\"observability:enableInfrastructureContainerAssetView\"" - ], - "path": "packages/kbn-management/settings/setting_ids/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/management-settings-ids", - "id": "def-common.OBSERVABILITY_ENABLE_INFRASTRUCTURE_HOSTS_VIEW_ID", - "type": "string", - "tags": [], - "label": "OBSERVABILITY_ENABLE_INFRASTRUCTURE_HOSTS_VIEW_ID", - "description": [], - "signature": [ - "\"observability:enableInfrastructureHostsView\"" - ], - "path": "packages/kbn-management/settings/setting_ids/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "@kbn/management-settings-ids", "id": "def-common.OBSERVABILITY_ENABLE_INSPECT_ES_QUERIES_ID", diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 5c875c4abbd9a..6f87ad7be9bee 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -4547,36 +4547,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-public.enableInfrastructureContainerAssetView", - "type": "string", - "tags": [], - "label": "enableInfrastructureContainerAssetView", - "description": [], - "signature": [ - "\"observability:enableInfrastructureContainerAssetView\"" - ], - "path": "x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.enableInfrastructureHostsView", - "type": "string", - "tags": [], - "label": "enableInfrastructureHostsView", - "description": [], - "signature": [ - "\"observability:enableInfrastructureHostsView\"" - ], - "path": "x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-public.enableInspectEsQueries", @@ -10244,174 +10214,6 @@ } ] }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableInfrastructureHostsView", - "type": "Object", - "tags": [], - "label": "[enableInfrastructureHostsView]", - "description": [], - "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableInfrastructureHostsView.category", - "type": "Array", - "tags": [], - "label": "category", - "description": [], - "signature": [ - "string[]" - ], - "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableInfrastructureHostsView.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableInfrastructureHostsView.value", - "type": "boolean", - "tags": [], - "label": "value", - "description": [], - "signature": [ - "true" - ], - "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableInfrastructureHostsView.description", - "type": "string", - "tags": [], - "label": "description", - "description": [], - "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableInfrastructureHostsView.schema", - "type": "Object", - "tags": [], - "label": "schema", - "description": [], - "signature": [ - { - "pluginId": "@kbn/config-schema", - "scope": "common", - "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-common.Type", - "text": "Type" - }, - "" - ], - "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableInfrastructureContainerAssetView", - "type": "Object", - "tags": [], - "label": "[enableInfrastructureContainerAssetView]", - "description": [], - "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableInfrastructureContainerAssetView.category", - "type": "Array", - "tags": [], - "label": "category", - "description": [], - "signature": [ - "string[]" - ], - "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableInfrastructureContainerAssetView.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableInfrastructureContainerAssetView.value", - "type": "boolean", - "tags": [], - "label": "value", - "description": [], - "signature": [ - "true" - ], - "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableInfrastructureContainerAssetView.description", - "type": "string", - "tags": [], - "label": "description", - "description": [], - "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableInfrastructureContainerAssetView.schema", - "type": "Object", - "tags": [], - "label": "schema", - "description": [], - "signature": [ - { - "pluginId": "@kbn/config-schema", - "scope": "common", - "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-common.Type", - "text": "Type" - }, - "" - ], - "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, { "parentPluginId": "observability", "id": "def-server.uiSettings.enableInfrastructureProfilingIntegration", @@ -14532,36 +14334,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-common.enableInfrastructureContainerAssetView", - "type": "string", - "tags": [], - "label": "enableInfrastructureContainerAssetView", - "description": [], - "signature": [ - "\"observability:enableInfrastructureContainerAssetView\"" - ], - "path": "x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-common.enableInfrastructureHostsView", - "type": "string", - "tags": [], - "label": "enableInfrastructureHostsView", - "description": [], - "signature": [ - "\"observability:enableInfrastructureHostsView\"" - ], - "path": "x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-common.enableInfrastructureProfilingIntegration", diff --git a/packages/kbn-management/settings/setting_ids/index.ts b/packages/kbn-management/settings/setting_ids/index.ts index e926007f77f25..551e99e4ef131 100644 --- a/packages/kbn-management/settings/setting_ids/index.ts +++ b/packages/kbn-management/settings/setting_ids/index.ts @@ -122,10 +122,6 @@ export const OBSERVABILITY_APM_TRACE_EXPLORER_TAB_ID = 'observability:apmTraceEx export const OBSERVABILITY_ENABLE_AWS_LAMBDA_METRICS_ID = 'observability:enableAwsLambdaMetrics'; export const OBSERVABILITY_ENABLE_COMPARISON_BY_DEFAULT_ID = 'observability:enableComparisonByDefault'; -export const OBSERVABILITY_ENABLE_INFRASTRUCTURE_HOSTS_VIEW_ID = - 'observability:enableInfrastructureHostsView'; -export const OBSERVABILITY_ENABLE_INFRASTRUCTURE_CONTAINER_ASSET_VIEW_ID = - 'observability:enableInfrastructureContainerAssetView'; export const OBSERVABILITY_ENABLE_INFRASTRUCTURE_ASSET_CUSTOM_DASHBOARDS_ID = 'observability:enableInfrastructureAssetCustomDashboards'; export const OBSERVABILITY_ENABLE_INSPECT_ES_QUERIES_ID = 'observability:enableInspectEsQueries'; diff --git a/packages/serverless/settings/observability_project/index.ts b/packages/serverless/settings/observability_project/index.ts index 44f30e4320463..d04b0238c5510 100644 --- a/packages/serverless/settings/observability_project/index.ts +++ b/packages/serverless/settings/observability_project/index.ts @@ -27,8 +27,6 @@ export const OBSERVABILITY_PROJECT_SETTINGS = [ settings.OBSERVABILITY_APM_TRACE_EXPLORER_TAB_ID, settings.OBSERVABILITY_ENABLE_AWS_LAMBDA_METRICS_ID, settings.OBSERVABILITY_APM_ENABLE_CRITICAL_PATH_ID, - settings.OBSERVABILITY_ENABLE_INFRASTRUCTURE_HOSTS_VIEW_ID, - settings.OBSERVABILITY_ENABLE_INFRASTRUCTURE_CONTAINER_ASSET_VIEW_ID, settings.OBSERVABILITY_ENABLE_INFRASTRUCTURE_ASSET_CUSTOM_DASHBOARDS_ID, settings.OBSERVABILITY_LOGS_EXPLORER_ALLOWED_DATA_VIEWS_ID, settings.OBSERVABILITY_APM_ENABLE_TABLE_SEARCH_BAR, diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts index 6b3db9460eb7c..779150faa89fb 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts @@ -642,14 +642,6 @@ export const stackManagementSchema: MakeSchemaFrom = { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, }, - 'observability:enableInfrastructureHostsView': { - type: 'boolean', - _meta: { description: 'Non-default value of setting.' }, - }, - 'observability:enableInfrastructureContainerAssetView': { - type: 'boolean', - _meta: { description: 'Non-default value of setting.' }, - }, 'observability:enableInfrastructureProfilingIntegration': { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts index 92076ebc302e2..2734ab6304319 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts @@ -46,8 +46,6 @@ export interface UsageStats { 'observability:apmEnableContinuousRollups': boolean; 'observability:apmAWSLambdaPriceFactor': string; 'observability:apmAWSLambdaRequestCostPerMillion': number; - 'observability:enableInfrastructureHostsView': boolean; - 'observability:enableInfrastructureContainerAssetView': boolean; 'observability:enableInfrastructureProfilingIntegration': boolean; 'observability:enableInfrastructureAssetCustomDashboards': boolean; 'observability:apmAgentExplorerView': boolean; diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index c71718cfaa5a6..d54a75b313cd8 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -10815,18 +10815,6 @@ "description": "Non-default value of setting." } }, - "observability:enableInfrastructureHostsView": { - "type": "boolean", - "_meta": { - "description": "Non-default value of setting." - } - }, - "observability:enableInfrastructureContainerAssetView": { - "type": "boolean", - "_meta": { - "description": "Non-default value of setting." - } - }, "observability:enableInfrastructureProfilingIntegration": { "type": "boolean", "_meta": { diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/index.tsx b/x-pack/plugins/observability_solution/infra/public/pages/metrics/index.tsx index 1d0e394b281d4..7a0289d461af7 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/index.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/index.tsx @@ -17,9 +17,8 @@ import { EuiFlexGroup, EuiFlexItem, } from '@elastic/eui'; -import { useKibana, useUiSetting } from '@kbn/kibana-react-plugin/public'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; import { HeaderMenuPortal, useLinkProps } from '@kbn/observability-shared-plugin/public'; -import { enableInfrastructureHostsView } from '@kbn/observability-plugin/common'; import { SharePublicStart } from '@kbn/share-plugin/public/plugin'; import { ObservabilityOnboardingLocatorParams, @@ -60,7 +59,6 @@ export const InfrastructurePage = () => { const config = usePluginConfig(); const { application } = useKibana<{ share: SharePublicStart }>().services; const { setHeaderActionMenu, theme$ } = useContext(HeaderActionMenuContext); - const isHostsViewEnabled = useUiSetting(enableInfrastructureHostsView); const uiCapabilities = application?.capabilities; @@ -128,7 +126,7 @@ export const InfrastructurePage = () => { )} - {isHostsViewEnabled ? : null} + diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/inventory_view/components/waffle/node.tsx b/x-pack/plugins/observability_solution/infra/public/pages/metrics/inventory_view/components/waffle/node.tsx index fb787e8df7c5b..02e4e634d30d1 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/inventory_view/components/waffle/node.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/inventory_view/components/waffle/node.tsx @@ -11,8 +11,6 @@ import { first } from 'lodash'; import { EuiPopover, EuiToolTip } from '@elastic/eui'; import { InventoryItemType } from '@kbn/metrics-data-access-plugin/common'; import { useBoolean } from '@kbn/react-hooks'; -import { useUiSetting } from '@kbn/kibana-react-plugin/public'; -import { enableInfrastructureContainerAssetView } from '@kbn/observability-plugin/common'; import { InfraWaffleMapBounds, InfraWaffleMapNode, @@ -55,9 +53,7 @@ export const Node = ({ const color = colorFromValue(options.legend, rawValue, bounds); const value = formatter(rawValue); - const isContainerAssetViewEnabled = useUiSetting(enableInfrastructureContainerAssetView); - const showContainerAssetDetailPage = nodeType === 'container' && isContainerAssetViewEnabled; - const isFlyoutMode = nodeType === 'host' || showContainerAssetDetailPage; + const isFlyoutMode = nodeType === 'host' || nodeType === 'container'; const toggleAssetPopover = () => { if (isFlyoutMode) { diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/metric_detail/index.tsx b/x-pack/plugins/observability_solution/infra/public/pages/metrics/metric_detail/index.tsx index b41de1b7b9e3a..064973ebd92f6 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/metric_detail/index.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/metric_detail/index.tsx @@ -8,9 +8,7 @@ import { EuiErrorBoundary } from '@elastic/eui'; import React from 'react'; import { useRouteMatch } from 'react-router-dom'; -import { useUiSetting } from '@kbn/kibana-react-plugin/public'; import type { InventoryItemType } from '@kbn/metrics-data-access-plugin/common'; -import { enableInfrastructureContainerAssetView } from '@kbn/observability-plugin/common'; import { AssetDetailPage } from './asset_detail_page'; import { MetricDetailPage } from './metric_detail_page'; import { MetricsTimeProvider } from './hooks/use_metrics_time'; @@ -20,12 +18,9 @@ export const NodeDetail = () => { params: { type: nodeType }, } = useRouteMatch<{ type: InventoryItemType; node: string }>(); - const isContainerAssetViewEnabled = useUiSetting(enableInfrastructureContainerAssetView); - - const showContainerAssetDetailPage = nodeType === 'container' && isContainerAssetViewEnabled; return ( - {nodeType === 'host' || showContainerAssetDetailPage ? ( + {nodeType === 'host' || nodeType === 'container' ? ( ) : ( diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/settings/features_configuration_panel.tsx b/x-pack/plugins/observability_solution/infra/public/pages/metrics/settings/features_configuration_panel.tsx index d8df6ef8b39fa..df8b78b5ef64b 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/settings/features_configuration_panel.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/settings/features_configuration_panel.tsx @@ -11,10 +11,8 @@ import { EuiForm } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import React from 'react'; import { - enableInfrastructureHostsView, enableInfrastructureProfilingIntegration, enableInfrastructureAssetCustomDashboards, - enableInfrastructureContainerAssetView, } from '@kbn/observability-plugin/common'; import { useEditableSettings } from '@kbn/observability-shared-plugin/public'; import { withSuspense } from '@kbn/shared-ux-utility'; @@ -71,12 +69,6 @@ export function FeaturesConfigurationPanel({ validateChange: async () => settingsValidationResponse, }} > - )} - ); diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/settings/source_configuration_settings.tsx b/x-pack/plugins/observability_solution/infra/public/pages/metrics/settings/source_configuration_settings.tsx index de078dcb354df..8deaa805ba9b4 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/settings/source_configuration_settings.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/settings/source_configuration_settings.tsx @@ -14,8 +14,6 @@ import { useEditableSettings, } from '@kbn/observability-shared-plugin/public'; import { - enableInfrastructureContainerAssetView, - enableInfrastructureHostsView, enableInfrastructureProfilingIntegration, enableInfrastructureAssetCustomDashboards, } from '@kbn/observability-plugin/common'; @@ -87,10 +85,8 @@ export const SourceConfigurationSettings = ({ getUnsavedChanges, } = useSourceConfigurationFormState(source?.configuration); const infraUiSettings = useEditableSettings([ - enableInfrastructureHostsView, enableInfrastructureProfilingIntegration, enableInfrastructureAssetCustomDashboards, - enableInfrastructureContainerAssetView, ]); const resetAllUnsavedChanges = useCallback(() => { diff --git a/x-pack/plugins/observability_solution/infra/public/plugin.ts b/x-pack/plugins/observability_solution/infra/public/plugin.ts index daaa3510e1660..2324c5a633e2a 100644 --- a/x-pack/plugins/observability_solution/infra/public/plugin.ts +++ b/x-pack/plugins/observability_solution/infra/public/plugin.ts @@ -15,7 +15,6 @@ import { AppDeepLinkLocations, } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; -import { enableInfrastructureHostsView } from '@kbn/observability-plugin/public'; import { METRICS_EXPLORER_LOCATOR_ID, MetricsExplorerLocatorParams, @@ -131,10 +130,7 @@ export class Plugin implements InfraClientPluginClass { messageFields: this.config.sources?.default?.fields?.message, }); - const startDep$AndHostViewFlag$ = combineLatest([ - from(core.getStartServices()), - core.settings.client.get$(enableInfrastructureHostsView), - ]); + const startDep$AndHostViewFlag$ = combineLatest([from(core.getStartServices())]); const logRoutes = getLogsAppRoutes({ isLogsStreamEnabled }); @@ -148,7 +144,6 @@ export class Plugin implements InfraClientPluginClass { application: { capabilities }, }, ], - isInfrastructureHostsViewEnabled, ]) => { const { infrastructure, logs } = capabilities; return [ @@ -185,15 +180,11 @@ export class Plugin implements InfraClientPluginClass { }, ] : []), - ...(isInfrastructureHostsViewEnabled - ? [ - { - label: hostsTitle, - app: 'metrics', - path: '/hosts', - }, - ] - : []), + { + label: hostsTitle, + app: 'metrics', + path: '/hosts', + }, ], }, ] @@ -243,10 +234,8 @@ export class Plugin implements InfraClientPluginClass { // !! Need to be kept in sync with the routes in x-pack/plugins/observability_solution/infra/public/pages/metrics/index.tsx const getInfraDeepLinks = ({ - hostsEnabled, metricsExplorerEnabled, }: { - hostsEnabled: boolean; metricsExplorerEnabled: boolean; }): AppDeepLink[] => { const visibleIn: AppDeepLinkLocations[] = ['globalSearch']; @@ -258,18 +247,14 @@ export class Plugin implements InfraClientPluginClass { path: '/inventory', visibleIn, }, - ...(hostsEnabled - ? [ - { - id: 'hosts', - title: i18n.translate('xpack.infra.homePage.metricsHostsTabTitle', { - defaultMessage: 'Hosts', - }), - path: '/hosts', - visibleIn, - }, - ] - : []), + { + id: 'hosts', + title: i18n.translate('xpack.infra.homePage.metricsHostsTabTitle', { + defaultMessage: 'Hosts', + }), + path: '/hosts', + visibleIn, + }, ...(metricsExplorerEnabled ? [ { @@ -308,7 +293,6 @@ export class Plugin implements InfraClientPluginClass { category: DEFAULT_APP_CATEGORIES.observability, updater$: this.appUpdater$, deepLinks: getInfraDeepLinks({ - hostsEnabled: core.settings.client.get(enableInfrastructureHostsView), metricsExplorerEnabled: this.config.featureFlags.metricsExplorerEnabled, }), mount: async (params: AppMountParameters) => { @@ -334,13 +318,9 @@ export class Plugin implements InfraClientPluginClass { }); startDep$AndHostViewFlag$.subscribe( - ([_startServices, isInfrastructureHostsViewEnabled]: [ - [CoreStart, InfraClientStartDeps, InfraClientStartExports], - boolean - ]) => { + ([_startServices]: [[CoreStart, InfraClientStartDeps, InfraClientStartExports]]) => { this.appUpdater$.next(() => ({ deepLinks: getInfraDeepLinks({ - hostsEnabled: isInfrastructureHostsViewEnabled, metricsExplorerEnabled: this.config.featureFlags.metricsExplorerEnabled, }), })); diff --git a/x-pack/plugins/observability_solution/observability/common/index.ts b/x-pack/plugins/observability_solution/observability/common/index.ts index 3dc44c5ac02aa..4baaf7957fa81 100644 --- a/x-pack/plugins/observability_solution/observability/common/index.ts +++ b/x-pack/plugins/observability_solution/observability/common/index.ts @@ -30,8 +30,6 @@ export { apmServiceGroupMaxNumberOfServices, apmTraceExplorerTab, apmLabsButton, - enableInfrastructureHostsView, - enableInfrastructureContainerAssetView, enableInfrastructureProfilingIntegration, enableInfrastructureAssetCustomDashboards, enableAwsLambdaMetrics, diff --git a/x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts b/x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts index efceaca9a0427..7025c120cae5d 100644 --- a/x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts +++ b/x-pack/plugins/observability_solution/observability/common/ui_settings_keys.ts @@ -16,13 +16,10 @@ export const apmServiceGroupMaxNumberOfServices = 'observability:apmServiceGroupMaxNumberOfServices'; export const apmTraceExplorerTab = 'observability:apmTraceExplorerTab'; export const apmLabsButton = 'observability:apmLabsButton'; -export const enableInfrastructureHostsView = 'observability:enableInfrastructureHostsView'; export const enableInfrastructureProfilingIntegration = 'observability:enableInfrastructureProfilingIntegration'; export const enableInfrastructureAssetCustomDashboards = 'observability:enableInfrastructureAssetCustomDashboards'; -export const enableInfrastructureContainerAssetView = - 'observability:enableInfrastructureContainerAssetView'; export const enableAwsLambdaMetrics = 'observability:enableAwsLambdaMetrics'; export const enableAgentExplorerView = 'observability:apmAgentExplorerView'; export const apmEnableTableSearchBar = 'observability:apmEnableTableSearchBar'; diff --git a/x-pack/plugins/observability_solution/observability/public/index.ts b/x-pack/plugins/observability_solution/observability/public/index.ts index 58c3aa4cadd66..6230f5411b543 100644 --- a/x-pack/plugins/observability_solution/observability/public/index.ts +++ b/x-pack/plugins/observability_solution/observability/public/index.ts @@ -40,8 +40,6 @@ export { enableInspectEsQueries, enableComparisonByDefault, apmServiceGroupMaxNumberOfServices, - enableInfrastructureHostsView, - enableInfrastructureContainerAssetView, enableAgentExplorerView, apmEnableTableSearchBar, } from '../common/ui_settings_keys'; diff --git a/x-pack/plugins/observability_solution/observability/server/ui_settings.ts b/x-pack/plugins/observability_solution/observability/server/ui_settings.ts index dae7e2ad9ab5b..1a387f24fbaed 100644 --- a/x-pack/plugins/observability_solution/observability/server/ui_settings.ts +++ b/x-pack/plugins/observability_solution/observability/server/ui_settings.ts @@ -28,7 +28,6 @@ import { apmEnableServiceMetrics, apmEnableContinuousRollups, enableCriticalPath, - enableInfrastructureHostsView, syntheticsThrottlingEnabled, enableLegacyUptimeApp, apmEnableProfilingIntegration, @@ -45,7 +44,6 @@ import { enableInfrastructureAssetCustomDashboards, apmEnableServiceInventoryTableSearchBar, profilingFetchTopNFunctionsFromStacktraces, - enableInfrastructureContainerAssetView, searchExcludedDataTiers, } from '../common/ui_settings_keys'; @@ -232,31 +230,6 @@ export const uiSettings: Record = { requiresPageReload: true, type: 'boolean', }, - [enableInfrastructureHostsView]: { - category: [observabilityFeatureId], - name: i18n.translate('xpack.observability.enableInfrastructureHostsView', { - defaultMessage: 'Infrastructure Hosts view', - }), - value: true, - description: i18n.translate('xpack.observability.enableInfrastructureHostsViewDescription', { - defaultMessage: 'Enable the Hosts view in the Infrastructure app.', - }), - schema: schema.boolean(), - }, - [enableInfrastructureContainerAssetView]: { - category: [observabilityFeatureId], - name: i18n.translate('xpack.observability.enableInfrastructureContainerAssetView', { - defaultMessage: 'Container view', - }), - value: true, - description: i18n.translate( - 'xpack.observability.enableInfrastructureContainerAssetViewDescription', - { - defaultMessage: 'Enable the Container asset view in the Infrastructure app.', - } - ), - schema: schema.boolean(), - }, [enableInfrastructureProfilingIntegration]: { category: [observabilityFeatureId], name: i18n.translate('xpack.observability.enableInfrastructureProfilingIntegration', { diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index a0cfae596fc96..ab75f1543cc33 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -32227,10 +32227,6 @@ "xpack.observability.enableCriticalPathDescription": "{technicalPreviewLabel} Affiche de façon optionnelle le chemin critique d'une trace.", "xpack.observability.enableInfrastructureAssetCustomDashboards": "Tableaux de bord personnalisés pour les détails de ressource dans Infrastructure", "xpack.observability.enableInfrastructureAssetCustomDashboardsDescription": "{technicalPreviewLabel} Activez l'option pour lier des tableaux de bord personnalisés dans l'affichage des détails de ressource.", - "xpack.observability.enableInfrastructureContainerAssetView": "Vue Conteneur", - "xpack.observability.enableInfrastructureContainerAssetViewDescription": "Activez la vue des ressources du conteneur dans l'application Infrastructure.", - "xpack.observability.enableInfrastructureHostsView": "Vue des hôtes de l'infrastructure", - "xpack.observability.enableInfrastructureHostsViewDescription": "{betaLabel} Activez la vue \"Hôtes\" dans l’application \"Infrastructure\".", "xpack.observability.enableInfrastructureProfilingIntegration": "Intégration Universal Profiling dans Infrastructure", "xpack.observability.enableInfrastructureProfilingIntegrationDescription": "Activez l'intégration Universal Profiling dans l'application Infrastructure.", "xpack.observability.enableInspectEsQueriesExperimentDescription": "Inspectez les recherches Elasticsearch dans les réponses API.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 6a81bee15918b..a77f0348b572f 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -31973,10 +31973,6 @@ "xpack.observability.enableCriticalPathDescription": "{technicalPreviewLabel} 任意で、トレースのクリティカルパスを表示します。", "xpack.observability.enableInfrastructureAssetCustomDashboards": "インフラのアセット詳細のカスタムダッシュボード", "xpack.observability.enableInfrastructureAssetCustomDashboardsDescription": "{technicalPreviewLabel}アセット詳細ビューでカスタムダッシュボードをリンクするオプションを有効化します。", - "xpack.observability.enableInfrastructureContainerAssetView": "コンテナービュー", - "xpack.observability.enableInfrastructureContainerAssetViewDescription": "インフラアプリでコンテナーアセットビューを有効にします。", - "xpack.observability.enableInfrastructureHostsView": "インフラストラクチャーホストビュー", - "xpack.observability.enableInfrastructureHostsViewDescription": "{betaLabel}インフラアプリでホストビューを有効にします。", "xpack.observability.enableInfrastructureProfilingIntegration": "インフラのユニバーサルプロファイリング統合", "xpack.observability.enableInfrastructureProfilingIntegrationDescription": "インフラアプリでユニバーサルプロファイリング統合を有効化します。", "xpack.observability.enableInspectEsQueriesExperimentDescription": "API応答でElasticsearchクエリーを調査します。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 95c94e1f0b17f..2b13eacdad26e 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -32015,10 +32015,6 @@ "xpack.observability.enableCriticalPathDescription": "{technicalPreviewLabel}(可选)显示跟踪的关键路径。", "xpack.observability.enableInfrastructureAssetCustomDashboards": "Infrastructure 中资产详情的定制仪表板", "xpack.observability.enableInfrastructureAssetCustomDashboardsDescription": "{technicalPreviewLabel} 启用选项以在资产详情视图中链接定制仪表板。", - "xpack.observability.enableInfrastructureContainerAssetView": "容器视图", - "xpack.observability.enableInfrastructureContainerAssetViewDescription": "在 Infrastructure 应用中启用容器资产视图。", - "xpack.observability.enableInfrastructureHostsView": "基础架构主机视图", - "xpack.observability.enableInfrastructureHostsViewDescription": "{betaLabel} 在 Infrastructure 应用中启用主机视图。", "xpack.observability.enableInfrastructureProfilingIntegration": "Infrastructure 中的 Universal Profiling 集成", "xpack.observability.enableInfrastructureProfilingIntegrationDescription": "在 Infrastructure 应用中启用 Universal Profiling 集成。", "xpack.observability.enableInspectEsQueriesExperimentDescription": "检查 API 响应中的 Elasticsearch 查询。", diff --git a/x-pack/test/functional/apps/infra/node_details.ts b/x-pack/test/functional/apps/infra/node_details.ts index 0f1de8cb9c8bf..0e70d974d6ed5 100644 --- a/x-pack/test/functional/apps/infra/node_details.ts +++ b/x-pack/test/functional/apps/infra/node_details.ts @@ -9,10 +9,7 @@ import moment from 'moment'; import expect from '@kbn/expect'; import rison from '@kbn/rison'; import { InfraSynthtraceEsClient } from '@kbn/apm-synthtrace'; -import { - enableInfrastructureContainerAssetView, - enableInfrastructureProfilingIntegration, -} from '@kbn/observability-plugin/common'; +import { enableInfrastructureProfilingIntegration } from '@kbn/observability-plugin/common'; import { ALERT_STATUS_ACTIVE, ALERT_STATUS_RECOVERED, @@ -135,12 +132,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.header.waitUntilLoadingHasFinished(); }; - const setInfrastructureContainerAssetViewUiSetting = async (value: boolean = true) => { - await kibanaServer.uiSettings.update({ [enableInfrastructureContainerAssetView]: value }); - await browser.refresh(); - await pageObjects.header.waitUntilLoadingHasFinished(); - }; - describe('Node Details', () => { let synthEsClient: InfraSynthtraceEsClient; before(async () => { @@ -801,25 +792,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { after(() => synthEsClient.clean()); - describe('when container asset view is disabled', () => { - before(async () => { - await setInfrastructureContainerAssetViewUiSetting(false); - await navigateToNodeDetails('container-id-0', 'container', { name: 'container-id-0' }); - await pageObjects.header.waitUntilLoadingHasFinished(); - await pageObjects.timePicker.setAbsoluteRange( - START_CONTAINER_DATE.format(DATE_PICKER_FORMAT), - END_CONTAINER_DATE.format(DATE_PICKER_FORMAT) - ); - }); - - it('should show old view of container details', async () => { - await testSubjects.find('metricsEmptyViewState'); - }); - }); - - describe('when container asset view is enabled', () => { + describe('when navigating to container asset view', () => { before(async () => { - await setInfrastructureContainerAssetViewUiSetting(true); await navigateToNodeDetails('container-id-0', 'container', { name: 'container-id-0' }); await pageObjects.header.waitUntilLoadingHasFinished(); await pageObjects.timePicker.setAbsoluteRange( diff --git a/x-pack/test_serverless/functional/test_suites/observability/infra/navigation.ts b/x-pack/test_serverless/functional/test_suites/observability/infra/navigation.ts index 64f764b289ab4..57e0f82f03aca 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/infra/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/infra/navigation.ts @@ -5,21 +5,12 @@ * 2.0. */ -import { enableInfrastructureHostsView } from '@kbn/observability-plugin/common'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default ({ getPageObjects, getService }: FtrProviderContext) => { - const kibanaServer = getService('kibanaServer'); const svlObltNavigation = getService('svlObltNavigation'); - const browser = getService('browser'); const pageObjects = getPageObjects(['svlCommonPage', 'svlCommonNavigation', 'header']); - const setHostsSetting = async (value: boolean) => { - await kibanaServer.uiSettings.update({ [enableInfrastructureHostsView]: value }); - await browser.refresh(); - await pageObjects.svlCommonNavigation.expectExists(); - }; - const openInfraSection = async () => { await pageObjects.svlCommonNavigation.sidenav.openSection('observability_project_nav.metrics'); }; @@ -32,7 +23,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('when Hosts settings is on', () => { before(async () => { - await setHostsSetting(true); await openInfraSection(); }); @@ -42,18 +32,5 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); }); }); - - describe('when Hosts settings is off', () => { - before(async () => { - await setHostsSetting(false); - await openInfraSection(); - }); - - it("hides the 'Hosts' nav item", async () => { - await pageObjects.svlCommonNavigation.sidenav.expectLinkMissing({ - deepLinkId: 'metrics:hosts', - }); - }); - }); }); }; From 9e9a6bb07dc3a5424a4a369709bf91f6d547361e Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 28 Oct 2024 11:21:25 -0600 Subject: [PATCH 092/135] do not set full screen mode on ExitFullScreenButton re-render (#198012) ### Background https://github.com/elastic/kibana/pull/194892 is refactoring [DashboardRenderer](https://github.com/elastic/kibana/blob/3391344e8dc8377d359b918521b6c48838cde8ae/src/plugins/dashboard/public/dashboard_container/external_api/dashboard_renderer.tsx) component to replace Dashboard Embeddable with a plain old javascript object. Dashboard Embeddable rendered its contents in a new react tree. The new implementation does not. Since the new implementation does not render the dashboard in a new react tree, any re-render in `DashboardViewport` parent components causes `ExitFullScreenButton` to re-render. In its current form, re-rendering `ExitFullScreenButton` calls `onExit`, which causing dashboard to exit full screen mode. This PR makes use of `useCallback` to fix the issue where re-rending `ExitFullScreenButton` calls `onExit`. ### Test steps 1) Open dashboard that ships with sample web logs data set 2) switch to view mode 3) click "Full screen" button 4) Maximize a panel. Verify dashboard stays in full screen mode. --- .../button/exit_full_screen/src/services.tsx | 12 +++-- .../component/viewport/dashboard_viewport.tsx | 46 +++++-------------- 2 files changed, 19 insertions(+), 39 deletions(-) diff --git a/packages/shared-ux/button/exit_full_screen/src/services.tsx b/packages/shared-ux/button/exit_full_screen/src/services.tsx index a167b2b116bf0..9497a6ed34468 100644 --- a/packages/shared-ux/button/exit_full_screen/src/services.tsx +++ b/packages/shared-ux/button/exit_full_screen/src/services.tsx @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import React, { FC, useContext, PropsWithChildren } from 'react'; +import React, { FC, useContext, PropsWithChildren, useCallback } from 'react'; import type { Services, @@ -37,12 +37,16 @@ export const ExitFullScreenButtonProvider: FC > = ({ children, ...services }) => { + const setIsFullscreen = useCallback( + (isFullscreen: boolean) => { + services.coreStart.chrome.setIsVisible(!isFullscreen); + }, + [services.coreStart.chrome] + ); return ( { - services.coreStart.chrome.setIsVisible(!isFullscreen); - }, + setIsFullscreen, customBranding$: services.coreStart.customBranding.customBranding$, }} > diff --git a/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx b/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx index 664a3c43a8d9d..027d2aee62b15 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx @@ -10,7 +10,7 @@ import { debounce } from 'lodash'; import classNames from 'classnames'; import useResizeObserver from 'use-resize-observer/polyfilled'; -import React, { useEffect, useMemo, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { EuiPortal } from '@elastic/eui'; import { ReactEmbeddableRenderer, ViewMode } from '@kbn/embeddable-plugin/public'; @@ -22,10 +22,7 @@ import { ControlGroupSerializedState, } from '@kbn/controls-plugin/public'; import { CONTROL_GROUP_TYPE } from '@kbn/controls-plugin/common'; -import { - useBatchedPublishingSubjects, - useStateFromPublishingSubject, -} from '@kbn/presentation-publishing'; +import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; import { DashboardGrid } from '../grid'; import { useDashboardApi } from '../../../dashboard_api/use_dashboard_api'; import { DashboardEmptyScreen } from '../empty_screen/dashboard_empty_screen'; @@ -44,7 +41,7 @@ export const useDebouncedWidthObserver = (skipDebounce = false, wait = 100) => { return { ref, width }; }; -export const DashboardViewportComponent = () => { +export const DashboardViewport = () => { const dashboardApi = useDashboardApi(); const [hasControls, setHasControls] = useState(false); const [ @@ -70,6 +67,9 @@ export const DashboardViewportComponent = () => { dashboardApi.uuid$, dashboardApi.fullScreenMode$ ); + const onExit = useCallback(() => { + dashboardApi.setFullScreenMode(false); + }, [dashboardApi]); const panelCount = useMemo(() => { return Object.keys(panels).length; @@ -142,6 +142,11 @@ export const DashboardViewportComponent = () => { />
- - ); -}; diff --git a/x-pack/plugins/search_assistant/public/components/nav_control/index.tsx b/x-pack/plugins/search_assistant/public/components/nav_control/index.tsx new file mode 100644 index 0000000000000..a341fdbe81412 --- /dev/null +++ b/x-pack/plugins/search_assistant/public/components/nav_control/index.tsx @@ -0,0 +1,152 @@ +/* + * 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, { useEffect, useRef, useState } from 'react'; +import { AssistantAvatar, useAbortableAsync } from '@kbn/observability-ai-assistant-plugin/public'; +import { EuiButton, EuiLoadingSpinner, EuiToolTip, useEuiTheme } from '@elastic/eui'; +import { css } from '@emotion/react'; +import { v4 } from 'uuid'; +import useObservable from 'react-use/lib/useObservable'; +import { i18n } from '@kbn/i18n'; +import { useAIAssistantAppService, ChatFlyout } from '@kbn/ai-assistant'; +import { useKibana } from '@kbn/ai-assistant/src/hooks/use_kibana'; +import { AIAssistantPluginStartDependencies } from '@kbn/ai-assistant/src/types'; +import { EuiErrorBoundary } from '@elastic/eui'; +import type { CoreStart } from '@kbn/core/public'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; +import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app'; + +interface NavControlWithProviderDeps { + coreStart: CoreStart; + pluginsStart: AIAssistantPluginStartDependencies; +} + +export const NavControlWithProvider = ({ coreStart, pluginsStart }: NavControlWithProviderDeps) => { + return ( + + + + + + + + + + + + ); +}; + +export function NavControl() { + const service = useAIAssistantAppService(); + + const { + services: { notifications, observabilityAIAssistant }, + } = useKibana(); + + const [hasBeenOpened, setHasBeenOpened] = useState(false); + + const chatService = useAbortableAsync( + ({ signal }) => { + return hasBeenOpened + ? service.start({ signal }).catch((error) => { + notifications?.toasts.addError(error, { + title: i18n.translate('xpack.searchAssistant.navControl.initFailureErrorTitle', { + defaultMessage: 'Failed to initialize AI Assistant', + }), + }); + + setHasBeenOpened(false); + setIsOpen(false); + + throw error; + }) + : undefined; + }, + [service, hasBeenOpened, notifications?.toasts] + ); + + const [isOpen, setIsOpen] = useState(false); + + const keyRef = useRef(v4()); + + useEffect(() => { + const conversationSubscription = service.conversations.predefinedConversation$.subscribe(() => { + keyRef.current = v4(); + setHasBeenOpened(true); + setIsOpen(true); + }); + + return () => { + conversationSubscription.unsubscribe(); + }; + }, [service.conversations.predefinedConversation$]); + + const { messages, title } = useObservable(service.conversations.predefinedConversation$) ?? { + messages: [], + title: undefined, + }; + + const theme = useEuiTheme().euiTheme; + + const buttonCss = css` + padding: 0px 8px; + + svg path { + fill: ${theme.colors.darkestShade}; + } + `; + + return ( + <> + + { + service.conversations.openNewConversation({ + messages: [], + }); + }} + color="primary" + size="s" + fullWidth={false} + minWidth={0} + > + {chatService.loading ? : } + + + {chatService.value && + Boolean(observabilityAIAssistant?.ObservabilityAIAssistantChatServiceContext) ? ( + + { + setIsOpen(false); + }} + /> + + ) : undefined} + + ); +} + +const buttonLabel = i18n.translate( + 'xpack.searchAssistant.navControl.openTheAIAssistantPopoverLabel', + { defaultMessage: 'Open the AI Assistant' } +); diff --git a/x-pack/plugins/search_assistant/public/components/nav_control/lazy_nav_control.tsx b/x-pack/plugins/search_assistant/public/components/nav_control/lazy_nav_control.tsx new file mode 100644 index 0000000000000..d37eea2fae9f4 --- /dev/null +++ b/x-pack/plugins/search_assistant/public/components/nav_control/lazy_nav_control.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { dynamic } from '@kbn/shared-ux-utility'; +import React from 'react'; +import { CoreStart } from '@kbn/core-lifecycle-browser'; +import { AIAssistantAppService } from '@kbn/ai-assistant'; +import { AIAssistantPluginStartDependencies } from '@kbn/ai-assistant/src/types'; + +const LazyNavControlWithProvider = dynamic(() => + import('.').then((m) => ({ default: m.NavControlWithProvider })) +); + +interface NavControlInitiatorProps { + appService: AIAssistantAppService; + coreStart: CoreStart; + pluginsStart: AIAssistantPluginStartDependencies; +} + +export const NavControlInitiator = ({ coreStart, pluginsStart }: NavControlInitiatorProps) => { + return ; +}; diff --git a/x-pack/plugins/search_assistant/public/components/routes/conversations/conversation_view_with_props.tsx b/x-pack/plugins/search_assistant/public/components/routes/conversations/conversation_view_with_props.tsx deleted file mode 100644 index 28ed6d00863f3..0000000000000 --- a/x-pack/plugins/search_assistant/public/components/routes/conversations/conversation_view_with_props.tsx +++ /dev/null @@ -1,36 +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 React from 'react'; -import { ConversationView } from '@kbn/ai-assistant'; -import { useParams } from 'react-router-dom'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; - -export function ConversationViewWithProps() { - const { conversationId } = useParams<{ conversationId?: string }>(); - const { - services: { application, http }, - } = useKibana(); - function navigateToConversation(nextConversationId?: string) { - application?.navigateToUrl( - http?.basePath.prepend(`/app/searchAssistant/conversations/${nextConversationId || ''}`) || '' - ); - } - return ( - - http?.basePath.prepend(`/app/searchAssistant/conversations/${id || ''}`) || '' - } - scopes={['search']} - /> - ); -} diff --git a/x-pack/plugins/search_assistant/public/components/routes/router.tsx b/x-pack/plugins/search_assistant/public/components/routes/router.tsx deleted file mode 100644 index 154bc2ab46a3e..0000000000000 --- a/x-pack/plugins/search_assistant/public/components/routes/router.tsx +++ /dev/null @@ -1,32 +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 React from 'react'; -import { History } from 'history'; -import { Route, Router, Routes } from '@kbn/shared-ux-router'; -import { Redirect } from 'react-router-dom'; -import { SearchAIAssistantPageTemplate } from '../page_template'; -import { ConversationViewWithProps } from './conversations/conversation_view_with_props'; - -export const SearchAssistantRouter: React.FC<{ history: History }> = ({ history }) => { - return ( - - - - - - - - - - - - - - - ); -}; diff --git a/x-pack/plugins/search_assistant/public/plugin.ts b/x-pack/plugins/search_assistant/public/plugin.tsx similarity index 51% rename from x-pack/plugins/search_assistant/public/plugin.ts rename to x-pack/plugins/search_assistant/public/plugin.tsx index 1c09502c154ad..15c1443045cdc 100644 --- a/x-pack/plugins/search_assistant/public/plugin.ts +++ b/x-pack/plugins/search_assistant/public/plugin.tsx @@ -5,20 +5,16 @@ * 2.0. */ -import { - DEFAULT_APP_CATEGORIES, - type CoreSetup, - type Plugin, - CoreStart, - AppMountParameters, - PluginInitializerContext, -} from '@kbn/core/public'; -import { i18n } from '@kbn/i18n'; +import { type CoreSetup, type Plugin, CoreStart, PluginInitializerContext } from '@kbn/core/public'; +import { createAppService } from '@kbn/ai-assistant'; +import ReactDOM from 'react-dom'; +import React from 'react'; import type { SearchAssistantPluginSetup, SearchAssistantPluginStart, SearchAssistantPluginStartDependencies, } from './types'; +import { NavControlInitiator } from './components/nav_control/lazy_nav_control'; export interface PublicConfigType { ui: { @@ -44,36 +40,43 @@ export class SearchAssistantPlugin public setup( core: CoreSetup ): SearchAssistantPluginSetup { + return {}; + } + + public start( + coreStart: CoreStart, + pluginsStart: SearchAssistantPluginStartDependencies + ): SearchAssistantPluginStart { if (!this.config.ui.enabled) { return {}; } + const appService = createAppService({ + pluginsStart, + }); + const isEnabled = appService.isEnabled(); - core.application.register({ - id: 'searchAssistant', - title: i18n.translate('xpack.searchAssistant.appTitle', { - defaultMessage: 'Search Assistant', - }), - euiIconType: 'logoEnterpriseSearch', - appRoute: '/app/searchAssistant', - category: DEFAULT_APP_CATEGORIES.search, - visibleIn: [], - deepLinks: [], - mount: async (appMountParameters: AppMountParameters) => { - // Load application bundle and Get start services - const [{ renderApp }, [coreStart, pluginsStart]] = await Promise.all([ - import('./application'), - core.getStartServices() as Promise< - [CoreStart, SearchAssistantPluginStartDependencies, unknown] - >, - ]); + if (!isEnabled) { + return {}; + } + + coreStart.chrome.navControls.registerRight({ + mount: (element) => { + ReactDOM.render( + , + element, + () => {} + ); - return renderApp(coreStart, pluginsStart, appMountParameters); + return () => {}; }, + // right before the user profile + order: 1001, }); - return {}; - } - public start(): SearchAssistantPluginStart { return {}; } diff --git a/x-pack/plugins/search_assistant/public/types.ts b/x-pack/plugins/search_assistant/public/types.ts index b1a5d6164b1f1..5b70941d2bf0c 100644 --- a/x-pack/plugins/search_assistant/public/types.ts +++ b/x-pack/plugins/search_assistant/public/types.ts @@ -7,6 +7,10 @@ import { UsageCollectionStart } from '@kbn/usage-collection-plugin/public'; import { ObservabilityAIAssistantPublicStart } from '@kbn/observability-ai-assistant-plugin/public'; +import { LicensingPluginStart } from '@kbn/licensing-plugin/public'; +import { MlPluginStart } from '@kbn/ml-plugin/public'; +import { SharePluginStart } from '@kbn/share-plugin/public'; +import { TriggersAndActionsUIPublicPluginStart } from '@kbn/triggers-actions-ui-plugin/public'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface SearchAssistantPluginSetup {} @@ -15,6 +19,10 @@ export interface SearchAssistantPluginSetup {} export interface SearchAssistantPluginStart {} export interface SearchAssistantPluginStartDependencies { + licensing: LicensingPluginStart; + ml: MlPluginStart; observabilityAIAssistant: ObservabilityAIAssistantPublicStart; + share: SharePluginStart; + triggersActionsUi: TriggersAndActionsUIPublicPluginStart; usageCollection?: UsageCollectionStart; } diff --git a/x-pack/plugins/search_assistant/tsconfig.json b/x-pack/plugins/search_assistant/tsconfig.json index b95020aca1dfc..30002038bbc2d 100644 --- a/x-pack/plugins/search_assistant/tsconfig.json +++ b/x-pack/plugins/search_assistant/tsconfig.json @@ -13,17 +13,22 @@ ], "kbn_references": [ "@kbn/core", - "@kbn/react-kibana-context-render", "@kbn/kibana-react-plugin", - "@kbn/i18n-react", "@kbn/shared-ux-page-kibana-template", "@kbn/usage-collection-plugin", "@kbn/observability-ai-assistant-plugin", "@kbn/config-schema", "@kbn/ai-assistant", "@kbn/i18n", - "@kbn/shared-ux-router", - "@kbn/serverless" + "@kbn/serverless", + "@kbn/react-kibana-context-theme", + "@kbn/shared-ux-link-redirect-app", + "@kbn/shared-ux-utility", + "@kbn/core-lifecycle-browser", + "@kbn/licensing-plugin", + "@kbn/ml-plugin", + "@kbn/share-plugin", + "@kbn/triggers-actions-ui-plugin" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/search_inference_endpoints/kibana.jsonc b/x-pack/plugins/search_inference_endpoints/kibana.jsonc index e7ba67795f7bf..ce49397901748 100644 --- a/x-pack/plugins/search_inference_endpoints/kibana.jsonc +++ b/x-pack/plugins/search_inference_endpoints/kibana.jsonc @@ -13,12 +13,12 @@ "requiredPlugins": [ "actions", "features", + "ml", "share", ], "optionalPlugins": [ "cloud", "console", - "ml" ], "requiredBundles": [ "kibanaReact" diff --git a/x-pack/test/observability_ai_assistant_api_integration/tests/knowledge_base/knowledge_base_status.spec.ts b/x-pack/test/observability_ai_assistant_api_integration/tests/knowledge_base/knowledge_base_status.spec.ts index 62d2ab7cae785..4e9778630a535 100644 --- a/x-pack/test/observability_ai_assistant_api_integration/tests/knowledge_base/knowledge_base_status.spec.ts +++ b/x-pack/test/observability_ai_assistant_api_integration/tests/knowledge_base/knowledge_base_status.spec.ts @@ -49,6 +49,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(res.body).to.eql({ ready: false, model_name: TINY_ELSER.id, + enabled: true, }); }); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_status.spec.ts b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_status.spec.ts index 60e02152fd4ac..60e7c743bbbbb 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_status.spec.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/ai_assistant/tests/knowledge_base/knowledge_base_status.spec.ts @@ -69,6 +69,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { expect(res.body).to.eql({ ready: false, model_name: TINY_ELSER.id, + enabled: true, }); }); }); diff --git a/x-pack/test_serverless/functional/page_objects/svl_search_homepage.ts b/x-pack/test_serverless/functional/page_objects/svl_search_homepage.ts index 44bdd417330a3..0da7003e7b8dd 100644 --- a/x-pack/test_serverless/functional/page_objects/svl_search_homepage.ts +++ b/x-pack/test_serverless/functional/page_objects/svl_search_homepage.ts @@ -64,5 +64,8 @@ export function SvlSearchHomePageProvider({ getService }: FtrProviderContext) { keyName ); }, + async expectAIAssistantToExist() { + await testSubjects.existOrFail('AiAssistantAppNavControlButton'); + }, }; } diff --git a/x-pack/test_serverless/functional/test_suites/search/search_homepage.ts b/x-pack/test_serverless/functional/test_suites/search/search_homepage.ts index 036751ef970da..195790e1b0faf 100644 --- a/x-pack/test_serverless/functional/test_suites/search/search_homepage.ts +++ b/x-pack/test_serverless/functional/test_suites/search/search_homepage.ts @@ -84,5 +84,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await pageObjects.svlSearchHomePage.createApiKeyInFlyout('ftr-test-key'); await pageObjects.svlSearchHomePage.closeConnectionDetailsFlyout(); }); + + it('shows the AI assistant', async () => { + await pageObjects.svlSearchHomePage.expectAIAssistantToExist(); + }); }); } From 6ef03697460aba0d3774c0c03fb7fb58c76c00bd Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Fri, 25 Oct 2024 12:18:24 +0200 Subject: [PATCH 018/135] [ML] AIOps: Fix and reenable functional tests for log rate analysis (#197760) ## Summary Follow up to #189863 and #196585. Related to #176387. This updates asserting the url state for log rate analysis with a query and reenables the functional tests. ### 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 - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#_add_your_labels) --- .../apps/aiops/log_rate_analysis.ts | 3 +- ...arequote_data_view_test_data_with_query.ts | 206 +++++++++--------- 2 files changed, 107 insertions(+), 102 deletions(-) diff --git a/x-pack/test/functional/apps/aiops/log_rate_analysis.ts b/x-pack/test/functional/apps/aiops/log_rate_analysis.ts index 452ba8fad99cb..d6acad691b195 100644 --- a/x-pack/test/functional/apps/aiops/log_rate_analysis.ts +++ b/x-pack/test/functional/apps/aiops/log_rate_analysis.ts @@ -315,8 +315,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); } - // Failing: See https://github.com/elastic/kibana/issues/176387 - describe.skip('log rate analysis', function () { + describe('log rate analysis', function () { for (const testData of logRateAnalysisTestData) { describe(`with '${testData.sourceIndexOrSavedSearch}'`, function () { before(async () => { diff --git a/x-pack/test/functional/apps/aiops/log_rate_analysis/test_data/farequote_data_view_test_data_with_query.ts b/x-pack/test/functional/apps/aiops/log_rate_analysis/test_data/farequote_data_view_test_data_with_query.ts index 31cfcda6924f8..e5a8b4783d7bb 100644 --- a/x-pack/test/functional/apps/aiops/log_rate_analysis/test_data/farequote_data_view_test_data_with_query.ts +++ b/x-pack/test/functional/apps/aiops/log_rate_analysis/test_data/farequote_data_view_test_data_with_query.ts @@ -64,128 +64,134 @@ export const farequoteDataViewTestDataWithQuery: TestData = { filters: [], searchQuery: { bool: { - filter: [], - must_not: [ + filter: [ { bool: { - minimum_should_match: 1, - should: [ - { - bool: { - minimum_should_match: 1, - should: [ - { - term: { - airline: { - value: 'SWR', + must_not: { + bool: { + minimum_should_match: 1, + should: [ + { + bool: { + minimum_should_match: 1, + should: [ + { + term: { + airline: { + value: 'SWR', + }, + }, }, - }, + ], }, - ], - }, - }, - { - bool: { - minimum_should_match: 1, - should: [ - { - term: { - airline: { - value: 'ACA', + }, + { + bool: { + minimum_should_match: 1, + should: [ + { + term: { + airline: { + value: 'ACA', + }, + }, }, - }, + ], }, - ], - }, - }, - { - bool: { - minimum_should_match: 1, - should: [ - { - term: { - airline: { - value: 'AWE', + }, + { + bool: { + minimum_should_match: 1, + should: [ + { + term: { + airline: { + value: 'AWE', + }, + }, }, - }, + ], }, - ], - }, - }, - { - bool: { - minimum_should_match: 1, - should: [ - { - term: { - airline: { - value: 'BAW', + }, + { + bool: { + minimum_should_match: 1, + should: [ + { + term: { + airline: { + value: 'BAW', + }, + }, }, - }, + ], }, - ], - }, - }, - { - bool: { - minimum_should_match: 1, - should: [ - { - term: { - airline: { - value: 'JAL', + }, + { + bool: { + minimum_should_match: 1, + should: [ + { + term: { + airline: { + value: 'JAL', + }, + }, }, - }, + ], }, - ], - }, - }, - { - bool: { - minimum_should_match: 1, - should: [ - { - term: { - airline: { - value: 'JBU', + }, + { + bool: { + minimum_should_match: 1, + should: [ + { + term: { + airline: { + value: 'JBU', + }, + }, }, - }, + ], }, - ], - }, - }, - { - bool: { - minimum_should_match: 1, - should: [ - { - term: { - airline: { - value: 'JZA', + }, + { + bool: { + minimum_should_match: 1, + should: [ + { + term: { + airline: { + value: 'JZA', + }, + }, }, - }, + ], }, - ], - }, - }, - { - bool: { - minimum_should_match: 1, - should: [ - { - term: { - airline: { - value: 'KLM', + }, + { + bool: { + minimum_should_match: 1, + should: [ + { + term: { + airline: { + value: 'KLM', + }, + }, }, - }, + ], }, - ], - }, + }, + ], }, - ], + }, }, }, ], + must: [], + must_not: [], + should: [], }, }, searchQueryLanguage: 'kuery', From d3569f609acd3a6f1f012bbf684d5bea9e3f1424 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Fri, 25 Oct 2024 13:11:14 +0200 Subject: [PATCH 019/135] [OAS] Fix handling of `schema.nullable` to path and query params (#197046) ## Summary Fixes handling of `schema.nullable(schema.object({..}))` to params and query inputs. [Example in the wild](https://github.com/jloleysens/kibana/blob/83e76cb4d854a3c3f9ffdaad8c6ee29d66d56710/x-pack/plugins/reporting/server/routes/common/generate/request_handler.ts#L33). ### 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 --- .../kbn_config_schema/lib.test.ts | 44 +++++++++++++++++++ .../oas_converter/kbn_config_schema/lib.ts | 15 +++++-- 2 files changed, 56 insertions(+), 3 deletions(-) diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.test.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.test.ts index 4c9bc8080d034..ce2e84c2fcca1 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.test.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.test.ts @@ -147,6 +147,30 @@ describe('convertPathParameters', () => { convertPathParameters(schema.object({ b: schema.string() }), { a: { optional: false } }) ).toThrow(/Unknown parameter: b/); }); + + test('converting paths with nullables', () => { + expect( + convertPathParameters(schema.nullable(schema.object({ a: schema.string() })), { + a: { optional: true }, + }) + ).toEqual({ + params: [ + { + in: 'path', + name: 'a', + required: false, + schema: { + type: 'string', + }, + }, + ], + shared: {}, + }); + }); + + test('throws if properties cannot be exracted', () => { + expect(() => convertPathParameters(schema.string(), {})).toThrow(/expected to be an object/); + }); }); describe('convertQuery', () => { @@ -166,10 +190,30 @@ describe('convertQuery', () => { }); }); + test('converting queries with nullables', () => { + expect(convertQuery(schema.nullable(schema.object({ a: schema.string() })))).toEqual({ + query: [ + { + in: 'query', + name: 'a', + required: false, + schema: { + type: 'string', + }, + }, + ], + shared: {}, + }); + }); + test('conversion with refs is disallowed', () => { const sharedSchema = schema.object({ a: schema.string() }, { meta: { id: 'myparams' } }); expect(() => convertQuery(sharedSchema)).toThrow(/myparams.*not supported/); }); + + test('throws if properties cannot be exracted', () => { + expect(() => convertPathParameters(schema.string(), {})).toThrow(/expected to be an object/); + }); }); describe('is', () => { diff --git a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.ts b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.ts index 4e591fc843bf7..f088e73597b37 100644 --- a/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.ts +++ b/packages/kbn-router-to-openapispec/src/oas_converter/kbn_config_schema/lib.ts @@ -88,12 +88,17 @@ const convertObjectMembersToParameterObjects = ( knownParameters: KnownParameters = {}, isPathParameter = false ) => { - let properties: Exclude; + let properties: OpenAPIV3.SchemaObject['properties']; const required = new Map(); if (isNullableObjectType(schema)) { const { result } = parse({ schema, ctx }); - const anyOf = (result as OpenAPIV3.SchemaObject).anyOf as OpenAPIV3.SchemaObject[]; - properties = anyOf.find((s) => s.type === 'object')!.properties!; + if (result.anyOf) { + properties = result.anyOf.find( + (s): s is OpenAPIV3.SchemaObject => !isReferenceObject(s) && s.type === 'object' + )?.properties; + } else if (result.type === 'object') { + properties = result.properties; + } } else if (isObjectType(schema)) { const { result } = parse({ schema, ctx }); if ('$ref' in result) @@ -108,6 +113,10 @@ const convertObjectMembersToParameterObjects = ( throw createError(`Expected record, object or nullable object type, but got '${schema.type}'`); } + if (!properties) { + throw createError(`Could not extract properties from ${schema.describe()}`); + } + return Object.entries(properties).map(([schemaKey, schemaObject]) => { const paramSchema = getParamSchema(knownParameters, schemaKey); if (!paramSchema && isPathParameter) { From 81b63c60eb6d1fe623f2e177cd55d2f285f79590 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Fri, 25 Oct 2024 07:12:44 -0400 Subject: [PATCH 020/135] Improve error logs for task manager poller (#197635) I noticed some scenarios we see error logs from the task poller like `Failed to poll for work: undefined` making me think `err.message` is empty in some situations. I'm modifying the code to handle string situations if ever they occur by performing `err.message || err` and to also include a stack trace when strings are passed-in. --------- Co-authored-by: Patrick Mueller --- .../server/polling/task_poller.test.ts | 31 +++++++++++++++++++ .../server/polling/task_poller.ts | 9 +++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/task_manager/server/polling/task_poller.test.ts b/x-pack/plugins/task_manager/server/polling/task_poller.test.ts index e902b45d3ff04..d7f9a467a525d 100644 --- a/x-pack/plugins/task_manager/server/polling/task_poller.test.ts +++ b/x-pack/plugins/task_manager/server/polling/task_poller.test.ts @@ -266,6 +266,37 @@ describe('TaskPoller', () => { expect(handler.mock.calls[0][0].error.stack).toContain(workError.stack); }); + test('still logs errors when they are thrown as strings', async () => { + const pollInterval = 100; + + const handler = jest.fn(); + const workError = 'failed to work'; + const poller = createTaskPoller({ + initialPollInterval: pollInterval, + logger: loggingSystemMock.create().get(), + pollInterval$: of(pollInterval), + pollIntervalDelay$: of(0), + work: async (...args) => { + throw workError; + }, + getCapacity: () => 5, + }); + poller.events$.subscribe(handler); + poller.start(); + + clock.tick(pollInterval); + await new Promise((resolve) => setImmediate(resolve)); + + const expectedError = new PollingError( + 'Failed to poll for work: failed to work', + PollingErrorType.WorkError, + none + ); + expect(handler).toHaveBeenCalledWith(asErr(expectedError)); + expect(handler.mock.calls[0][0].error.type).toEqual(PollingErrorType.WorkError); + expect(handler.mock.calls[0][0].error.stack).toBeDefined(); + }); + test('continues polling after work fails', async () => { const pollInterval = 100; diff --git a/x-pack/plugins/task_manager/server/polling/task_poller.ts b/x-pack/plugins/task_manager/server/polling/task_poller.ts index d61f417d40805..cdf4a41b5587c 100644 --- a/x-pack/plugins/task_manager/server/polling/task_poller.ts +++ b/x-pack/plugins/task_manager/server/polling/task_poller.ts @@ -151,7 +151,14 @@ export enum PollingErrorType { } function asPollingError(err: Error, type: PollingErrorType, data: Option = none) { - return asErr(new PollingError(`Failed to poll for work: ${err.message}`, type, data, err)); + return asErr( + new PollingError( + `Failed to poll for work: ${err.message || err}`, + type, + data, + err instanceof Error ? err : new Error(`${err}`) + ) + ); } export class PollingError extends Error { From 7732b8d91d799f00e35b90787283b652f189783b Mon Sep 17 00:00:00 2001 From: Jeramy Soucy Date: Fri, 25 Oct 2024 13:32:04 +0200 Subject: [PATCH 021/135] =?UTF-8?q?Upgrade=20@elastic/node-crypto=201.2.1?= =?UTF-8?q?=20=E2=86=92=201.2.3=20(#197629)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Upgrades `@elastic/node-crypto` from v1.2.1 to v1.2.3, upgrades `@elastic/request-crypto` from v2.0.2 to v2.0.3 --- package.json | 4 ++-- yarn.lock | 23 +++++++++-------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 33920d0c298ae..80ad0fd11c7ec 100644 --- a/package.json +++ b/package.json @@ -120,12 +120,12 @@ "@elastic/ems-client": "8.5.3", "@elastic/eui": "97.2.0", "@elastic/filesaver": "1.1.2", - "@elastic/node-crypto": "1.2.1", + "@elastic/node-crypto": "^1.2.3", "@elastic/numeral": "^2.5.1", "@elastic/react-search-ui": "^1.20.2", "@elastic/react-search-ui-views": "^1.20.2", "@elastic/request-converter": "^8.15.4", - "@elastic/request-crypto": "2.0.2", + "@elastic/request-crypto": "^2.0.3", "@elastic/search-ui": "^1.20.2", "@elastic/search-ui-app-search-connector": "^1.20.2", "@elastic/search-ui-engines-connector": "^1.20.2", diff --git a/yarn.lock b/yarn.lock index b2deed2bbd7a5..7f7b152c89c03 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1805,15 +1805,10 @@ progress "^1.1.8" through2 "^2.0.0" -"@elastic/node-crypto@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@elastic/node-crypto/-/node-crypto-1.1.1.tgz#619b70322c9cce4a7ee5fbf8f678b1baa7f06095" - integrity sha512-F6tIk8Txdqjg8Siv60iAvXzO9ZdQI87K3sS/fh5xd2XaWK+T5ZfqeTvsT7srwG6fr6uCBfuQEJV1KBBl+JpLZA== - -"@elastic/node-crypto@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@elastic/node-crypto/-/node-crypto-1.2.1.tgz#dfd9218f9b5729fa519762e6a6968aaf61b86eb0" - integrity sha512-RlZg+poLA2SwZZUM5RMJDJiKojlSB1mJkumIvLgXvvTCcCliC6rM0lUaNecV9pbQLIHrGlX2BrbwiuPWhv0czQ== +"@elastic/node-crypto@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@elastic/node-crypto/-/node-crypto-1.2.3.tgz#7ebd71964ea09cf085c713c1a6edfc2dfac08b29" + integrity sha512-S9L6jb0rx7M8WJd6m4EzgRJp/U7Wb1bq2x9GDh7DRcCD6MoNN1/wyYoPGxPrF3XgOsixmO1tcy70qUyw1b+OkA== "@elastic/numeral@^2.5.1": version "2.5.1" @@ -1849,12 +1844,12 @@ handlebars "^4.7.8" prettier "^2.8.8" -"@elastic/request-crypto@2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@elastic/request-crypto/-/request-crypto-2.0.2.tgz#4e5216783be82371012857a76da75195828d3f45" - integrity sha512-DdTMs4ZZKo9Hl6XNHmR8eOuooImpvQp/+4Wzkzw1VdSR+bBsDa8TT6UrIuCgl5n6WI/WujjTneLTKmtSYm+HpA== +"@elastic/request-crypto@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@elastic/request-crypto/-/request-crypto-2.0.3.tgz#7fc070be900503473c6f7c6787df23d789e18169" + integrity sha512-B874XQbnhWRCabDM4Si9haiUnUHvfcZdtfjKsCQ89uQCvudtaaiKzyK8e+k7bPiiGRflxoPqgSBXnS4n/E9Trw== dependencies: - "@elastic/node-crypto" "1.1.1" + "@elastic/node-crypto" "^1.2.3" "@types/node-jose" "1.1.10" node-jose "2.2.0" From 479280c0b74747056634421c9b9e05f94a3c7e07 Mon Sep 17 00:00:00 2001 From: Robert Jaszczurek <92210485+rbrtj@users.noreply.github.com> Date: Fri, 25 Oct 2024 13:39:38 +0200 Subject: [PATCH 022/135] [ML] Memory usage: Functional tests (#197415) ## Summary Functional tests for `memory usage` page in ML. --- .buildkite/ftr_platform_stateful_configs.yml | 1 + .../memory_usage/memory_tree_map/tree_map.tsx | 2 +- .../memory_usage/memory_usage_page.tsx | 4 +- .../nodes_overview/expanded_row.tsx | 6 +- .../nodes_overview/nodes_list.tsx | 1 + .../routing/routes/memory_usage.tsx | 1 + .../functional/apps/ml/memory_usage/config.ts | 20 ++++ .../functional/apps/ml/memory_usage/index.ts | 33 ++++++ .../apps/ml/memory_usage/memory_usage_page.ts | 72 ++++++++++++ x-pack/test/functional/services/ml/index.ts | 5 +- .../functional/services/ml/memory_usage.ts | 107 ++++++++++++++++++ .../test/functional/services/ml/navigation.ts | 4 + 12 files changed, 251 insertions(+), 5 deletions(-) create mode 100644 x-pack/test/functional/apps/ml/memory_usage/config.ts create mode 100644 x-pack/test/functional/apps/ml/memory_usage/index.ts create mode 100644 x-pack/test/functional/apps/ml/memory_usage/memory_usage_page.ts create mode 100644 x-pack/test/functional/services/ml/memory_usage.ts diff --git a/.buildkite/ftr_platform_stateful_configs.yml b/.buildkite/ftr_platform_stateful_configs.yml index 244f04257ef92..8fb7807711d7d 100644 --- a/.buildkite/ftr_platform_stateful_configs.yml +++ b/.buildkite/ftr_platform_stateful_configs.yml @@ -249,6 +249,7 @@ enabled: - x-pack/test/functional/apps/ml/permissions/config.ts - x-pack/test/functional/apps/ml/short_tests/config.ts - x-pack/test/functional/apps/ml/stack_management_jobs/config.ts + - x-pack/test/functional/apps/ml/memory_usage/config.ts - x-pack/test/functional/apps/monitoring/config.ts - x-pack/test/functional/apps/painless_lab/config.ts - x-pack/test/functional/apps/remote_clusters/config.ts diff --git a/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx b/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx index c3c92fecb2811..d9e4c0e25f78d 100644 --- a/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx +++ b/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx @@ -161,7 +161,7 @@ export const JobMemoryTreeMap: FC = ({ node, type, height }) => { options={typeOptions} selectedOptions={selectedOptions ?? []} onChange={setSelectedOptions} - isClearable={false} + data-test-subj="mlJobTreeMapComboBox" /> diff --git a/x-pack/plugins/ml/public/application/memory_usage/memory_usage_page.tsx b/x-pack/plugins/ml/public/application/memory_usage/memory_usage_page.tsx index b0def27254f33..3e445fafbf67c 100644 --- a/x-pack/plugins/ml/public/application/memory_usage/memory_usage_page.tsx +++ b/x-pack/plugins/ml/public/application/memory_usage/memory_usage_page.tsx @@ -50,16 +50,18 @@ export const MemoryUsagePage: FC = () => { {showNodeInfo ? ( <> - + setSelectedTab(TAB.NODES)} + data-test-subj="mlMemoryUsageTab-nodes" > setSelectedTab(TAB.MEMORY_USAGE)} + data-test-subj="mlMemoryUsageTab-memory-usage" > diff --git a/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/expanded_row.tsx b/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/expanded_row.tsx index f197ebc08825d..6df9f42652455 100644 --- a/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/expanded_row.tsx +++ b/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/expanded_row.tsx @@ -64,6 +64,7 @@ export const ExpandedRow: FC = ({ item }) => { setSelectedTab(TAB.DETAILS)} + data-test-subj="mlNodesOverviewPanelDetailsTab" > = ({ item }) => { setSelectedTab(TAB.MEMORY_USAGE)} + data-test-subj="mlNodesOverviewPanelMemoryTab" > = ({ item }) => { <> - +
@@ -104,7 +106,7 @@ export const ExpandedRow: FC = ({ item }) => { - +
diff --git a/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/nodes_list.tsx b/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/nodes_list.tsx index d31981decb7e9..b9893f92c83b4 100644 --- a/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/nodes_list.tsx +++ b/x-pack/plugins/ml/public/application/memory_usage/nodes_overview/nodes_list.tsx @@ -185,6 +185,7 @@ export const NodesList: FC = ({ compactView = false }) => { }, box: { incremental: true, + 'data-test-subj': 'mlNodesTableSearchInput', }, }; diff --git a/x-pack/plugins/ml/public/application/routing/routes/memory_usage.tsx b/x-pack/plugins/ml/public/application/routing/routes/memory_usage.tsx index 527e870557c68..e9d5c092311f8 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/memory_usage.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/memory_usage.tsx @@ -39,6 +39,7 @@ export const nodesListRouteFactory = ( }, ], enableDatePicker: true, + 'data-test-subj': 'mlPageMemoryUsage', }); const PageWrapper: FC = () => { diff --git a/x-pack/test/functional/apps/ml/memory_usage/config.ts b/x-pack/test/functional/apps/ml/memory_usage/config.ts new file mode 100644 index 0000000000000..b646701328723 --- /dev/null +++ b/x-pack/test/functional/apps/ml/memory_usage/config.ts @@ -0,0 +1,20 @@ +/* + * 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 { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile(require.resolve('../../../config.base.js')); + + return { + ...functionalConfig.getAll(), + testFiles: [require.resolve('.')], + junit: { + reportName: 'Chrome X-Pack UI Functional Tests - ML memory_usage', + }, + }; +} diff --git a/x-pack/test/functional/apps/ml/memory_usage/index.ts b/x-pack/test/functional/apps/ml/memory_usage/index.ts new file mode 100644 index 0000000000000..e0d8096952702 --- /dev/null +++ b/x-pack/test/functional/apps/ml/memory_usage/index.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'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const ml = getService('ml'); + + describe('machine learning - overview page', function () { + this.tags(['skipFirefox']); + + before(async () => { + await ml.securityCommon.createMlRoles(); + await ml.securityCommon.createMlUsers(); + await ml.securityUI.loginAsMlPowerUser(); + }); + + after(async () => { + await ml.securityUI.logout(); + + await ml.securityCommon.cleanMlUsers(); + await ml.securityCommon.cleanMlRoles(); + + await ml.testResources.resetKibanaTimeZone(); + }); + + loadTestFile(require.resolve('./memory_usage_page')); + }); +} diff --git a/x-pack/test/functional/apps/ml/memory_usage/memory_usage_page.ts b/x-pack/test/functional/apps/ml/memory_usage/memory_usage_page.ts new file mode 100644 index 0000000000000..319d54c78d541 --- /dev/null +++ b/x-pack/test/functional/apps/ml/memory_usage/memory_usage_page.ts @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService }: FtrProviderContext) { + const ml = getService('ml'); + const esArchiver = getService('esArchiver'); + + const jobId = 'sample_job'; + + describe('ML memory usage page', function () { + this.tags(['ml']); + + before(async () => { + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); + + const jobConfig = ml.commonConfig.getADFqSingleMetricJobConfig(jobId); + + // Create and open AD job + await ml.api.createAnomalyDetectionJob(jobConfig); + await ml.api.openAnomalyDetectionJob(jobId); + + await ml.navigation.navigateToMl(); + await ml.navigation.navigateToMemoryUsage(); + }); + + after(async () => { + await ml.api.closeAnomalyDetectionJob(jobId); + await ml.api.cleanMlIndices(); + }); + + it('opens page with nodes tab selected', async () => { + await ml.memoryUsage.assertMemoryUsageTabIsSelected('nodes'); + }); + + it('allows sorting', async () => { + await ml.memoryUsage.sortColumn('tableHeaderCell_name_1'); + await ml.memoryUsage.assertColumnIsSorted('tableHeaderCell_name_1', 'descending'); + }); + + it('allows searching for a node', async () => { + await ml.memoryUsage.searchForNode('ftr'); + await ml.memoryUsage.assertRowCount(1); + }); + + it('expands node details and displays memory usage details', async () => { + await ml.memoryUsage.expandRow(); + await ml.memoryUsage.assertNodeExpandedDetailsPanelsExist(); + await ml.memoryUsage.selectNodeExpandedRowTab('mlNodesOverviewPanelMemoryTab'); + await ml.memoryUsage.assertChartItemsSelectedByDefault(); + await ml.memoryUsage.assertTreeChartExists(); + }); + + it('clears selected chart items', async () => { + await ml.memoryUsage.clearSelectedChartItems(); + await ml.memoryUsage.assertEmptyTreeChartExists(); + }); + + it('selects memory usage tab and displays chart', async () => { + await ml.memoryUsage.selectTab('memory-usage'); + await ml.memoryUsage.assertTreeChartExists(); + + await ml.memoryUsage.clearSelectedChartItems(); + await ml.memoryUsage.assertEmptyTreeChartExists(); + }); + }); +} diff --git a/x-pack/test/functional/services/ml/index.ts b/x-pack/test/functional/services/ml/index.ts index d62dfe921f69c..74834eaa0dba6 100644 --- a/x-pack/test/functional/services/ml/index.ts +++ b/x-pack/test/functional/services/ml/index.ts @@ -69,6 +69,8 @@ import { MlTableServiceProvider } from './common_table_service'; import { MachineLearningFieldStatsFlyoutProvider } from './field_stats_flyout'; import { MachineLearningDataDriftProvider } from './data_drift'; import { TrainedModelsFlyoutProvider } from './add_trained_models_flyout'; +import { MachineLearningMemoryUsageProvider } from './memory_usage'; + export function MachineLearningProvider(context: FtrProviderContext) { const commonAPI = MachineLearningCommonAPIProvider(context); const commonUI = MachineLearningCommonUIProvider(context); @@ -178,7 +180,7 @@ export function MachineLearningProvider(context: FtrProviderContext) { const deployDFAModelFlyout = DeployDFAModelFlyoutProvider(context, commonUI); const mlNodesPanel = MlNodesPanelProvider(context); const notifications = NotificationsProvider(context, commonUI, tableService); - + const memoryUsage = MachineLearningMemoryUsageProvider(context); const cases = MachineLearningCasesProvider(context, swimLane, anomalyCharts); return { @@ -244,5 +246,6 @@ export function MachineLearningProvider(context: FtrProviderContext) { trainedModelsFlyout, deployDFAModelFlyout, trainedModelsTable, + memoryUsage, }; } diff --git a/x-pack/test/functional/services/ml/memory_usage.ts b/x-pack/test/functional/services/ml/memory_usage.ts new file mode 100644 index 0000000000000..76d6259bc57d5 --- /dev/null +++ b/x-pack/test/functional/services/ml/memory_usage.ts @@ -0,0 +1,107 @@ +/* + * 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 { FtrProviderContext } from '../../ftr_provider_context'; + +export function MachineLearningMemoryUsageProvider({ getService }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const comboBox = getService('comboBox'); + + return { + async assertNodeExpandedDetailsPanelsExist() { + await testSubjects.existOrFail('mlNodesTableRowDetailsPanel'); + await testSubjects.existOrFail('mlNodesTableRowDetailsAttributesPanel'); + }, + + async assertTabIsSelected(tabName: string) { + await testSubjects.existOrFail(`mlNodesOverviewPanel ${tabName}Tab`); + }, + + async selectTab(tabName: string) { + await testSubjects.click(`mlMemoryUsageTab-${tabName}`); + }, + + async assertMemoryUsageTabsExist() { + await testSubjects.existOrFail('mlMemoryUsageTabs'); + }, + + async assertMemoryUsageTabIsSelected(tabName: string) { + const isSelected = await testSubjects.getAttribute( + `mlMemoryUsageTab-${tabName}`, + 'aria-selected' + ); + expect(isSelected).to.eql('true'); + }, + + async assertRowCount(expectedCount: number) { + const rowCount = await this.getRowCount(); + expect(rowCount).to.eql(expectedCount); + }, + + async getAllRows() { + return await testSubjects.findAll('~mlNodesTableRow'); + }, + + async expandRow() { + await testSubjects.click('mlNodesTableRowDetailsToggle'); + }, + + async getRowCount() { + const rows = await this.getAllRows(); + return rows.length; + }, + + async assertColumnHeaderExists(columnName: string) { + await testSubjects.existOrFail(columnName); + }, + + async assertColumnIsSorted(columnName: string, sortDirection: 'ascending' | 'descending') { + const sorted = await testSubjects.getAttribute(columnName, 'aria-sort'); + expect(sorted).to.eql(sortDirection); + }, + + async sortColumn(columnName: string) { + await this.assertColumnHeaderExists(columnName); + await testSubjects.click(columnName); + }, + + async assertSearchBarExists() { + await testSubjects.existOrFail('mlNodesTableSearchInput'); + }, + + async searchForNode(nodeId: string) { + await this.assertSearchBarExists(); + await testSubjects.setValue('mlNodesTableSearchInput', nodeId); + }, + + async selectNodeExpandedRowTab(tabName: string) { + await testSubjects.click(tabName); + }, + + async clearSelectedChartItems() { + await comboBox.clear('~mlJobTreeMap > mlJobTreeMapComboBox'); + }, + + async getSelectedChartItems() { + return await comboBox.getComboBoxSelectedOptions('~mlJobTreeMap > comboBoxInput'); + }, + + async assertChartItemsSelectedByDefault() { + const selectedOptions = await this.getSelectedChartItems(); + expect(selectedOptions.length).to.be.greaterThan(0); + }, + + async assertTreeChartExists() { + await testSubjects.existOrFail('mlJobTreeMap withData'); + }, + + async assertEmptyTreeChartExists() { + await testSubjects.existOrFail('mlJobTreeMap empty'); + }, + }; +} diff --git a/x-pack/test/functional/services/ml/navigation.ts b/x-pack/test/functional/services/ml/navigation.ts index b92ade51063d5..649042bffa6d9 100644 --- a/x-pack/test/functional/services/ml/navigation.ts +++ b/x-pack/test/functional/services/ml/navigation.ts @@ -154,6 +154,10 @@ export function MachineLearningNavigationProvider({ await this.navigateToArea('~mlMainTab & ~notifications', 'mlPageNotifications'); }, + async navigateToMemoryUsage() { + await this.navigateToArea('~mlMainTab & ~nodesOverview', 'mlPageMemoryUsage'); + }, + async navigateToAnomalyDetection() { await this.navigateToArea('~mlMainTab & ~anomalyDetection', 'mlPageJobManagement'); }, From a224f9e14bcfc94db669c7e73dc97fc923326e36 Mon Sep 17 00:00:00 2001 From: Yan Savitski Date: Fri, 25 Oct 2024 13:54:16 +0200 Subject: [PATCH 023/135] [Search] [Playground] Bug get text field for semantic field (#197345) - Fix [Object object] in retrieval documents when semantic text is used image --- .../utils/get_value_for_selected_field.test.ts | 13 +++++++++++++ .../server/utils/get_value_for_selected_field.ts | 6 ++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/search_playground/server/utils/get_value_for_selected_field.test.ts b/x-pack/plugins/search_playground/server/utils/get_value_for_selected_field.test.ts index cfdefc99f80ef..7eae929cc70c0 100644 --- a/x-pack/plugins/search_playground/server/utils/get_value_for_selected_field.test.ts +++ b/x-pack/plugins/search_playground/server/utils/get_value_for_selected_field.test.ts @@ -123,4 +123,17 @@ describe('getValueForSelectedField', () => { seeking consolation and, eventually, redemption through basic compassion" `); }); + + test('should return when path is semantic field', () => { + const hit = { + _index: 'sample-index', + _id: '8jSNY48B6iHEi98DL1C-', + _score: 0.7789394, + _source: { + test: { text: 'The Shawshank Redemption' }, + }, + }; + + expect(getValueForSelectedField(hit, 'test')).toEqual('The Shawshank Redemption'); + }); }); diff --git a/x-pack/plugins/search_playground/server/utils/get_value_for_selected_field.ts b/x-pack/plugins/search_playground/server/utils/get_value_for_selected_field.ts index 695c56a571374..5556e407de979 100644 --- a/x-pack/plugins/search_playground/server/utils/get_value_for_selected_field.ts +++ b/x-pack/plugins/search_playground/server/utils/get_value_for_selected_field.ts @@ -6,7 +6,7 @@ */ import { SearchHit } from '@elastic/elasticsearch/lib/api/types'; -import { get } from 'lodash'; +import { get, has } from 'lodash'; export const getValueForSelectedField = (hit: SearchHit, path: string): string => { if (!hit) { @@ -21,5 +21,7 @@ export const getValueForSelectedField = (hit: SearchHit, path: string): string = .join('\n --- \n'); } - return get(hit._source, path, ''); + return has(hit._source, `${path}.text`) + ? get(hit._source, `${path}.text`, '') + : get(hit._source, path, ''); }; From b6806267cfbd252526433f4db7829f18f7c3eff7 Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Fri, 25 Oct 2024 14:08:10 +0200 Subject: [PATCH 024/135] Code owners check - match files and directories (#197805) ## Summary This PR modifies the code owners check to allow "file" matches for "directory" entries. ### Details Taking the code owner entry `/x-pack/test_serverless/**/test_suites/**/ml/ @elastic/ml-ui` as an example. Note the trailing slash in the path, indicating a directory. Before this PR, if we asked the script for the code owner of `x-pack/test_serverless/functional/test_suites/security/ml`, it would not match, because this requested path doesn't have the trailing slash, thus asking for the file `ml` and not the directory. While this is technically correct, it's just too easy to overlook this detail and get a false negative as a result. This PR is removing trailing slashes from the code owners entries when adding them to the lookup table, so they now match both, directory and file requests (and requests for everything within the directory). So going back to the example, all these owner requests would be matched and return `@elastic/ml-ui` as the owner: * `x-pack/test_serverless/functional/test_suites/security/ml` * `x-pack/test_serverless/functional/test_suites/security/ml/` * `x-pack/test_serverless/functional/test_suites/security/ml/index.ts` --- packages/kbn-code-owners/src/file_code_owner.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/kbn-code-owners/src/file_code_owner.ts b/packages/kbn-code-owners/src/file_code_owner.ts index 525a2964c7338..1f98d50c4bacc 100644 --- a/packages/kbn-code-owners/src/file_code_owner.ts +++ b/packages/kbn-code-owners/src/file_code_owner.ts @@ -43,11 +43,12 @@ export function getPathsWithOwnersReversed(): PathWithOwners[] { const pathsWithOwners: PathWithOwners[] = codeowners.map((c) => { const [path, ...ghTeams] = c.split(/\s+/); + const cleanedPath = path.replace(/\/$/, ''); // remove trailing slash return { - path, + path: cleanedPath, teams: ghTeams.map((t) => t.replace('@', '')).join(), // register CODEOWNERS entries with the `ignores` lib for later path matching - ignorePattern: ignore().add([path]), + ignorePattern: ignore().add([cleanedPath]), }; }); From 4798c59158f2bd7dc09bfd07c8ab69bcfb23c0b8 Mon Sep 17 00:00:00 2001 From: Irene Blanco Date: Fri, 25 Oct 2024 14:27:55 +0200 Subject: [PATCH 025/135] [APM] Update onboarding link to use locator with "application" as category parameter (#197780) ## Summary Closes https://github.com/elastic/kibana/issues/197590. This PR addresses an issue with the onboarding link used by the `addApmData` constant, where the "Application" option fails to preselect. The issue is caused by the URL being incorrectly formed, with the category parameter set to `apm` instead of `application`. To resolve this, the PR introduces two main changes: - Update to use the correct locator - Modify the category parameter to use `application` instead of `apm` |Before|After| |-|-| |![before](https://github.com/user-attachments/assets/650066b8-85a8-4ff4-a7eb-fef46708ea9d)|![after](https://github.com/user-attachments/assets/508bb258-e2c2-4057-9242-653864548e4a)| --- .../app/service_tab_empty_state/constants.ts | 13 +++-- .../app/service_tab_empty_state/index.tsx | 8 +-- .../add_data_context_menu.tsx | 47 ++++++++++------ .../shared/add_data_buttons/buttons.tsx | 55 +++++++++++++------ .../apm/public/locator/onboarding_locator.ts | 16 ++++++ 5 files changed, 95 insertions(+), 44 deletions(-) create mode 100644 x-pack/plugins/observability_solution/apm/public/locator/onboarding_locator.ts diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/service_tab_empty_state/constants.ts b/x-pack/plugins/observability_solution/apm/public/components/app/service_tab_empty_state/constants.ts index 312ed042bb8de..4fa7c09f2c219 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/service_tab_empty_state/constants.ts +++ b/x-pack/plugins/observability_solution/apm/public/components/app/service_tab_empty_state/constants.ts @@ -5,10 +5,13 @@ * 2.0. */ -import type { ObservabilityOnboardingLocatorParams } from '@kbn/deeplinks-observability'; import { i18n } from '@kbn/i18n'; import type { AddDataPanelProps } from '@kbn/observability-shared-plugin/public'; import type { LocatorPublic } from '@kbn/share-plugin/common'; +import { + ApmOnboardingLocatorCategory, + ApmOnboardingLocatorParams, +} from '../../../locator/onboarding_locator'; export type AddAPMCalloutKeys = | 'serviceOverview' @@ -19,13 +22,11 @@ export type AddAPMCalloutKeys = | 'metrics' | 'errorGroupOverview'; -const defaultActions = ( - locator: LocatorPublic | undefined -) => { +const defaultActions = (locator: LocatorPublic | undefined) => { return { actions: { primary: { - href: locator?.getRedirectUrl({ category: 'application' }), + href: locator?.getRedirectUrl({ category: ApmOnboardingLocatorCategory.Apm }), label: i18n.translate('xpack.apm.serviceTabEmptyState.defaultPrimaryActionLabel', { defaultMessage: 'Add APM', }), @@ -42,7 +43,7 @@ const defaultActions = ( export const addAPMCalloutDefinitions = ( baseFolderPath: string, - locator: LocatorPublic | undefined + locator: LocatorPublic | undefined ): Record< AddAPMCalloutKeys, Omit diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/service_tab_empty_state/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/service_tab_empty_state/index.tsx index f6493e213cce9..2759f5718a16e 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/service_tab_empty_state/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/service_tab_empty_state/index.tsx @@ -8,10 +8,8 @@ import React from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { AddDataPanel } from '@kbn/observability-shared-plugin/public'; -import { - OBSERVABILITY_ONBOARDING_LOCATOR, - ObservabilityOnboardingLocatorParams, -} from '@kbn/deeplinks-observability'; +import { OBSERVABILITY_ONBOARDING_LOCATOR } from '@kbn/deeplinks-observability'; +import { ApmOnboardingLocatorParams } from '../../../locator/onboarding_locator'; import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; import { EmptyStateClickParams, EntityInventoryAddDataParams } from '../../../services/telemetry'; import { ApmPluginStartDeps, ApmServices } from '../../../plugin'; @@ -39,7 +37,7 @@ export function ServiceTabEmptyState({ id, onDismiss }: ServiceTabEmptyStateProp const { share } = useApmPluginContext(); - const onboardingLocator = share.url.locators.get( + const onboardingLocator = share.url.locators.get( OBSERVABILITY_ONBOARDING_LOCATOR ); diff --git a/x-pack/plugins/observability_solution/apm/public/components/routing/app_root/apm_header_action_menu/add_data_context_menu.tsx b/x-pack/plugins/observability_solution/apm/public/components/routing/app_root/apm_header_action_menu/add_data_context_menu.tsx index 7f55b112a5a64..0b628ff985735 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/routing/app_root/apm_header_action_menu/add_data_context_menu.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/routing/app_root/apm_header_action_menu/add_data_context_menu.tsx @@ -13,14 +13,16 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { useState } from 'react'; +import { OBSERVABILITY_ONBOARDING_LOCATOR } from '@kbn/deeplinks-observability'; +import { ApmOnboardingLocatorParams } from '../../../../locator/onboarding_locator'; import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; import { useKibana } from '../../../../context/kibana_context/use_kibana'; import { ApmPluginStartDeps, ApmServices } from '../../../../plugin'; import { EntityInventoryAddDataParams } from '../../../../services/telemetry'; import { - associateServiceLogs, - collectServiceLogs, - addApmData, + associateServiceLogsProps, + collectServiceLogsProps, + addApmDataProps, } from '../../../shared/add_data_buttons/buttons'; const addData = i18n.translate('xpack.apm.addDataContextMenu.link', { @@ -34,8 +36,17 @@ export function AddDataContextMenu() { core: { http: { basePath }, }, + share: { + url: { locators }, + }, } = useApmPluginContext(); + const onboardingLocator = locators.get( + OBSERVABILITY_ONBOARDING_LOCATOR + ); + + const addApmButtonData = addApmDataProps(onboardingLocator); + const button = ( { @@ -70,22 +81,26 @@ export function AddDataContextMenu() { }, }, { - name: collectServiceLogs.name, - href: basePath.prepend(collectServiceLogs.link), + name: collectServiceLogsProps.name, + href: basePath.prepend(collectServiceLogsProps.link), 'data-test-subj': 'apmAddDataCollectServiceLogs', onClick: () => { reportButtonClick('collect_new_service_logs'); }, }, - { - name: addApmData.name, - href: basePath.prepend(addApmData.link), - icon: 'plusInCircle', - 'data-test-subj': 'apmAddDataApmAgent', - onClick: () => { - reportButtonClick('add_apm_agent'); - }, - }, + ...(addApmButtonData.link + ? [ + { + name: addApmButtonData.name, + href: addApmButtonData.link, + icon: 'plusInCircle', + 'data-test-subj': 'apmAddDataApmAgent', + onClick: () => { + reportButtonClick('add_apm_agent'); + }, + }, + ] + : []), ], }, ]; diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/add_data_buttons/buttons.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/add_data_buttons/buttons.tsx index e3fc828b24803..b58799f0e00c2 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/add_data_buttons/buttons.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/add_data_buttons/buttons.tsx @@ -11,23 +11,31 @@ import { EuiButton, EuiButtonSize } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; +import { OBSERVABILITY_ONBOARDING_LOCATOR } from '@kbn/deeplinks-observability'; +import { LocatorPublic } from '@kbn/share-plugin/common'; import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; +import { + ApmOnboardingLocatorCategory, + ApmOnboardingLocatorParams, +} from '../../../locator/onboarding_locator'; -export const addApmData = { - name: i18n.translate('xpack.apm.add.apm.agent.button.', { - defaultMessage: 'Add APM', - }), - link: '/app/observabilityOnboarding/?category=apm', +export const addApmDataProps = (locator: LocatorPublic | undefined) => { + return { + name: i18n.translate('xpack.apm.add.apm.agent.button.', { + defaultMessage: 'Add APM', + }), + link: locator?.getRedirectUrl({ category: ApmOnboardingLocatorCategory.Apm }), + }; }; -export const associateServiceLogs = { +export const associateServiceLogsProps = { name: i18n.translate('xpack.apm.associate.service.logs.button', { defaultMessage: 'Associate existing service logs', }), link: 'https://ela.st/new-experience-associate-service-logs', }; -export const collectServiceLogs = { +export const collectServiceLogsProps = { name: i18n.translate('xpack.apm.collect.service.logs.button', { defaultMessage: 'Collect new service logs', }), @@ -42,18 +50,31 @@ interface AddApmDataProps { } export function AddApmData({ fill = false, size = 's', ...props }: AddApmDataProps) { - const { core } = useApmPluginContext(); - const { basePath } = core.http; + const { + share: { + url: { locators }, + }, + } = useApmPluginContext(); + + const onboardingLocator = locators.get( + OBSERVABILITY_ONBOARDING_LOCATOR + ); + + const addApmDataButtonProps = addApmDataProps(onboardingLocator); + + if (!addApmDataButtonProps.link) { + return; + } return ( - {addApmData.name} + {addApmDataButtonProps.name} ); } @@ -61,15 +82,15 @@ export function AddApmData({ fill = false, size = 's', ...props }: AddApmDataPro export function AssociateServiceLogs({ onClick }: { onClick?: () => void }) { return ( - {associateServiceLogs.name} + {associateServiceLogsProps.name} ); } @@ -80,12 +101,12 @@ export function CollectServiceLogs({ onClick }: { onClick?: () => void }) { return ( - {collectServiceLogs.name} + {collectServiceLogsProps.name} ); } diff --git a/x-pack/plugins/observability_solution/apm/public/locator/onboarding_locator.ts b/x-pack/plugins/observability_solution/apm/public/locator/onboarding_locator.ts new file mode 100644 index 0000000000000..889486cca8ca7 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/public/locator/onboarding_locator.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. + */ + +import { ObservabilityOnboardingLocatorParams } from '@kbn/deeplinks-observability'; + +export enum ApmOnboardingLocatorCategory { + Apm = 'application', +} + +export interface ApmOnboardingLocatorParams extends ObservabilityOnboardingLocatorParams { + category: ApmOnboardingLocatorCategory; +} From c31f11e7d8c5c586258399c5e702e2247e05d0e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Fri, 25 Oct 2024 08:57:46 -0400 Subject: [PATCH 026/135] Set mget task claim strategy as the default (#197070) Resolves https://github.com/elastic/kibana/issues/194625 In this PR, I'm setting `mget` as the default task claiming strategy along the following changes: - Given we no longer need the 8.16 specific PRs (https://github.com/elastic/kibana/pull/196317 and https://github.com/elastic/kibana/pull/196757), I've also reverted them. - Given we now use `met` as the default, I've renamed `task_manager_claimer_mget` to `task_manager_claimer_update_by_query` and made tests in that folder test using the `update_by_query` claim strategy. - Stabilize flaky tests caused by mget + polling for tasks more frequently Flaky test runners: - [[59b71bc](https://github.com/elastic/kibana/pull/197070/commits/59b71bcdbe4d617a6d91131976540b334c9220ff)] https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7197 - [[aea910e](https://github.com/elastic/kibana/pull/197070/commits/aea910e36dc71116dee708a7168971df30a18a3d)] https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7199 - [[4723ced](https://github.com/elastic/kibana/pull/197070/commits/4723ced751f0e5114a9bc7a2928dcf0cb326472e)] https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7206 - [[d28c8c5](https://github.com/elastic/kibana/pull/197070/commits/d28c8c56f67802107c17a627357251b9eff797ba)] https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7209 - [[dd7773a](https://github.com/elastic/kibana/pull/197070/commits/dd7773aebad5664e725c9849c0ed9418f9dc68ed)] https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7224 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .buildkite/ftr_platform_stateful_configs.yml | 2 +- .github/CODEOWNERS | 4 +- config/serverless.yml | 1 - package.json | 2 +- tsconfig.base.json | 4 +- .../task_manager/server/config.test.ts | 11 +- x-pack/plugins/task_manager/server/config.ts | 2 +- .../task_manager_switch_task_claimers.test.ts | 52 ++-- .../task_state_validation.test.ts | 5 +- .../server/lib/set_claim_strategy.test.ts | 226 ------------------ .../server/lib/set_claim_strategy.ts | 80 ------- x-pack/plugins/task_manager/server/plugin.ts | 22 +- .../task_manager/server/polling_lifecycle.ts | 8 +- .../server/saved_objects/index.ts | 6 +- .../group4/tests/alerting/alerts.ts | 2 +- .../tests/alerting/create_test_data.ts | 3 +- .../alerts_as_data/alerts_as_data_flapping.ts | 4 + .../apps/triggers_actions_ui/details.ts | 4 +- .../functional_with_es_ssl/config.base.ts | 2 +- .../sample_task_plugin/server/init_routes.ts | 37 +++ .../test_suites/task_manager/health_route.ts | 9 +- .../test_suites/task_manager/index.ts | 1 + .../task_manager/task_management.ts | 15 -- .../task_management_removed_types.ts | 5 + .../task_manager/task_partitions.ts | 2 +- .../config.ts | 4 +- .../ftr_provider_context.d.ts | 0 .../sample_task_plugin_mget/kibana.jsonc | 4 +- .../sample_task_plugin_mget/package.json | 4 +- .../sample_task_plugin_mget/server/index.ts | 0 .../server/init_routes.ts | 0 .../sample_task_plugin_mget/server/plugin.ts | 3 - .../sample_task_plugin_mget/tsconfig.json | 0 .../services.ts | 0 .../background_task_utilization_route.ts | 0 .../test_suites/task_manager/health_route.ts | 4 +- .../test_suites/task_manager/index.ts | 3 +- .../test_suites/task_manager/metrics_route.ts | 0 .../test_suites/task_manager/migrations.ts | 0 .../task_manager/task_management.ts | 0 .../task_management_removed_types.ts | 0 .../task_management_scheduled_at.ts | 0 .../test_suites/task_manager/task_priority.ts | 0 yarn.lock | 2 +- 44 files changed, 128 insertions(+), 405 deletions(-) delete mode 100644 x-pack/plugins/task_manager/server/lib/set_claim_strategy.test.ts delete mode 100644 x-pack/plugins/task_manager/server/lib/set_claim_strategy.ts rename x-pack/test/{task_manager_claimer_mget => plugin_api_integration}/test_suites/task_manager/task_partitions.ts (98%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/config.ts (92%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/ftr_provider_context.d.ts (100%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/plugins/sample_task_plugin_mget/kibana.jsonc (64%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/plugins/sample_task_plugin_mget/package.json (63%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/plugins/sample_task_plugin_mget/server/index.ts (100%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/plugins/sample_task_plugin_mget/server/init_routes.ts (100%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/plugins/sample_task_plugin_mget/server/plugin.ts (98%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/plugins/sample_task_plugin_mget/tsconfig.json (100%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/services.ts (100%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/test_suites/task_manager/background_task_utilization_route.ts (100%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/test_suites/task_manager/health_route.ts (99%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/test_suites/task_manager/index.ts (86%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/test_suites/task_manager/metrics_route.ts (100%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/test_suites/task_manager/migrations.ts (100%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/test_suites/task_manager/task_management.ts (100%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/test_suites/task_manager/task_management_removed_types.ts (100%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/test_suites/task_manager/task_management_scheduled_at.ts (100%) rename x-pack/test/{task_manager_claimer_mget => task_manager_claimer_update_by_query}/test_suites/task_manager/task_priority.ts (100%) diff --git a/.buildkite/ftr_platform_stateful_configs.yml b/.buildkite/ftr_platform_stateful_configs.yml index 8fb7807711d7d..b015b1c96c73a 100644 --- a/.buildkite/ftr_platform_stateful_configs.yml +++ b/.buildkite/ftr_platform_stateful_configs.yml @@ -342,7 +342,7 @@ enabled: - x-pack/test/spaces_api_integration/security_and_spaces/config_trial.ts - x-pack/test/spaces_api_integration/security_and_spaces/copy_to_space_config_trial.ts - x-pack/test/spaces_api_integration/spaces_only/config.ts - - x-pack/test/task_manager_claimer_mget/config.ts + - x-pack/test/task_manager_claimer_update_by_query/config.ts - x-pack/test/ui_capabilities/security_and_spaces/config.ts - x-pack/test/ui_capabilities/spaces_only/config.ts - x-pack/test/upgrade_assistant_integration/config.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2992878434c37..3e73a2a40a388 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -745,7 +745,7 @@ x-pack/plugins/runtime_fields @elastic/kibana-management packages/kbn-safer-lodash-set @elastic/kibana-security x-pack/test/security_api_integration/plugins/saml_provider @elastic/kibana-security x-pack/test/plugin_api_integration/plugins/sample_task_plugin @elastic/response-ops -x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget @elastic/response-ops +x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget @elastic/response-ops test/plugin_functional/plugins/saved_object_export_transforms @elastic/kibana-core test/plugin_functional/plugins/saved_object_import_warnings @elastic/kibana-core x-pack/test/saved_object_api_integration/common/plugins/saved_object_test_plugin @elastic/kibana-security @@ -1495,7 +1495,7 @@ x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kib /x-pack/test/alerting_api_integration/observability @elastic/obs-ux-management-team /x-pack/test/plugin_api_integration/test_suites/task_manager/ @elastic/response-ops /x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/ @elastic/response-ops -/x-pack/test/task_manager_claimer_mget/ @elastic/response-ops +/x-pack/test/task_manager_claimer_update_by_query/ @elastic/response-ops /docs/user/alerting/ @elastic/response-ops /docs/management/connectors/ @elastic/response-ops /x-pack/test/cases_api_integration/ @elastic/response-ops diff --git a/config/serverless.yml b/config/serverless.yml index ec857577f1863..75be6151e3bb2 100644 --- a/config/serverless.yml +++ b/config/serverless.yml @@ -207,7 +207,6 @@ uiSettings: labs:dashboard:deferBelowFold: false # Task Manager -xpack.task_manager.claim_strategy: mget xpack.task_manager.allow_reading_invalid_state: false xpack.task_manager.request_timeouts.update_by_query: 60000 xpack.task_manager.metrics_reset_interval: 120000 diff --git a/package.json b/package.json index 80ad0fd11c7ec..0205652b04a20 100644 --- a/package.json +++ b/package.json @@ -763,7 +763,7 @@ "@kbn/safer-lodash-set": "link:packages/kbn-safer-lodash-set", "@kbn/saml-provider-plugin": "link:x-pack/test/security_api_integration/plugins/saml_provider", "@kbn/sample-task-plugin": "link:x-pack/test/plugin_api_integration/plugins/sample_task_plugin", - "@kbn/sample-task-plugin-mget": "link:x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget", + "@kbn/sample-task-plugin-update-by-query": "link:x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget", "@kbn/saved-object-export-transforms-plugin": "link:test/plugin_functional/plugins/saved_object_export_transforms", "@kbn/saved-object-import-warnings-plugin": "link:test/plugin_functional/plugins/saved_object_import_warnings", "@kbn/saved-object-test-plugin": "link:x-pack/test/saved_object_api_integration/common/plugins/saved_object_test_plugin", diff --git a/tsconfig.base.json b/tsconfig.base.json index b249f9a1693ec..4471cb1bc6754 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1484,8 +1484,8 @@ "@kbn/saml-provider-plugin/*": ["x-pack/test/security_api_integration/plugins/saml_provider/*"], "@kbn/sample-task-plugin": ["x-pack/test/plugin_api_integration/plugins/sample_task_plugin"], "@kbn/sample-task-plugin/*": ["x-pack/test/plugin_api_integration/plugins/sample_task_plugin/*"], - "@kbn/sample-task-plugin-mget": ["x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget"], - "@kbn/sample-task-plugin-mget/*": ["x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/*"], + "@kbn/sample-task-plugin-update-by-query": ["x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget"], + "@kbn/sample-task-plugin-update-by-query/*": ["x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/*"], "@kbn/saved-object-export-transforms-plugin": ["test/plugin_functional/plugins/saved_object_export_transforms"], "@kbn/saved-object-export-transforms-plugin/*": ["test/plugin_functional/plugins/saved_object_export_transforms/*"], "@kbn/saved-object-import-warnings-plugin": ["test/plugin_functional/plugins/saved_object_import_warnings"], diff --git a/x-pack/plugins/task_manager/server/config.test.ts b/x-pack/plugins/task_manager/server/config.test.ts index aefbdaa9c8c56..2193620e0c998 100644 --- a/x-pack/plugins/task_manager/server/config.test.ts +++ b/x-pack/plugins/task_manager/server/config.test.ts @@ -14,6 +14,7 @@ describe('config validation', () => { Object { "allow_reading_invalid_state": true, "auto_calculate_default_ech_capacity": false, + "claim_strategy": "mget", "discovery": Object { "active_nodes_lookback": "30s", "interval": 10000, @@ -44,7 +45,7 @@ describe('config validation', () => { "warn_threshold": 80, }, }, - "poll_interval": 3000, + "poll_interval": 500, "request_capacity": 1000, "request_timeouts": Object { "update_by_query": 30000, @@ -66,7 +67,7 @@ describe('config validation', () => { expect(() => { configSchema.validate(config); }).toThrowErrorMatchingInlineSnapshot( - `"The specified monitored_stats_required_freshness (100) is invalid, as it is below the poll_interval (3000)"` + `"The specified monitored_stats_required_freshness (100) is invalid, as it is below the poll_interval (500)"` ); }); @@ -76,6 +77,7 @@ describe('config validation', () => { Object { "allow_reading_invalid_state": true, "auto_calculate_default_ech_capacity": false, + "claim_strategy": "mget", "discovery": Object { "active_nodes_lookback": "30s", "interval": 10000, @@ -106,7 +108,7 @@ describe('config validation', () => { "warn_threshold": 80, }, }, - "poll_interval": 3000, + "poll_interval": 500, "request_capacity": 1000, "request_timeouts": Object { "update_by_query": 30000, @@ -136,6 +138,7 @@ describe('config validation', () => { Object { "allow_reading_invalid_state": true, "auto_calculate_default_ech_capacity": false, + "claim_strategy": "mget", "discovery": Object { "active_nodes_lookback": "30s", "interval": 10000, @@ -171,7 +174,7 @@ describe('config validation', () => { "warn_threshold": 80, }, }, - "poll_interval": 3000, + "poll_interval": 500, "request_capacity": 1000, "request_timeouts": Object { "update_by_query": 30000, diff --git a/x-pack/plugins/task_manager/server/config.ts b/x-pack/plugins/task_manager/server/config.ts index 3eff1b507107c..002f18380a747 100644 --- a/x-pack/plugins/task_manager/server/config.ts +++ b/x-pack/plugins/task_manager/server/config.ts @@ -202,7 +202,7 @@ export const configSchema = schema.object( max: 100, min: 1, }), - claim_strategy: schema.maybe(schema.string()), + claim_strategy: schema.string({ defaultValue: CLAIM_STRATEGY_MGET }), request_timeouts: requestTimeoutsConfig, auto_calculate_default_ech_capacity: schema.boolean({ defaultValue: false }), }, diff --git a/x-pack/plugins/task_manager/server/integration_tests/task_manager_switch_task_claimers.test.ts b/x-pack/plugins/task_manager/server/integration_tests/task_manager_switch_task_claimers.test.ts index 1c3945f36c538..b89f9f92586fe 100644 --- a/x-pack/plugins/task_manager/server/integration_tests/task_manager_switch_task_claimers.test.ts +++ b/x-pack/plugins/task_manager/server/integration_tests/task_manager_switch_task_claimers.test.ts @@ -52,13 +52,13 @@ describe('switch task claiming strategies', () => { jest.clearAllMocks(); }); - it('should switch from default to mget and still claim tasks', async () => { + it('should switch from default to update_by_query and still claim tasks', async () => { const setupResultDefault = await setupTestServers(); const esServer = setupResultDefault.esServer; let kibanaServer = setupResultDefault.kibanaServer; let taskClaimingOpts: TaskClaimingOpts = TaskClaimingMock.mock.calls[0][0]; - expect(taskClaimingOpts.strategy).toBe('update_by_query'); + expect(taskClaimingOpts.strategy).toBe('mget'); mockTaskTypeRunFn.mockImplementation(() => { return { state: {} }; @@ -90,17 +90,17 @@ describe('switch task claiming strategies', () => { await kibanaServer.stop(); } - const setupResultMget = await setupKibanaServer({ + const setupResultUbq = await setupKibanaServer({ xpack: { task_manager: { - claim_strategy: 'mget', + claim_strategy: 'update_by_query', }, }, }); - kibanaServer = setupResultMget.kibanaServer; + kibanaServer = setupResultUbq.kibanaServer; taskClaimingOpts = TaskClaimingMock.mock.calls[1][0]; - expect(taskClaimingOpts.strategy).toBe('mget'); + expect(taskClaimingOpts.strategy).toBe('update_by_query'); // inject a task to run and ensure it is claimed and run const id2 = uuidV4(); @@ -132,19 +132,19 @@ describe('switch task claiming strategies', () => { } }); - it('should switch from mget to default and still claim tasks', async () => { - const setupResultMget = await setupTestServers({ + it('should switch from update_by_query to default and still claim tasks', async () => { + const setupResultUbq = await setupTestServers({ xpack: { task_manager: { - claim_strategy: 'mget', + claim_strategy: 'update_by_query', }, }, }); - const esServer = setupResultMget.esServer; - let kibanaServer = setupResultMget.kibanaServer; + const esServer = setupResultUbq.esServer; + let kibanaServer = setupResultUbq.kibanaServer; let taskClaimingOpts: TaskClaimingOpts = TaskClaimingMock.mock.calls[0][0]; - expect(taskClaimingOpts.strategy).toBe('mget'); + expect(taskClaimingOpts.strategy).toBe('update_by_query'); mockTaskTypeRunFn.mockImplementation(() => { return { state: {} }; @@ -180,7 +180,7 @@ describe('switch task claiming strategies', () => { kibanaServer = setupResultDefault.kibanaServer; taskClaimingOpts = TaskClaimingMock.mock.calls[1][0]; - expect(taskClaimingOpts.strategy).toBe('update_by_query'); + expect(taskClaimingOpts.strategy).toBe('mget'); // inject a task to run and ensure it is claimed and run const id2 = uuidV4(); @@ -212,13 +212,13 @@ describe('switch task claiming strategies', () => { } }); - it('should switch from default to mget and claim tasks that were running during shutdown', async () => { + it('should switch from default to update_by_query and claim tasks that were running during shutdown', async () => { const setupResultDefault = await setupTestServers(); const esServer = setupResultDefault.esServer; let kibanaServer = setupResultDefault.kibanaServer; let taskClaimingOpts: TaskClaimingOpts = TaskClaimingMock.mock.calls[0][0]; - expect(taskClaimingOpts.strategy).toBe('update_by_query'); + expect(taskClaimingOpts.strategy).toBe('mget'); mockTaskTypeRunFn.mockImplementation(async () => { await new Promise((resolve) => setTimeout(resolve, 2000)); @@ -252,17 +252,17 @@ describe('switch task claiming strategies', () => { await kibanaServer.stop(); } - const setupResultMget = await setupKibanaServer({ + const setupResultUbq = await setupKibanaServer({ xpack: { task_manager: { - claim_strategy: 'mget', + claim_strategy: 'update_by_query', }, }, }); - kibanaServer = setupResultMget.kibanaServer; + kibanaServer = setupResultUbq.kibanaServer; taskClaimingOpts = TaskClaimingMock.mock.calls[1][0]; - expect(taskClaimingOpts.strategy).toBe('mget'); + expect(taskClaimingOpts.strategy).toBe('update_by_query'); // task doc should still exist and be running const task = await kibanaServer.coreStart.elasticsearch.client.asInternalUser.get<{ @@ -290,19 +290,19 @@ describe('switch task claiming strategies', () => { } }); - it('should switch from mget to default and claim tasks that were running during shutdown', async () => { - const setupResultMget = await setupTestServers({ + it('should switch from update_by_query to default and claim tasks that were running during shutdown', async () => { + const setupResultUbq = await setupTestServers({ xpack: { task_manager: { - claim_strategy: 'mget', + claim_strategy: 'update_by_query', }, }, }); - const esServer = setupResultMget.esServer; - let kibanaServer = setupResultMget.kibanaServer; + const esServer = setupResultUbq.esServer; + let kibanaServer = setupResultUbq.kibanaServer; let taskClaimingOpts: TaskClaimingOpts = TaskClaimingMock.mock.calls[0][0]; - expect(taskClaimingOpts.strategy).toBe('mget'); + expect(taskClaimingOpts.strategy).toBe('update_by_query'); mockTaskTypeRunFn.mockImplementation(async () => { await new Promise((resolve) => setTimeout(resolve, 2000)); @@ -340,7 +340,7 @@ describe('switch task claiming strategies', () => { kibanaServer = setupResultDefault.kibanaServer; taskClaimingOpts = TaskClaimingMock.mock.calls[1][0]; - expect(taskClaimingOpts.strategy).toBe('update_by_query'); + expect(taskClaimingOpts.strategy).toBe('mget'); // task doc should still exist and be running const task = await kibanaServer.coreStart.elasticsearch.client.asInternalUser.get<{ diff --git a/x-pack/plugins/task_manager/server/integration_tests/task_state_validation.test.ts b/x-pack/plugins/task_manager/server/integration_tests/task_state_validation.test.ts index 7f1d9d5e4aae9..294b4fd905807 100644 --- a/x-pack/plugins/task_manager/server/integration_tests/task_state_validation.test.ts +++ b/x-pack/plugins/task_manager/server/integration_tests/task_state_validation.test.ts @@ -305,7 +305,7 @@ describe('task state validation', () => { it('should fail the task run when setting allow_reading_invalid_state:false and reading an invalid state', async () => { const logSpy = jest.spyOn(pollingLifecycleOpts.logger, 'warn'); - const updateSpy = jest.spyOn(pollingLifecycleOpts.taskStore, 'bulkUpdate'); + const updateSpy = jest.spyOn(pollingLifecycleOpts.taskStore, 'bulkPartialUpdate'); const id = uuidV4(); await injectTask(kibanaServer.coreStart.elasticsearch.client.asInternalUser, { @@ -332,8 +332,7 @@ describe('task state validation', () => { const found = calls.map((arr) => arr[0]).find((message) => message.match(expected) != null); expect(found).toMatch(expected); expect(updateSpy).toHaveBeenCalledWith( - expect.arrayContaining([expect.objectContaining({ id, taskType: 'fooType' })]), - { validate: false } + expect.arrayContaining([expect.objectContaining({ id })]) ); }); }); diff --git a/x-pack/plugins/task_manager/server/lib/set_claim_strategy.test.ts b/x-pack/plugins/task_manager/server/lib/set_claim_strategy.test.ts deleted file mode 100644 index 993693c6ba5ab..0000000000000 --- a/x-pack/plugins/task_manager/server/lib/set_claim_strategy.test.ts +++ /dev/null @@ -1,226 +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 { - CLAIM_STRATEGY_MGET, - CLAIM_STRATEGY_UPDATE_BY_QUERY, - DEFAULT_POLL_INTERVAL, - MGET_DEFAULT_POLL_INTERVAL, -} from '../config'; -import { mockLogger } from '../test_utils'; -import { setClaimStrategy } from './set_claim_strategy'; - -const getConfigWithoutClaimStrategy = () => ({ - discovery: { - active_nodes_lookback: '30s', - interval: 10000, - }, - kibanas_per_partition: 2, - capacity: 10, - max_attempts: 9, - allow_reading_invalid_state: false, - version_conflict_threshold: 80, - monitored_aggregated_stats_refresh_rate: 60000, - monitored_stats_health_verbose_log: { - enabled: false, - level: 'debug' as const, - warn_delayed_task_start_in_seconds: 60, - }, - monitored_stats_required_freshness: 4000, - monitored_stats_running_average_window: 50, - request_capacity: 1000, - monitored_task_execution_thresholds: { - default: { - error_threshold: 90, - warn_threshold: 80, - }, - custom: {}, - }, - ephemeral_tasks: { - enabled: true, - request_capacity: 10, - }, - unsafe: { - exclude_task_types: [], - authenticate_background_task_utilization: true, - }, - event_loop_delay: { - monitor: true, - warn_threshold: 5000, - }, - worker_utilization_running_average_window: 5, - metrics_reset_interval: 3000, - request_timeouts: { - update_by_query: 1000, - }, - poll_interval: DEFAULT_POLL_INTERVAL, - auto_calculate_default_ech_capacity: false, -}); - -const logger = mockLogger(); - -const deploymentIdUpdateByQuery = 'd2f0e7c6bc464a9b8b16e5730b9c40f9'; -const deploymentIdMget = 'ab4e88d139f93d43024837d96144e7d4'; -describe('setClaimStrategy', () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - for (const isServerless of [true, false]) { - for (const isCloud of [true, false]) { - for (const isElasticStaffOwned of [true, false]) { - for (const deploymentId of [undefined, deploymentIdMget, deploymentIdUpdateByQuery]) { - for (const configuredStrategy of [CLAIM_STRATEGY_MGET, CLAIM_STRATEGY_UPDATE_BY_QUERY]) { - test(`should return config as is when claim strategy is already defined: isServerless=${isServerless}, isCloud=${isCloud}, isElasticStaffOwned=${isElasticStaffOwned}, deploymentId=${deploymentId}`, () => { - const config = { - ...getConfigWithoutClaimStrategy(), - claim_strategy: configuredStrategy, - }; - - const returnedConfig = setClaimStrategy({ - config, - logger, - isCloud, - isServerless, - isElasticStaffOwned, - deploymentId, - }); - - expect(returnedConfig).toStrictEqual(config); - if (deploymentId) { - expect(logger.info).toHaveBeenCalledWith( - `Using claim strategy ${configuredStrategy} as configured for deployment ${deploymentId}` - ); - } else { - expect(logger.info).toHaveBeenCalledWith( - `Using claim strategy ${configuredStrategy} as configured` - ); - } - }); - } - } - } - } - } - - for (const isCloud of [true, false]) { - for (const isElasticStaffOwned of [true, false]) { - for (const deploymentId of [undefined, deploymentIdMget, deploymentIdUpdateByQuery]) { - test(`should set claim strategy to mget if in serverless: isCloud=${isCloud}, isElasticStaffOwned=${isElasticStaffOwned}, deploymentId=${deploymentId}`, () => { - const config = getConfigWithoutClaimStrategy(); - const returnedConfig = setClaimStrategy({ - config, - logger, - isCloud, - isServerless: true, - isElasticStaffOwned, - deploymentId, - }); - - expect(returnedConfig.claim_strategy).toBe(CLAIM_STRATEGY_MGET); - expect(returnedConfig.poll_interval).toBe(MGET_DEFAULT_POLL_INTERVAL); - - if (deploymentId) { - expect(logger.info).toHaveBeenCalledWith( - `Setting claim strategy to mget for serverless deployment ${deploymentId}` - ); - } else { - expect(logger.info).toHaveBeenCalledWith(`Setting claim strategy to mget`); - } - }); - } - } - } - - test(`should set claim strategy to update_by_query if not cloud and not serverless`, () => { - const config = getConfigWithoutClaimStrategy(); - const returnedConfig = setClaimStrategy({ - config, - logger, - isCloud: false, - isElasticStaffOwned: false, - isServerless: false, - }); - - expect(returnedConfig.claim_strategy).toBe(CLAIM_STRATEGY_UPDATE_BY_QUERY); - expect(returnedConfig.poll_interval).toBe(DEFAULT_POLL_INTERVAL); - - expect(logger.info).not.toHaveBeenCalled(); - }); - - test(`should set claim strategy to update_by_query if cloud and not serverless with undefined deploymentId`, () => { - const config = getConfigWithoutClaimStrategy(); - const returnedConfig = setClaimStrategy({ - config, - logger, - isCloud: true, - isElasticStaffOwned: false, - isServerless: false, - }); - - expect(returnedConfig.claim_strategy).toBe(CLAIM_STRATEGY_UPDATE_BY_QUERY); - expect(returnedConfig.poll_interval).toBe(DEFAULT_POLL_INTERVAL); - - expect(logger.info).not.toHaveBeenCalled(); - }); - - test(`should set claim strategy to update_by_query if cloud and not serverless and deploymentId does not start with a or b`, () => { - const config = getConfigWithoutClaimStrategy(); - const returnedConfig = setClaimStrategy({ - config, - logger, - isCloud: true, - isElasticStaffOwned: false, - isServerless: false, - deploymentId: deploymentIdUpdateByQuery, - }); - - expect(returnedConfig.claim_strategy).toBe(CLAIM_STRATEGY_UPDATE_BY_QUERY); - expect(returnedConfig.poll_interval).toBe(DEFAULT_POLL_INTERVAL); - - expect(logger.info).toHaveBeenCalledWith( - `Setting claim strategy to update_by_query for deployment ${deploymentIdUpdateByQuery}` - ); - }); - - test(`should set claim strategy to mget if cloud, deploymentId does not start with a or b, not serverless and isElasticStaffOwned is true`, () => { - const config = getConfigWithoutClaimStrategy(); - const returnedConfig = setClaimStrategy({ - config, - logger, - isCloud: true, - isElasticStaffOwned: true, - isServerless: false, - deploymentId: deploymentIdUpdateByQuery, - }); - - expect(returnedConfig.claim_strategy).toBe(CLAIM_STRATEGY_MGET); - expect(returnedConfig.poll_interval).toBe(MGET_DEFAULT_POLL_INTERVAL); - - expect(logger.info).toHaveBeenCalledWith( - `Setting claim strategy to mget for deployment ${deploymentIdUpdateByQuery}` - ); - }); - - test(`should set claim strategy to mget if cloud and not serverless and deploymentId starts with a or b`, () => { - const config = getConfigWithoutClaimStrategy(); - const returnedConfig = setClaimStrategy({ - config, - logger, - isCloud: true, - isElasticStaffOwned: false, - isServerless: false, - deploymentId: deploymentIdMget, - }); - - expect(returnedConfig.claim_strategy).toBe(CLAIM_STRATEGY_MGET); - expect(returnedConfig.poll_interval).toBe(MGET_DEFAULT_POLL_INTERVAL); - - expect(logger.info).toHaveBeenCalledWith( - `Setting claim strategy to mget for deployment ${deploymentIdMget}` - ); - }); -}); diff --git a/x-pack/plugins/task_manager/server/lib/set_claim_strategy.ts b/x-pack/plugins/task_manager/server/lib/set_claim_strategy.ts deleted file mode 100644 index 9ff24ad67a963..0000000000000 --- a/x-pack/plugins/task_manager/server/lib/set_claim_strategy.ts +++ /dev/null @@ -1,80 +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 { Logger } from '@kbn/core/server'; -import { - CLAIM_STRATEGY_MGET, - CLAIM_STRATEGY_UPDATE_BY_QUERY, - DEFAULT_POLL_INTERVAL, - MGET_DEFAULT_POLL_INTERVAL, - TaskManagerConfig, -} from '../config'; - -interface SetClaimStrategyOpts { - config: TaskManagerConfig; - deploymentId?: string; - isServerless: boolean; - isCloud: boolean; - isElasticStaffOwned: boolean; - logger: Logger; -} - -export function setClaimStrategy(opts: SetClaimStrategyOpts): TaskManagerConfig { - // if the claim strategy is already defined, return immediately - if (opts.config.claim_strategy) { - opts.logger.info( - `Using claim strategy ${opts.config.claim_strategy} as configured${ - opts.deploymentId ? ` for deployment ${opts.deploymentId}` : '' - }` - ); - return opts.config; - } - - if (opts.isServerless) { - // use mget for serverless - opts.logger.info( - `Setting claim strategy to mget${ - opts.deploymentId ? ` for serverless deployment ${opts.deploymentId}` : '' - }` - ); - return { - ...opts.config, - claim_strategy: CLAIM_STRATEGY_MGET, - poll_interval: MGET_DEFAULT_POLL_INTERVAL, - }; - } - - let defaultToMget = false; - - if (opts.isCloud && !opts.isServerless && opts.deploymentId) { - defaultToMget = - opts.deploymentId.startsWith('a') || - opts.deploymentId.startsWith('b') || - opts.isElasticStaffOwned; - if (defaultToMget) { - opts.logger.info(`Setting claim strategy to mget for deployment ${opts.deploymentId}`); - } else { - opts.logger.info( - `Setting claim strategy to update_by_query for deployment ${opts.deploymentId}` - ); - } - } - - if (defaultToMget) { - return { - ...opts.config, - claim_strategy: CLAIM_STRATEGY_MGET, - poll_interval: MGET_DEFAULT_POLL_INTERVAL, - }; - } - - return { - ...opts.config, - claim_strategy: CLAIM_STRATEGY_UPDATE_BY_QUERY, - poll_interval: DEFAULT_POLL_INTERVAL, - }; -} diff --git a/x-pack/plugins/task_manager/server/plugin.ts b/x-pack/plugins/task_manager/server/plugin.ts index 3bf9d8e928ca8..45960195be216 100644 --- a/x-pack/plugins/task_manager/server/plugin.ts +++ b/x-pack/plugins/task_manager/server/plugin.ts @@ -18,7 +18,7 @@ import { ServiceStatusLevels, CoreStatus, } from '@kbn/core/server'; -import type { CloudSetup, CloudStart } from '@kbn/cloud-plugin/server'; +import type { CloudStart } from '@kbn/cloud-plugin/server'; import { registerDeleteInactiveNodesTaskDefinition, scheduleDeleteInactiveNodesTaskDefinition, @@ -45,7 +45,6 @@ import { metricsStream, Metrics } from './metrics'; import { TaskManagerMetricsCollector } from './metrics/task_metrics_collector'; import { TaskPartitioner } from './lib/task_partitioner'; import { getDefaultCapacity } from './lib/get_default_capacity'; -import { setClaimStrategy } from './lib/set_claim_strategy'; export interface TaskManagerSetupContract { /** @@ -127,19 +126,10 @@ export class TaskManagerPlugin public setup( core: CoreSetup, - plugins: { cloud?: CloudSetup; usageCollection?: UsageCollectionSetup } + plugins: { usageCollection?: UsageCollectionSetup } ): TaskManagerSetupContract { this.elasticsearchAndSOAvailability$ = getElasticsearchAndSOAvailability(core.status.core$); - this.config = setClaimStrategy({ - config: this.config, - deploymentId: plugins.cloud?.deploymentId, - isServerless: this.initContext.env.packageInfo.buildFlavor === 'serverless', - isCloud: plugins.cloud?.isCloudEnabled ?? false, - isElasticStaffOwned: plugins.cloud?.isElasticStaffOwned ?? false, - logger: this.logger, - }); - core.metrics .getOpsMetrics$() .pipe(distinctUntilChanged()) @@ -147,7 +137,7 @@ export class TaskManagerPlugin this.heapSizeLimit = metrics.process.memory.heap.size_limit; }); - setupSavedObjects(core.savedObjects); + setupSavedObjects(core.savedObjects, this.config); this.taskManagerId = this.initContext.env.instanceUuid; if (!this.taskManagerId) { @@ -311,9 +301,9 @@ export class TaskManagerPlugin this.config!.claim_strategy } isBackgroundTaskNodeOnly=${this.isNodeBackgroundTasksOnly()} heapSizeLimit=${ this.heapSizeLimit - } defaultCapacity=${defaultCapacity} pollingInterval=${ - this.config!.poll_interval - } autoCalculateDefaultEchCapacity=${this.config.auto_calculate_default_ech_capacity}` + } defaultCapacity=${defaultCapacity} autoCalculateDefaultEchCapacity=${ + this.config.auto_calculate_default_ech_capacity + }` ); const managedConfiguration = createManagedConfiguration({ diff --git a/x-pack/plugins/task_manager/server/polling_lifecycle.ts b/x-pack/plugins/task_manager/server/polling_lifecycle.ts index 3cb6802f43eb1..7d8be75c2330c 100644 --- a/x-pack/plugins/task_manager/server/polling_lifecycle.ts +++ b/x-pack/plugins/task_manager/server/polling_lifecycle.ts @@ -14,7 +14,7 @@ import type { Logger, ExecutionContextStart } from '@kbn/core/server'; import { Result, asErr, mapErr, asOk, map, mapOk } from './lib/result_type'; import { ManagedConfiguration } from './lib/create_managed_configuration'; -import { CLAIM_STRATEGY_UPDATE_BY_QUERY, TaskManagerConfig } from './config'; +import { TaskManagerConfig, CLAIM_STRATEGY_UPDATE_BY_QUERY } from './config'; import { TaskMarkRunning, @@ -141,7 +141,7 @@ export class TaskPollingLifecycle implements ITaskEventEmitter this.currentPollInterval, }); }; diff --git a/x-pack/plugins/task_manager/server/saved_objects/index.ts b/x-pack/plugins/task_manager/server/saved_objects/index.ts index 5c0f8b9a0776d..dc1cd97677767 100644 --- a/x-pack/plugins/task_manager/server/saved_objects/index.ts +++ b/x-pack/plugins/task_manager/server/saved_objects/index.ts @@ -9,6 +9,7 @@ import type { SavedObjectsServiceSetup } from '@kbn/core/server'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { backgroundTaskNodeMapping, taskMappings } from './mappings'; import { getMigrations } from './migrations'; +import { TaskManagerConfig } from '../config'; import { getOldestIdleActionTask } from '../queries/oldest_idle_action_task'; import { TASK_MANAGER_INDEX } from '../constants'; import { backgroundTaskNodeModelVersions, taskModelVersions } from './model_versions'; @@ -16,7 +17,10 @@ import { backgroundTaskNodeModelVersions, taskModelVersions } from './model_vers export const TASK_SO_NAME = 'task'; export const BACKGROUND_TASK_NODE_SO_NAME = 'background-task-node'; -export function setupSavedObjects(savedObjects: SavedObjectsServiceSetup) { +export function setupSavedObjects( + savedObjects: SavedObjectsServiceSetup, + config: TaskManagerConfig +) { savedObjects.registerType({ name: TASK_SO_NAME, namespaceType: 'agnostic', diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/alerts.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/alerts.ts index 78213729efdf8..7e1f824a50b0c 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/alerts.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group4/tests/alerting/alerts.ts @@ -1711,7 +1711,7 @@ instanceStateValue: true reference ); // @ts-expect-error doesnt handle total: number - expect(searchResult.body.hits.total.value).to.eql(1); + expect(searchResult.body.hits.total.value).to.be.greaterThan(0); expectExpect( // @ts-expect-error _source: unknown JSON.parse(searchResult.body.hits.hits[0]._source.params.message) diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/create_test_data.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/create_test_data.ts index febba47484e22..87d676f46071a 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/create_test_data.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/create_test_data.ts @@ -15,7 +15,8 @@ export const END_DATE = '2020-01-01T00:00:00Z'; export const DOCUMENT_SOURCE = 'queryDataEndpointTests'; export const DOCUMENT_REFERENCE = '-na-'; -export const TEST_CACHE_EXPIRATION_TIME = 10000; +// Higher than the configured yml setting to avoid race conditions +export const TEST_CACHE_EXPIRATION_TIME = 12000; export async function createEsDocuments( es: Client, diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_flapping.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_flapping.ts index 1035ba1902dfe..9bab20d763fcb 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_flapping.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_flapping.ts @@ -552,6 +552,8 @@ export default function createAlertsAsDataFlappingTest({ getService }: FtrProvid status_change_threshold: 2, }) .expect(200); + // wait so cache expires + await setTimeoutAsync(TEST_CACHE_EXPIRATION_TIME); const pattern = { alertA: [true, false, true, false, true, false, true, false], @@ -667,6 +669,8 @@ export default function createAlertsAsDataFlappingTest({ getService }: FtrProvid status_change_threshold: 2, }) .expect(200); + // wait so cache expires + await setTimeoutAsync(TEST_CACHE_EXPIRATION_TIME); const pattern = { alertA: [true, false, true, false, true, false, true, false], diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts index 546ee11fd4ea8..6a1c521cacd50 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/details.ts @@ -108,7 +108,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { return await createAlwaysFiringRule({ name: `test-rule-${testRunUuid}`, schedule: { - interval: '1s', + interval: '3s', }, actions: connectors.map((connector) => ({ id: connector.id, @@ -615,7 +615,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const rule = await createAlwaysFiringRule({ name: `test-rule-${testRunUuid}`, schedule: { - interval: '1s', + interval: '3s', }, notify_when: RuleNotifyWhen.THROTTLE, throttle: '2d', diff --git a/x-pack/test/functional_with_es_ssl/config.base.ts b/x-pack/test/functional_with_es_ssl/config.base.ts index b4cc8a734a270..2abf100f2823f 100644 --- a/x-pack/test/functional_with_es_ssl/config.base.ts +++ b/x-pack/test/functional_with_es_ssl/config.base.ts @@ -87,7 +87,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { 'ruleStatusFilter', 'isUsingRuleCreateFlyout', ])}`, - `--xpack.alerting.rules.minimumScheduleInterval.value="2s"`, + `--xpack.alerting.rules.minimumScheduleInterval.value="5s"`, `--xpack.actions.enabledActionTypes=${JSON.stringify(enabledActionTypes)}`, `--xpack.actions.preconfiguredAlertHistoryEsIndex=false`, `--xpack.actions.preconfigured=${JSON.stringify({ diff --git a/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/init_routes.ts b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/init_routes.ts index b1c8d6dd028b2..51b0842e60bc8 100644 --- a/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/init_routes.ts +++ b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/init_routes.ts @@ -16,6 +16,7 @@ import { } from '@kbn/core/server'; import { EventEmitter } from 'events'; import { TaskManagerStartContract } from '@kbn/task-manager-plugin/server'; +import { BACKGROUND_TASK_NODE_SO_NAME } from '@kbn/task-manager-plugin/server/saved_objects'; const scope = 'testing'; const taskManagerQuery = { @@ -398,4 +399,40 @@ export function initRoutes( } } ); + + router.post( + { + path: `/api/update_kibana_node`, + validate: { + body: schema.object({ + id: schema.string(), + lastSeen: schema.string(), + }), + }, + }, + async function ( + context: RequestHandlerContext, + req: KibanaRequest, + res: KibanaResponseFactory + ): Promise> { + const { id, lastSeen } = req.body; + + const client = (await context.core).savedObjects.getClient({ + includedHiddenTypes: [BACKGROUND_TASK_NODE_SO_NAME], + }); + const node = await client.update( + BACKGROUND_TASK_NODE_SO_NAME, + id, + { + id, + last_seen: lastSeen, + }, + { upsert: { id, last_seen: lastSeen }, refresh: false, retryOnConflict: 3 } + ); + + return res.ok({ + body: node, + }); + } + ); } diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/health_route.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/health_route.ts index d1f55918547f3..8aba3d1624730 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/health_route.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/health_route.ts @@ -125,11 +125,16 @@ export default function ({ getService }: FtrProviderContext) { const monitoredAggregatedStatsRefreshRate = 5000; describe('health', () => { + after(async () => { + // clean up after each test + return await request.delete('/api/sample_tasks').set('kbn-xsrf', 'xxx').expect(200); + }); + it('should return basic configuration of task manager', async () => { const health = await getHealth(); expect(health.status).to.eql('OK'); expect(health.stats.configuration.value).to.eql({ - poll_interval: 3000, + poll_interval: 500, monitored_aggregated_stats_refresh_rate: monitoredAggregatedStatsRefreshRate, monitored_stats_running_average_window: 50, monitored_task_execution_thresholds: { @@ -145,7 +150,7 @@ export default function ({ getService }: FtrProviderContext) { as_workers: 10, as_cost: 20, }, - claim_strategy: 'update_by_query', + claim_strategy: 'mget', }); }); diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/index.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/index.ts index 3b943347cea7e..db48904920254 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/index.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/index.ts @@ -18,6 +18,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./task_management_removed_types')); loadTestFile(require.resolve('./check_registered_task_types')); loadTestFile(require.resolve('./kibana_discovery_service')); + loadTestFile(require.resolve('./task_partitions')); loadTestFile(require.resolve('./migrations')); }); diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management.ts index defb7763d89ce..d291e6cfb7103 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management.ts @@ -563,21 +563,6 @@ export default function ({ getService }: FtrProviderContext) { await releaseTasksWaitingForEventToComplete('releaseSecondWaveOfTasks'); }); - it('should increment attempts when task fails on markAsRunning', async () => { - const originalTask = await scheduleTask({ - taskType: 'sampleTask', - params: { throwOnMarkAsRunning: true }, - }); - - expect(originalTask.attempts).to.eql(0); - - // Wait for task manager to attempt running the task a second time - await retry.try(async () => { - const task = await currentTask(originalTask.id); - expect(task.attempts).to.eql(2); - }); - }); - it('should return a task run error result when trying to run a non-existent task', async () => { // runSoon should fail const failedRunSoonResult = await runTaskSoon({ diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management_removed_types.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management_removed_types.ts index 5c7ef55577861..aae90a52572c7 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management_removed_types.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_management_removed_types.ts @@ -56,6 +56,11 @@ export default function ({ getService }: FtrProviderContext) { await esArchiver.unload('x-pack/test/functional/es_archives/task_manager_removed_types'); }); + afterEach(async () => { + // clean up after each test + return await request.delete('/api/sample_tasks').set('kbn-xsrf', 'xxx').expect(200); + }); + function scheduleTask( task: Partial ): Promise { diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_partitions.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_partitions.ts similarity index 98% rename from x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_partitions.ts rename to x-pack/test/plugin_api_integration/test_suites/task_manager/task_partitions.ts index 5a4f956655ab3..57e7fc107a7b4 100644 --- a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_partitions.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_partitions.ts @@ -166,7 +166,7 @@ export default function ({ getService }: FtrProviderContext) { await updateKibanaNodes(); await setTimeoutAsync(10000); - const tasksToSchedule = []; + const tasksToSchedule: Array> = []; for (let i = 0; i < 3; i++) { tasksToSchedule.push( scheduleTask({ diff --git a/x-pack/test/task_manager_claimer_mget/config.ts b/x-pack/test/task_manager_claimer_update_by_query/config.ts similarity index 92% rename from x-pack/test/task_manager_claimer_mget/config.ts rename to x-pack/test/task_manager_claimer_update_by_query/config.ts index 899cfb592be18..ddae0d7b04d36 100644 --- a/x-pack/test/task_manager_claimer_mget/config.ts +++ b/x-pack/test/task_manager_claimer_update_by_query/config.ts @@ -20,7 +20,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { apps: integrationConfig.get('apps'), screenshots: integrationConfig.get('screenshots'), junit: { - reportName: 'Task Manager MGet Claimer Functional Tests', + reportName: 'Task Manager Update By Query Claimer Functional Tests', }, kbnTestServer: { ...integrationConfig.get('kbnTestServer'), @@ -28,7 +28,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { ...integrationConfig.get('kbnTestServer.serverArgs'), '--xpack.eventLog.logEntries=true', '--xpack.eventLog.indexEntries=true', - '--xpack.task_manager.claim_strategy="mget"', + '--xpack.task_manager.claim_strategy="update_by_query"', '--xpack.task_manager.monitored_aggregated_stats_refresh_rate=5000', '--xpack.task_manager.ephemeral_tasks.enabled=false', '--xpack.task_manager.ephemeral_tasks.request_capacity=100', diff --git a/x-pack/test/task_manager_claimer_mget/ftr_provider_context.d.ts b/x-pack/test/task_manager_claimer_update_by_query/ftr_provider_context.d.ts similarity index 100% rename from x-pack/test/task_manager_claimer_mget/ftr_provider_context.d.ts rename to x-pack/test/task_manager_claimer_update_by_query/ftr_provider_context.d.ts diff --git a/x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/kibana.jsonc b/x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/kibana.jsonc similarity index 64% rename from x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/kibana.jsonc rename to x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/kibana.jsonc index f030d59f9cde3..b5ed96bc1c9e6 100644 --- a/x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/kibana.jsonc +++ b/x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/kibana.jsonc @@ -1,9 +1,9 @@ { "type": "plugin", - "id": "@kbn/sample-task-plugin-mget", + "id": "@kbn/sample-task-plugin-update-by-query", "owner": "@elastic/response-ops", "plugin": { - "id": "sampleTaskPluginMget", + "id": "sampleTaskPluginUpdateByQuery", "server": true, "browser": false, "requiredPlugins": [ diff --git a/x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/package.json b/x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/package.json similarity index 63% rename from x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/package.json rename to x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/package.json index 201d6a964ea1f..6a6bd436fc307 100644 --- a/x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/package.json +++ b/x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/package.json @@ -1,11 +1,11 @@ { - "name": "@kbn/sample-task-plugin-mget", + "name": "@kbn/sample-task-plugin-update-by-query", "version": "1.0.0", "kibana": { "version": "kibana", "templateVersion": "1.0.0" }, - "main": "target/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget", + "main": "target/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_update_by_query", "scripts": { "kbn": "node ../../../../../scripts/kbn.js", "build": "rm -rf './target' && ../../../../../node_modules/.bin/tsc" diff --git a/x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/server/index.ts b/x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/server/index.ts similarity index 100% rename from x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/server/index.ts rename to x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/server/index.ts diff --git a/x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/server/init_routes.ts b/x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/server/init_routes.ts similarity index 100% rename from x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/server/init_routes.ts rename to x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/server/init_routes.ts diff --git a/x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/server/plugin.ts b/x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/server/plugin.ts similarity index 98% rename from x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/server/plugin.ts rename to x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/server/plugin.ts index 9f6944e4cff3a..eceb750c207b8 100644 --- a/x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/server/plugin.ts +++ b/x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/server/plugin.ts @@ -371,9 +371,6 @@ export class SampleTaskManagerFixturePlugin }, async beforeMarkRunning(context) { - if (context.taskInstance?.params?.originalParams?.throwOnMarkAsRunning) { - throw new Error(`Sample task ${context.taskInstance.id} threw on MarkAsRunning`); - } return context; }, }); diff --git a/x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/tsconfig.json b/x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/tsconfig.json similarity index 100% rename from x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget/tsconfig.json rename to x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget/tsconfig.json diff --git a/x-pack/test/task_manager_claimer_mget/services.ts b/x-pack/test/task_manager_claimer_update_by_query/services.ts similarity index 100% rename from x-pack/test/task_manager_claimer_mget/services.ts rename to x-pack/test/task_manager_claimer_update_by_query/services.ts diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/background_task_utilization_route.ts b/x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/background_task_utilization_route.ts similarity index 100% rename from x-pack/test/task_manager_claimer_mget/test_suites/task_manager/background_task_utilization_route.ts rename to x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/background_task_utilization_route.ts diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts b/x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/health_route.ts similarity index 99% rename from x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts rename to x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/health_route.ts index 23e387061830a..c5efe2622055e 100644 --- a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/health_route.ts +++ b/x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/health_route.ts @@ -131,7 +131,7 @@ export default function ({ getService }: FtrProviderContext) { const health = await getHealth(); expect(health.status).to.eql('OK'); expect(health.stats.configuration.value).to.eql({ - poll_interval: 500, + poll_interval: 3000, monitored_aggregated_stats_refresh_rate: monitoredAggregatedStatsRefreshRate, monitored_stats_running_average_window: 50, monitored_task_execution_thresholds: { @@ -147,7 +147,7 @@ export default function ({ getService }: FtrProviderContext) { as_workers: 10, as_cost: 20, }, - claim_strategy: 'mget', + claim_strategy: 'update_by_query', }); }); diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/index.ts b/x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/index.ts similarity index 86% rename from x-pack/test/task_manager_claimer_mget/test_suites/task_manager/index.ts rename to x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/index.ts index 83005f2d55342..9d51c2c6c271a 100644 --- a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/index.ts +++ b/x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/index.ts @@ -8,7 +8,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { - describe('task_manager with mget task claimer', function taskManagerSuite() { + describe('task_manager with update by query task claimer', function taskManagerSuite() { loadTestFile(require.resolve('./task_priority')); loadTestFile(require.resolve('./background_task_utilization_route')); loadTestFile(require.resolve('./metrics_route')); @@ -16,7 +16,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./task_management')); loadTestFile(require.resolve('./task_management_scheduled_at')); loadTestFile(require.resolve('./task_management_removed_types')); - loadTestFile(require.resolve('./task_partitions')); loadTestFile(require.resolve('./migrations')); }); diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/metrics_route.ts b/x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/metrics_route.ts similarity index 100% rename from x-pack/test/task_manager_claimer_mget/test_suites/task_manager/metrics_route.ts rename to x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/metrics_route.ts diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/migrations.ts b/x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/migrations.ts similarity index 100% rename from x-pack/test/task_manager_claimer_mget/test_suites/task_manager/migrations.ts rename to x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/migrations.ts diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management.ts b/x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/task_management.ts similarity index 100% rename from x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management.ts rename to x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/task_management.ts diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management_removed_types.ts b/x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/task_management_removed_types.ts similarity index 100% rename from x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management_removed_types.ts rename to x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/task_management_removed_types.ts diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management_scheduled_at.ts b/x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/task_management_scheduled_at.ts similarity index 100% rename from x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_management_scheduled_at.ts rename to x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/task_management_scheduled_at.ts diff --git a/x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_priority.ts b/x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/task_priority.ts similarity index 100% rename from x-pack/test/task_manager_claimer_mget/test_suites/task_manager/task_priority.ts rename to x-pack/test/task_manager_claimer_update_by_query/test_suites/task_manager/task_priority.ts diff --git a/yarn.lock b/yarn.lock index 7f7b152c89c03..a1a3d604833c9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6224,7 +6224,7 @@ version "0.0.0" uid "" -"@kbn/sample-task-plugin-mget@link:x-pack/test/task_manager_claimer_mget/plugins/sample_task_plugin_mget": +"@kbn/sample-task-plugin-update-by-query@link:x-pack/test/task_manager_claimer_update_by_query/plugins/sample_task_plugin_mget": version "0.0.0" uid "" From 10f234c131a9884d22e93ed9288939be1f5e847d Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Sat, 26 Oct 2024 00:53:46 +1100 Subject: [PATCH 027/135] skip failing test suite (#195573) --- .../alerting/group4/alerts_as_data/alerts_as_data_flapping.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/alerts_as_data_flapping.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_flapping.ts index 9bab20d763fcb..eb6a670f24a42 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_flapping.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group4/alerts_as_data/alerts_as_data_flapping.ts @@ -35,7 +35,8 @@ export default function createAlertsAsDataFlappingTest({ getService }: FtrProvid const alertsAsDataIndex = '.alerts-test.patternfiring.alerts-default'; - describe('alerts as data flapping', function () { + // Failing: See https://github.com/elastic/kibana/issues/195573 + describe.skip('alerts as data flapping', function () { this.tags('skipFIPS'); beforeEach(async () => { await es.deleteByQuery({ From a5517d9d2cf38369fc46ea9622ce36c768436aad Mon Sep 17 00:00:00 2001 From: Gerard Soldevila Date: Fri, 25 Oct 2024 16:05:27 +0200 Subject: [PATCH 028/135] [Sustainable Kibana Architecture] Update plugins (wave #1) (#195375) ## Summary Follow-up of https://github.com/elastic/kibana/pull/195367 As part of the Sustainable Kibana Architecture initiative, this PR leverages the mechanisms and concepts introduced in https://github.com/elastic/kibana/pull/194810, updating plugins that were considered to be solution-specific in Luke's [PoC](https://github.com/elastic/kibana/pull/179710). This might trigger linting rule violations in CI, and help uncover conflicts related to forbidden dependencies. As soon as they are resolved, we can proceed to classify solutions' plugins. --- .eslintrc.js | 48 +++++++++++++++++++ src/plugins/advanced_settings/kibana.jsonc | 14 ++++-- .../selection/kibana.jsonc | 26 +++++++--- src/plugins/bfetch/kibana.jsonc | 10 ++-- .../chart_expressions/common/kibana.jsonc | 8 +++- .../expression_gauge/kibana.jsonc | 10 ++-- .../expression_heatmap/kibana.jsonc | 10 ++-- .../expression_legacy_metric/kibana.jsonc | 10 ++-- .../expression_metric/kibana.jsonc | 10 ++-- .../expression_partition_vis/kibana.jsonc | 10 ++-- .../expression_tagcloud/kibana.jsonc | 10 ++-- .../expression_xy/kibana.jsonc | 10 ++-- src/plugins/charts/kibana.jsonc | 10 ++-- src/plugins/console/kibana.jsonc | 10 ++-- src/plugins/content_management/kibana.jsonc | 10 ++-- src/plugins/controls/kibana.jsonc | 16 +++++-- src/plugins/custom_integrations/kibana.jsonc | 10 ++-- src/plugins/dashboard/kibana.jsonc | 10 ++-- src/plugins/data/kibana.jsonc | 6 ++- src/plugins/data_view_editor/kibana.jsonc | 10 ++-- .../data_view_field_editor/kibana.jsonc | 10 ++-- src/plugins/data_view_management/kibana.jsonc | 10 ++-- src/plugins/data_views/kibana.jsonc | 14 ++++-- src/plugins/dev_tools/kibana.jsonc | 10 ++-- src/plugins/discover/kibana.jsonc | 21 ++++++-- src/plugins/embeddable/kibana.jsonc | 25 +++++++--- src/plugins/es_ui_shared/kibana.jsonc | 10 ++-- src/plugins/event_annotation/kibana.jsonc | 14 ++++-- .../event_annotation_listing/kibana.jsonc | 14 ++++-- src/plugins/expression_error/kibana.jsonc | 10 ++-- src/plugins/expression_image/kibana.jsonc | 10 ++-- src/plugins/expression_metric/kibana.jsonc | 10 ++-- .../expression_repeat_image/kibana.jsonc | 10 ++-- .../expression_reveal_image/kibana.jsonc | 10 ++-- src/plugins/expression_shape/kibana.jsonc | 10 ++-- src/plugins/expressions/kibana.jsonc | 10 ++-- src/plugins/field_formats/kibana.jsonc | 10 ++-- src/plugins/files/kibana.jsonc | 10 ++-- src/plugins/files_management/kibana.jsonc | 10 ++-- src/plugins/ftr_apis/kibana.jsonc | 10 ++-- src/plugins/guided_onboarding/kibana.jsonc | 15 ++++-- src/plugins/home/kibana.jsonc | 20 ++++++-- src/plugins/image_embeddable/kibana.jsonc | 23 +++++++-- src/plugins/input_control_vis/kibana.jsonc | 13 +++-- src/plugins/inspector/kibana.jsonc | 10 ++-- src/plugins/interactive_setup/kibana.jsonc | 12 +++-- src/plugins/kibana_overview/kibana.jsonc | 10 ++-- src/plugins/kibana_react/kibana.jsonc | 10 ++-- .../kibana_usage_collection/kibana.jsonc | 10 ++-- src/plugins/kibana_utils/kibana.jsonc | 10 ++-- src/plugins/links/kibana.jsonc | 19 ++++++-- src/plugins/management/kibana.jsonc | 10 ++-- src/plugins/maps_ems/kibana.jsonc | 10 ++-- src/plugins/navigation/kibana.jsonc | 19 ++++++-- src/plugins/newsfeed/kibana.jsonc | 10 ++-- src/plugins/no_data_page/kibana.jsonc | 12 +++-- src/plugins/presentation_panel/kibana.jsonc | 15 ++++-- src/plugins/presentation_util/kibana.jsonc | 18 +++++-- src/plugins/saved_objects/kibana.jsonc | 10 ++-- src/plugins/saved_objects_finder/kibana.jsonc | 14 ++++-- .../saved_objects_management/kibana.jsonc | 10 ++-- .../saved_objects_tagging_oss/kibana.jsonc | 10 ++-- src/plugins/saved_search/kibana.jsonc | 26 +++++++--- src/plugins/screenshot_mode/kibana.jsonc | 12 +++-- src/plugins/share/kibana.jsonc | 10 ++-- src/plugins/telemetry/kibana.jsonc | 12 +++-- .../telemetry_collection_manager/kibana.jsonc | 10 ++-- .../telemetry_management_section/kibana.jsonc | 8 +++- src/plugins/ui_actions/kibana.jsonc | 10 ++-- src/plugins/ui_actions_enhanced/kibana.jsonc | 10 ++-- src/plugins/unified_doc_viewer/kibana.jsonc | 25 +++++++--- src/plugins/unified_histogram/kibana.jsonc | 10 ++-- src/plugins/unified_search/kibana.jsonc | 10 ++-- src/plugins/url_forwarding/kibana.jsonc | 12 +++-- src/plugins/usage_collection/kibana.jsonc | 10 ++-- src/plugins/vis_default_editor/kibana.jsonc | 12 +++-- src/plugins/vis_type_markdown/kibana.jsonc | 10 ++-- src/plugins/vis_types/gauge/kibana.jsonc | 10 ++-- src/plugins/vis_types/heatmap/kibana.jsonc | 10 ++-- src/plugins/vis_types/metric/kibana.jsonc | 10 ++-- src/plugins/vis_types/pie/kibana.jsonc | 10 ++-- src/plugins/vis_types/table/kibana.jsonc | 10 ++-- src/plugins/vis_types/tagcloud/kibana.jsonc | 10 ++-- src/plugins/vis_types/timelion/kibana.jsonc | 10 ++-- src/plugins/vis_types/timeseries/kibana.jsonc | 10 ++-- src/plugins/vis_types/vega/kibana.jsonc | 10 ++-- src/plugins/vis_types/vislib/kibana.jsonc | 10 ++-- src/plugins/vis_types/xy/kibana.jsonc | 10 ++-- src/plugins/visualizations/kibana.jsonc | 17 +++++-- x-pack/packages/kbn-ai-assistant/kibana.jsonc | 4 +- .../alerting_test_data/kibana.jsonc | 4 +- x-pack/plugins/actions/kibana.jsonc | 10 ++-- x-pack/plugins/aiops/kibana.jsonc | 12 +++-- x-pack/plugins/alerting/kibana.jsonc | 12 +++-- x-pack/plugins/banners/kibana.jsonc | 14 ++++-- x-pack/plugins/canvas/kibana.jsonc | 14 ++++-- x-pack/plugins/cases/kibana.jsonc | 16 ++++--- x-pack/plugins/cloud/kibana.jsonc | 10 ++-- x-pack/plugins/cloud_defend/kibana.jsonc | 24 +++++++--- .../cloud_chat/kibana.jsonc | 12 +++-- .../cloud_data_migration/kibana.jsonc | 10 ++-- .../cloud_experiments/kibana.jsonc | 10 ++-- .../cloud_full_story/kibana.jsonc | 10 ++-- .../cloud_links/kibana.jsonc | 18 ++++--- .../cloud_security_posture/kibana.jsonc | 24 +++++++--- .../cross_cluster_replication/kibana.jsonc | 10 ++-- x-pack/plugins/custom_branding/kibana.jsonc | 10 ++-- .../plugins/dashboard_enhanced/kibana.jsonc | 15 ++++-- x-pack/plugins/data_visualizer/kibana.jsonc | 10 ++-- x-pack/plugins/discover_enhanced/kibana.jsonc | 10 ++-- .../drilldowns/url_drilldown/kibana.jsonc | 10 ++-- .../ecs_data_quality_dashboard/kibana.jsonc | 14 ++++-- x-pack/plugins/elastic_assistant/kibana.jsonc | 10 ++-- .../plugins/embeddable_enhanced/kibana.jsonc | 10 ++-- .../encrypted_saved_objects/kibana.jsonc | 10 ++-- x-pack/plugins/event_log/kibana.jsonc | 10 ++-- x-pack/plugins/features/kibana.jsonc | 10 ++-- x-pack/plugins/file_upload/kibana.jsonc | 11 +++-- x-pack/plugins/fleet/kibana.jsonc | 12 +++-- x-pack/plugins/global_search/kibana.jsonc | 10 ++-- x-pack/plugins/global_search_bar/kibana.jsonc | 10 ++-- .../global_search_providers/kibana.jsonc | 10 ++-- x-pack/plugins/graph/kibana.jsonc | 10 ++-- x-pack/plugins/grokdebugger/kibana.jsonc | 10 ++-- x-pack/plugins/index_management/kibana.jsonc | 38 ++++++++++++--- .../plugins/kubernetes_security/kibana.jsonc | 10 ++-- x-pack/plugins/lens/kibana.jsonc | 14 ++++-- x-pack/plugins/license_api_guard/kibana.jsonc | 10 ++-- .../plugins/license_management/kibana.jsonc | 10 ++-- x-pack/plugins/licensing/kibana.jsonc | 10 ++-- x-pack/plugins/lists/kibana.jsonc | 10 ++-- x-pack/plugins/logstash/kibana.jsonc | 10 ++-- x-pack/plugins/maps/kibana.jsonc | 12 +++-- x-pack/plugins/ml/kibana.jsonc | 19 ++++++-- x-pack/plugins/monitoring/kibana.jsonc | 20 ++++++-- x-pack/plugins/notifications/kibana.jsonc | 10 ++-- .../apm/ftr_e2e/kibana.jsonc | 2 + .../observability_solution/apm/kibana.jsonc | 26 +++++++--- .../apm_data_access/kibana.jsonc | 24 +++++++--- .../dataset_quality/kibana.jsonc | 19 ++++++-- .../exploratory_view/kibana.jsonc | 29 ++++++++--- .../logs_explorer/kibana.jsonc | 26 +++++++--- .../metrics_data_access/kibana.jsonc | 20 ++++++-- .../observability/kibana.jsonc | 19 ++++++-- .../observability_ai_assistant/kibana.jsonc | 33 +++++++++---- .../kibana.jsonc | 24 +++++++--- .../observability_logs_explorer/kibana.jsonc | 10 ++-- .../observability_onboarding/e2e/kibana.jsonc | 2 + .../observability_onboarding/kibana.jsonc | 29 ++++++++--- .../observability_shared/kibana.jsonc | 37 ++++++++++---- .../profiling/kibana.jsonc | 31 +++++++----- .../profiling_data_access/kibana.jsonc | 22 ++++++--- .../observability_solution/slo/kibana.jsonc | 10 ++-- .../synthetics/kibana.jsonc | 17 +++++-- .../uptime/kibana.jsonc | 28 ++++++++--- .../observability_solution/ux/kibana.jsonc | 15 ++++-- x-pack/plugins/painless_lab/kibana.jsonc | 10 ++-- x-pack/plugins/remote_clusters/kibana.jsonc | 10 ++-- x-pack/plugins/reporting/kibana.jsonc | 28 ++++++++--- x-pack/plugins/rollup/kibana.jsonc | 10 ++-- x-pack/plugins/rule_registry/kibana.jsonc | 6 ++- x-pack/plugins/runtime_fields/kibana.jsonc | 10 ++-- .../saved_objects_tagging/kibana.jsonc | 10 ++-- x-pack/plugins/screenshotting/kibana.jsonc | 10 ++-- x-pack/plugins/searchprofiler/kibana.jsonc | 10 ++-- x-pack/plugins/security/kibana.jsonc | 14 ++++-- x-pack/plugins/security_solution/kibana.jsonc | 8 +++- .../security_solution_ess/kibana.jsonc | 21 +++++--- .../security_solution_serverless/kibana.jsonc | 14 ++++-- x-pack/plugins/serverless/kibana.jsonc | 12 +++-- .../serverless_observability/kibana.jsonc | 12 +++-- x-pack/plugins/serverless_search/kibana.jsonc | 14 ++++-- x-pack/plugins/session_view/kibana.jsonc | 25 +++++++--- x-pack/plugins/snapshot_restore/kibana.jsonc | 10 ++-- x-pack/plugins/spaces/kibana.jsonc | 18 ++++--- x-pack/plugins/stack_alerts/kibana.jsonc | 14 ++++-- x-pack/plugins/stack_connectors/kibana.jsonc | 10 ++-- x-pack/plugins/task_manager/kibana.jsonc | 10 ++-- .../telemetry_collection_xpack/kibana.jsonc | 10 ++-- .../plugins/threat_intelligence/kibana.jsonc | 10 ++-- x-pack/plugins/timelines/kibana.jsonc | 10 ++-- x-pack/plugins/transform/kibana.jsonc | 14 ++++-- x-pack/plugins/translations/kibana.jsonc | 10 ++-- .../plugins/triggers_actions_ui/kibana.jsonc | 10 ++-- x-pack/plugins/watcher/kibana.jsonc | 10 ++-- 185 files changed, 1768 insertions(+), 694 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 3c67594513c0e..0e486a64c9440 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1978,6 +1978,54 @@ module.exports = { 'max-classes-per-file': 'off', }, }, + { + files: [ + 'packages/kbn-reporting/common/**', // TODO @elastic/appex-sharedux - A package depending on a plugin: @kbn/screenshotting-plugin, can we move theser interfaces to a platform/shared package? + 'packages/kbn-reporting/export_types/pdf_common/**', // TODO @elastic/appex-sharedux - A package depending on a plugin: @kbn/screenshotting-plugin, can we move theser interfaces to a platform/shared package? + 'packages/kbn-reporting/export_types/pdf/**', // TODO @elastic/appex-sharedux - A package depending on a plugin: @kbn/screenshotting-plugin, can we move theser interfaces to a platform/shared package? + 'packages/kbn-reporting/export_types/png_common/**', // TODO @elastic/appex-sharedux - A package depending on a plugin: @kbn/screenshotting-plugin, can we move theser interfaces to a platform/shared package? + 'packages/kbn-reporting/export_types/png/**', // TODO @elastic/appex-sharedux - A package depending on a plugin: @kbn/screenshotting-plugin, can we move theser interfaces to a platform/shared package? + 'packages/kbn-reporting/public/**', // TODO @elastic/appex-sharedux - A package depending on a plugin: @kbn/screenshotting-plugin, can we move theser interfaces to a platform/shared package? + 'packages/kbn-reporting/server/**', // TODO @elastic/appex-sharedux - A package depending on a plugin: @kbn/screenshotting-plugin, can we move theser interfaces to a platform/shared package? + 'packages/shared-ux/page/analytics_no_data/types/**', + 'scripts/create_observability_rules.js', // TODO - is importing "@kbn/observability-alerting-test-data" (observability/private) + 'src/cli_setup/**', // TODO @kibana/operations - is importing "@kbn/interactive-setup-plugin" (platform/private) + 'src/dev/build/tasks/install_chromium.ts', // TODO @kibana/operations - is importing "@kbn/screenshotting-plugin" (platform/private) + 'src/plugins/ai_assistant_management/selection/**', + 'src/plugins/dashboard/**', + 'src/plugins/discover/**', + 'test/**', + 'x-pack/examples/exploratory_view_example/**', + 'x-pack/examples/screenshotting_example/**', + 'x-pack/examples/ui_actions_enhanced_examples/**', + 'x-pack/packages/security-solution/data_table/**', + 'x-pack/plugins/aiops/**', + 'x-pack/plugins/data_quality/**', + 'x-pack/plugins/ingest_pipelines/**', + 'x-pack/plugins/ml/**', + 'x-pack/plugins/monitoring/**', + 'x-pack/plugins/observability_solution/infra/**', + 'x-pack/plugins/observability_solution/inventory/**', + 'x-pack/plugins/observability_solution/investigate_app/**', + 'x-pack/plugins/observability_solution/investigate/**', + 'x-pack/plugins/observability_solution/logs_shared/**', + 'x-pack/plugins/observability_solution/metrics_data_access/**', + 'x-pack/plugins/observability_solution/observability_ai_assistant_app/**', + 'x-pack/plugins/observability_solution/observability_ai_assistant_management/**', + 'x-pack/plugins/observability_solution/observability/**', + 'x-pack/plugins/observability_solution/slo/**', + 'x-pack/plugins/observability_solution/synthetics/e2e/**', + 'x-pack/plugins/osquery/**', + 'x-pack/plugins/search_assistant/**', + 'x-pack/test_serverless/**', + 'x-pack/test/**', + 'x-pack/test/plugin_functional/plugins/resolver_test/**', + ], + rules: { + '@kbn/imports/no_group_crossing_manifests': 'warn', + '@kbn/imports/no_group_crossing_imports': 'warn', + }, + }, ], }; diff --git a/src/plugins/advanced_settings/kibana.jsonc b/src/plugins/advanced_settings/kibana.jsonc index c0a338935a590..795827e204aa0 100644 --- a/src/plugins/advanced_settings/kibana.jsonc +++ b/src/plugins/advanced_settings/kibana.jsonc @@ -1,11 +1,16 @@ { "type": "plugin", "id": "@kbn/advanced-settings-plugin", - "owner": "@elastic/appex-sharedux @elastic/kibana-management", + "owner": [ + "@elastic/appex-sharedux", + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "advancedSettings", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "management" ], @@ -13,7 +18,6 @@ "home", "usageCollection" ], - "requiredBundles": [ - ] + "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/src/plugins/ai_assistant_management/selection/kibana.jsonc b/src/plugins/ai_assistant_management/selection/kibana.jsonc index 2e653bb391c34..715b90f1d4d79 100644 --- a/src/plugins/ai_assistant_management/selection/kibana.jsonc +++ b/src/plugins/ai_assistant_management/selection/kibana.jsonc @@ -1,16 +1,28 @@ { "type": "plugin", "id": "@kbn/ai-assistant-management-plugin", - "owner": "@elastic/obs-knowledge-team", + "owner": [ + "@elastic/obs-knowledge-team" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "aiAssistantManagementSelection", - "server": true, "browser": true, - "requiredPlugins": ["management"], - "optionalPlugins": ["home", "serverless", "features"], - "requiredBundles": ["kibanaReact"], + "server": true, "configPath": [ "aiAssistantManagementSelection" ], - }, -} + "requiredPlugins": [ + "management" + ], + "optionalPlugins": [ + "home", + "serverless", + "features" + ], + "requiredBundles": [ + "kibanaReact" + ] + } +} \ No newline at end of file diff --git a/src/plugins/bfetch/kibana.jsonc b/src/plugins/bfetch/kibana.jsonc index 97d9571238296..39a8866f3b79b 100644 --- a/src/plugins/bfetch/kibana.jsonc +++ b/src/plugins/bfetch/kibana.jsonc @@ -1,14 +1,18 @@ { "type": "plugin", "id": "@kbn/bfetch-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "description": "Considering using bfetch capabilities when fetching large amounts of data. This services supports batching HTTP requests and streaming responses back.", "plugin": { "id": "bfetch", - "server": true, "browser": true, + "server": true, "requiredBundles": [ "kibanaUtils" ] } -} +} \ No newline at end of file diff --git a/src/plugins/chart_expressions/common/kibana.jsonc b/src/plugins/chart_expressions/common/kibana.jsonc index 546179cce219c..f3d05f4a0581e 100644 --- a/src/plugins/chart_expressions/common/kibana.jsonc +++ b/src/plugins/chart_expressions/common/kibana.jsonc @@ -1,5 +1,9 @@ { "type": "shared-common", "id": "@kbn/chart-expressions-common", - "owner": "@elastic/kibana-visualizations" -} + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared" +} \ No newline at end of file diff --git a/src/plugins/chart_expressions/expression_gauge/kibana.jsonc b/src/plugins/chart_expressions/expression_gauge/kibana.jsonc index 6f3182e033d6a..70d29fec6336a 100644 --- a/src/plugins/chart_expressions/expression_gauge/kibana.jsonc +++ b/src/plugins/chart_expressions/expression_gauge/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/expression-gauge-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared", "description": "Expression Gauge plugin adds a `gauge` renderer and function to the expression plugin. The renderer will display the `gauge` chart.", "plugin": { "id": "expressionGauge", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "fieldFormats", @@ -25,4 +29,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/chart_expressions/expression_heatmap/kibana.jsonc b/src/plugins/chart_expressions/expression_heatmap/kibana.jsonc index aca569c8f606d..5852e882efe5d 100644 --- a/src/plugins/chart_expressions/expression_heatmap/kibana.jsonc +++ b/src/plugins/chart_expressions/expression_heatmap/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/expression-heatmap-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared", "description": "Expression Heatmap plugin adds a `heatmap` renderer and function to the expression plugin. The renderer will display the `heatmap` chart.", "plugin": { "id": "expressionHeatmap", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "fieldFormats", @@ -25,4 +29,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/chart_expressions/expression_legacy_metric/kibana.jsonc b/src/plugins/chart_expressions/expression_legacy_metric/kibana.jsonc index b0d916119fd73..88fdca99e016b 100644 --- a/src/plugins/chart_expressions/expression_legacy_metric/kibana.jsonc +++ b/src/plugins/chart_expressions/expression_legacy_metric/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/expression-legacy-metric-vis-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared", "description": "Adds a `metric` renderer and function to the expression plugin. The renderer will display the `legacy metric` chart.", "plugin": { "id": "expressionLegacyMetricVis", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "fieldFormats", @@ -22,4 +26,4 @@ "kibanaUtils" ] } -} +} \ No newline at end of file diff --git a/src/plugins/chart_expressions/expression_metric/kibana.jsonc b/src/plugins/chart_expressions/expression_metric/kibana.jsonc index c8c6f6b0c8565..2f65e12b11999 100644 --- a/src/plugins/chart_expressions/expression_metric/kibana.jsonc +++ b/src/plugins/chart_expressions/expression_metric/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/expression-metric-vis-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared", "description": "Adds a `metric` renderer and function to the expression plugin. The renderer will display the `metric` chart.", "plugin": { "id": "expressionMetricVis", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "fieldFormats", @@ -22,4 +26,4 @@ "kibanaUtils" ] } -} +} \ No newline at end of file diff --git a/src/plugins/chart_expressions/expression_partition_vis/kibana.jsonc b/src/plugins/chart_expressions/expression_partition_vis/kibana.jsonc index f69f934fc3005..3ac2e44a23d97 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/kibana.jsonc +++ b/src/plugins/chart_expressions/expression_partition_vis/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/expression-partition-vis-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared", "description": "Expression Partition Visualization plugin adds a `partitionVis` renderer and `pieVis`, `mosaicVis`, `treemapVis`, `waffleVis` functions to the expression plugin. The renderer will display the `pie`, `waffle`, `treemap` and `mosaic` charts.", "plugin": { "id": "expressionPartitionVis", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "charts", "data", @@ -25,4 +29,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/chart_expressions/expression_tagcloud/kibana.jsonc b/src/plugins/chart_expressions/expression_tagcloud/kibana.jsonc index 4cb1898caaf43..a6b71200a4620 100644 --- a/src/plugins/chart_expressions/expression_tagcloud/kibana.jsonc +++ b/src/plugins/chart_expressions/expression_tagcloud/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/expression-tagcloud-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared", "description": "Expression Tagcloud plugin adds a `tagcloud` renderer and function to the expression plugin. The renderer will display the `Wordcloud` chart.", "plugin": { "id": "expressionTagcloud", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "data", "expressions", @@ -25,4 +29,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/chart_expressions/expression_xy/kibana.jsonc b/src/plugins/chart_expressions/expression_xy/kibana.jsonc index 80a414b5e4d0a..7f819610d7e32 100644 --- a/src/plugins/chart_expressions/expression_xy/kibana.jsonc +++ b/src/plugins/chart_expressions/expression_xy/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/expression-xy-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared", "description": "Expression XY plugin adds a `xy` renderer and function to the expression plugin. The renderer will display the `xy` chart.", "plugin": { "id": "expressionXY", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "charts", @@ -21,4 +25,4 @@ ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/src/plugins/charts/kibana.jsonc b/src/plugins/charts/kibana.jsonc index 8c00cd40f4ad3..16475bdda3b9f 100644 --- a/src/plugins/charts/kibana.jsonc +++ b/src/plugins/charts/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/charts-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "charts", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "data" @@ -14,4 +18,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/console/kibana.jsonc b/src/plugins/console/kibana.jsonc index ae0cac514b67d..a57eb8f3eb3d1 100644 --- a/src/plugins/console/kibana.jsonc +++ b/src/plugins/console/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/console-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "console", - "server": true, "browser": true, + "server": true, "configPath": [ "console" ], @@ -23,4 +27,4 @@ "kibanaUtils" ] } -} +} \ No newline at end of file diff --git a/src/plugins/content_management/kibana.jsonc b/src/plugins/content_management/kibana.jsonc index 7ebfe75180658..a2d43504b52b2 100644 --- a/src/plugins/content_management/kibana.jsonc +++ b/src/plugins/content_management/kibana.jsonc @@ -1,14 +1,18 @@ { "type": "plugin", "id": "@kbn/content-management-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "description": "Content management app", "plugin": { "id": "contentManagement", - "server": true, "browser": true, + "server": true, "optionalPlugins": [ "usageCollection" ] } -} +} \ No newline at end of file diff --git a/src/plugins/controls/kibana.jsonc b/src/plugins/controls/kibana.jsonc index add8c14ee3391..76fb9f7960412 100644 --- a/src/plugins/controls/kibana.jsonc +++ b/src/plugins/controls/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/controls-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared", "description": "The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls", "plugin": { "id": "controls", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "presentationUtil", "embeddable", @@ -15,7 +19,9 @@ "unifiedSearch", "uiActions" ], - "extraPublicDirs": ["common"], - "requiredBundles": [] + "requiredBundles": [], + "extraPublicDirs": [ + "common" + ] } -} +} \ No newline at end of file diff --git a/src/plugins/custom_integrations/kibana.jsonc b/src/plugins/custom_integrations/kibana.jsonc index fd8a429c0d666..b42bc6a932ea8 100644 --- a/src/plugins/custom_integrations/kibana.jsonc +++ b/src/plugins/custom_integrations/kibana.jsonc @@ -1,14 +1,18 @@ { "type": "plugin", "id": "@kbn/custom-integrations-plugin", - "owner": "@elastic/fleet", + "owner": [ + "@elastic/fleet" + ], + "group": "platform", + "visibility": "shared", "description": "Add custom data integrations so they can be displayed in the Fleet integrations app", "plugin": { "id": "customIntegrations", - "server": true, "browser": true, + "server": true, "extraPublicDirs": [ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/dashboard/kibana.jsonc b/src/plugins/dashboard/kibana.jsonc index d7b0f2c16e04b..c84d4a9dc293d 100644 --- a/src/plugins/dashboard/kibana.jsonc +++ b/src/plugins/dashboard/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/dashboard-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared", "description": "Adds the Dashboard app to Kibana", "plugin": { "id": "dashboard", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "data", "dataViews", @@ -46,4 +50,4 @@ "savedObjects" ] } -} +} \ No newline at end of file diff --git a/src/plugins/data/kibana.jsonc b/src/plugins/data/kibana.jsonc index c109bde374680..84e692c42648a 100644 --- a/src/plugins/data/kibana.jsonc +++ b/src/plugins/data/kibana.jsonc @@ -5,6 +5,8 @@ "@elastic/kibana-visualizations", "@elastic/kibana-data-discovery" ], + "group": "platform", + "visibility": "shared", "description": "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.", "serviceFolders": [ "search", @@ -13,8 +15,8 @@ ], "plugin": { "id": "data", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "bfetch", "expressions", @@ -38,4 +40,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/data_view_editor/kibana.jsonc b/src/plugins/data_view_editor/kibana.jsonc index bdec3b4f4943d..04d543bdd47ec 100644 --- a/src/plugins/data_view_editor/kibana.jsonc +++ b/src/plugins/data_view_editor/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/data-view-editor-plugin", - "owner": "@elastic/kibana-data-discovery", + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared", "description": "This plugin provides the ability to create data views via a modal flyout inside Kibana apps", "plugin": { "id": "dataViewEditor", - "server": false, "browser": true, + "server": false, "requiredPlugins": [ "data", "dataViews" @@ -17,4 +21,4 @@ "esUiShared" ] } -} +} \ No newline at end of file diff --git a/src/plugins/data_view_field_editor/kibana.jsonc b/src/plugins/data_view_field_editor/kibana.jsonc index 50a336cfe0c9e..9c3e453d1b796 100644 --- a/src/plugins/data_view_field_editor/kibana.jsonc +++ b/src/plugins/data_view_field_editor/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/data-view-field-editor-plugin", - "owner": "@elastic/kibana-data-discovery", + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared", "description": "Reusable data view field editor across Kibana", "plugin": { "id": "dataViewFieldEditor", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "data", "fieldFormats", @@ -20,4 +24,4 @@ "esUiShared" ] } -} +} \ No newline at end of file diff --git a/src/plugins/data_view_management/kibana.jsonc b/src/plugins/data_view_management/kibana.jsonc index 5b827868ee1e8..c679c3b9ad964 100644 --- a/src/plugins/data_view_management/kibana.jsonc +++ b/src/plugins/data_view_management/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/data-view-management-plugin", - "owner": "@elastic/kibana-data-discovery", + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared", "description": "Data view management app", "plugin": { "id": "dataViewManagement", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "management", "data", @@ -28,4 +32,4 @@ "kibanaUtils" ] } -} +} \ No newline at end of file diff --git a/src/plugins/data_views/kibana.jsonc b/src/plugins/data_views/kibana.jsonc index 7789383b48ba4..00df1941eaa37 100644 --- a/src/plugins/data_views/kibana.jsonc +++ b/src/plugins/data_views/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/data-views-plugin", - "owner": "@elastic/kibana-data-discovery", + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared", "description": "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.", "plugin": { "id": "dataViews", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "fieldFormats", "expressions", @@ -18,9 +22,11 @@ "requiredBundles": [ "kibanaUtils" ], - "runtimePluginDependencies" : ["security"], + "runtimePluginDependencies": [ + "security" + ], "extraPublicDirs": [ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/dev_tools/kibana.jsonc b/src/plugins/dev_tools/kibana.jsonc index c269b74918619..45efd4af09fa9 100644 --- a/src/plugins/dev_tools/kibana.jsonc +++ b/src/plugins/dev_tools/kibana.jsonc @@ -1,14 +1,18 @@ { "type": "plugin", "id": "@kbn/dev-tools-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "devTools", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "urlForwarding" ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/src/plugins/discover/kibana.jsonc b/src/plugins/discover/kibana.jsonc index 1f5e25229df02..87837a38ed834 100644 --- a/src/plugins/discover/kibana.jsonc +++ b/src/plugins/discover/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/discover-plugin", - "owner": "@elastic/kibana-data-discovery", + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared", "description": "This plugin contains the Discover application and the saved search embeddable.", "plugin": { "id": "discover", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "charts", "data", @@ -44,7 +48,14 @@ "fieldsMetadata", "logsDataAccess" ], - "requiredBundles": ["kibanaUtils", "kibanaReact", "unifiedSearch", "savedObjects"], - "extraPublicDirs": ["common"] + "requiredBundles": [ + "kibanaUtils", + "kibanaReact", + "unifiedSearch", + "savedObjects" + ], + "extraPublicDirs": [ + "common" + ] } -} +} \ No newline at end of file diff --git a/src/plugins/embeddable/kibana.jsonc b/src/plugins/embeddable/kibana.jsonc index 0af5411af56dd..b617114f9fa59 100644 --- a/src/plugins/embeddable/kibana.jsonc +++ b/src/plugins/embeddable/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/embeddable-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared", "description": "Adds embeddables service to Kibana", "plugin": { "id": "embeddable", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "data", "inspector", @@ -15,8 +19,17 @@ "savedObjectsManagement", "contentManagement" ], - "optionalPlugins": ["savedObjectsTaggingOss", "usageCollection"], - "requiredBundles": ["savedObjects", "kibanaUtils", "presentationPanel"], - "extraPublicDirs": ["common"] + "optionalPlugins": [ + "savedObjectsTaggingOss", + "usageCollection" + ], + "requiredBundles": [ + "savedObjects", + "kibanaUtils", + "presentationPanel" + ], + "extraPublicDirs": [ + "common" + ] } -} +} \ No newline at end of file diff --git a/src/plugins/es_ui_shared/kibana.jsonc b/src/plugins/es_ui_shared/kibana.jsonc index 3c738268e7034..927939ae4af63 100644 --- a/src/plugins/es_ui_shared/kibana.jsonc +++ b/src/plugins/es_ui_shared/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/es-ui-shared-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "esUiShared", - "server": true, "browser": true, + "server": true, "requiredBundles": [ "dataViews" ], @@ -17,4 +21,4 @@ "static/forms/helpers/field_validators/types" ] } -} +} \ No newline at end of file diff --git a/src/plugins/event_annotation/kibana.jsonc b/src/plugins/event_annotation/kibana.jsonc index 79a2dfb105820..24fb6bfde6223 100644 --- a/src/plugins/event_annotation/kibana.jsonc +++ b/src/plugins/event_annotation/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/event-annotation-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "The Event Annotation service contains expressions for event annotations", "plugin": { "id": "eventAnnotation", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "data", @@ -18,15 +22,15 @@ "contentManagement" ], "optionalPlugins": [ - "savedObjectsTagging", + "savedObjectsTagging" ], "requiredBundles": [ "data", "savedObjectsFinder", - "dataViews", + "dataViews" ], "extraPublicDirs": [ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/event_annotation_listing/kibana.jsonc b/src/plugins/event_annotation_listing/kibana.jsonc index 1ae3534fc98df..7c6aaf4939d33 100644 --- a/src/plugins/event_annotation_listing/kibana.jsonc +++ b/src/plugins/event_annotation_listing/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/event-annotation-listing-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "The listing page for event annotations.", "plugin": { "id": "eventAnnotationListing", - "server": false, "browser": true, + "server": false, "requiredPlugins": [ "savedObjectsManagement", "eventAnnotation", @@ -16,13 +20,13 @@ "dataViews", "unifiedSearch", "kibanaUtils", - "contentManagement", + "contentManagement" ], "optionalPlugins": [ "savedObjectsTagging", - "lens", + "lens" ], "requiredBundles": [], "extraPublicDirs": [] } -} +} \ No newline at end of file diff --git a/src/plugins/expression_error/kibana.jsonc b/src/plugins/expression_error/kibana.jsonc index 28d389ce5a315..29fb16ff0d744 100644 --- a/src/plugins/expression_error/kibana.jsonc +++ b/src/plugins/expression_error/kibana.jsonc @@ -1,16 +1,20 @@ { "type": "plugin", "id": "@kbn/expression-error-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared", "description": "Adds 'error' renderer to expressions", "plugin": { "id": "expressionError", - "server": false, "browser": true, + "server": false, "requiredPlugins": [ "expressions", "presentationUtil" ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/src/plugins/expression_image/kibana.jsonc b/src/plugins/expression_image/kibana.jsonc index b6a05d8b051c5..3aca2b43f0e7f 100644 --- a/src/plugins/expression_image/kibana.jsonc +++ b/src/plugins/expression_image/kibana.jsonc @@ -1,16 +1,20 @@ { "type": "plugin", "id": "@kbn/expression-image-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared", "description": "Adds 'image' function and renderer to expressions", "plugin": { "id": "expressionImage", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "presentationUtil" ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/src/plugins/expression_metric/kibana.jsonc b/src/plugins/expression_metric/kibana.jsonc index 298e7046bf7f8..19070c800cefc 100644 --- a/src/plugins/expression_metric/kibana.jsonc +++ b/src/plugins/expression_metric/kibana.jsonc @@ -1,16 +1,20 @@ { "type": "plugin", "id": "@kbn/expression-metric-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared", "description": "Adds 'metric' function and renderer to expressions", "plugin": { "id": "expressionMetric", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "presentationUtil" ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/src/plugins/expression_repeat_image/kibana.jsonc b/src/plugins/expression_repeat_image/kibana.jsonc index 13e88e1970fd8..17936c2203f3d 100644 --- a/src/plugins/expression_repeat_image/kibana.jsonc +++ b/src/plugins/expression_repeat_image/kibana.jsonc @@ -1,16 +1,20 @@ { "type": "plugin", "id": "@kbn/expression-repeat-image-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared", "description": "Adds 'repeatImage' function and renderer to expressions", "plugin": { "id": "expressionRepeatImage", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "presentationUtil" ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/src/plugins/expression_reveal_image/kibana.jsonc b/src/plugins/expression_reveal_image/kibana.jsonc index 7b13ef28f3088..5d936b2a29a0b 100644 --- a/src/plugins/expression_reveal_image/kibana.jsonc +++ b/src/plugins/expression_reveal_image/kibana.jsonc @@ -1,16 +1,20 @@ { "type": "plugin", "id": "@kbn/expression-reveal-image-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared", "description": "Adds 'revealImage' function and renderer to expressions", "plugin": { "id": "expressionRevealImage", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "presentationUtil" ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/src/plugins/expression_shape/kibana.jsonc b/src/plugins/expression_shape/kibana.jsonc index 85e6fca310d66..96fa1295b32c0 100644 --- a/src/plugins/expression_shape/kibana.jsonc +++ b/src/plugins/expression_shape/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/expression-shape-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared", "description": "Adds 'shape' function and renderer to expressions", "plugin": { "id": "expressionShape", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "presentationUtil" @@ -16,4 +20,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/expressions/kibana.jsonc b/src/plugins/expressions/kibana.jsonc index 7ed96b7020deb..5c5588fc9e9be 100644 --- a/src/plugins/expressions/kibana.jsonc +++ b/src/plugins/expressions/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/expressions-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared", "description": "Adds expression runtime to Kibana", "plugin": { "id": "expressions", - "server": true, "browser": true, + "server": true, "requiredBundles": [ "kibanaUtils", "inspector" @@ -16,4 +20,4 @@ "common/fonts" ] } -} +} \ No newline at end of file diff --git a/src/plugins/field_formats/kibana.jsonc b/src/plugins/field_formats/kibana.jsonc index 49347ac8131b1..4289dd5fe017a 100644 --- a/src/plugins/field_formats/kibana.jsonc +++ b/src/plugins/field_formats/kibana.jsonc @@ -1,14 +1,18 @@ { "type": "plugin", "id": "@kbn/field-formats-plugin", - "owner": "@elastic/kibana-data-discovery", + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared", "description": "Index pattern fields and ambiguous values formatters", "plugin": { "id": "fieldFormats", - "server": true, "browser": true, + "server": true, "extraPublicDirs": [ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/files/kibana.jsonc b/src/plugins/files/kibana.jsonc index 5f59c5d09b3d7..6a10ac67ebda3 100644 --- a/src/plugins/files/kibana.jsonc +++ b/src/plugins/files/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/files-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "description": "File upload, download, sharing, and serving over HTTP implementation in Kibana.", "plugin": { "id": "files", - "server": true, "browser": true, + "server": true, "optionalPlugins": [ "security", "usageCollection" @@ -18,4 +22,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/files_management/kibana.jsonc b/src/plugins/files_management/kibana.jsonc index aef8736c6c1f9..5df36d08cd9a9 100644 --- a/src/plugins/files_management/kibana.jsonc +++ b/src/plugins/files_management/kibana.jsonc @@ -1,16 +1,20 @@ { "type": "plugin", "id": "@kbn/files-management-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private", "description": "Simple UI for managing files in Kibana", "plugin": { "id": "filesManagement", - "server": false, "browser": true, + "server": false, "requiredPlugins": [ "files", "management" ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/src/plugins/ftr_apis/kibana.jsonc b/src/plugins/ftr_apis/kibana.jsonc index f40ab911a104b..75663274a1f3a 100644 --- a/src/plugins/ftr_apis/kibana.jsonc +++ b/src/plugins/ftr_apis/kibana.jsonc @@ -1,13 +1,17 @@ { "type": "plugin", "id": "@kbn/ftr-apis-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "ftrApis", - "server": true, "browser": false, + "server": true, "configPath": [ "ftr_apis" ] } -} +} \ No newline at end of file diff --git a/src/plugins/guided_onboarding/kibana.jsonc b/src/plugins/guided_onboarding/kibana.jsonc index 1bbdc9d1003c1..5a31cd6986c6b 100644 --- a/src/plugins/guided_onboarding/kibana.jsonc +++ b/src/plugins/guided_onboarding/kibana.jsonc @@ -1,13 +1,20 @@ { "type": "plugin", "id": "@kbn/guided-onboarding-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "description": "Guided onboarding framework", "plugin": { "id": "guidedOnboarding", - "server": true, "browser": true, - "optionalPlugins": ["cloud", "features"], + "server": true, + "optionalPlugins": [ + "cloud", + "features" + ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/src/plugins/home/kibana.jsonc b/src/plugins/home/kibana.jsonc index 8c0a7884ce8ee..deef8ba61fd73 100644 --- a/src/plugins/home/kibana.jsonc +++ b/src/plugins/home/kibana.jsonc @@ -1,18 +1,28 @@ { "type": "plugin", "id": "@kbn/home-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "home", - "server": true, "browser": true, - "requiredPlugins": ["dataViews", "share", "urlForwarding"], - "requiredBundles": ["kibanaReact"], + "server": true, + "requiredPlugins": [ + "dataViews", + "share", + "urlForwarding" + ], "optionalPlugins": [ "usageCollection", "customIntegrations", "cloud", "guidedOnboarding" + ], + "requiredBundles": [ + "kibanaReact" ] } -} +} \ No newline at end of file diff --git a/src/plugins/image_embeddable/kibana.jsonc b/src/plugins/image_embeddable/kibana.jsonc index 4dbf82a16d962..ec09c71345736 100644 --- a/src/plugins/image_embeddable/kibana.jsonc +++ b/src/plugins/image_embeddable/kibana.jsonc @@ -1,14 +1,27 @@ { "type": "plugin", "id": "@kbn/image-embeddable-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private", "description": "Image embeddable", "plugin": { "id": "imageEmbeddable", - "server": false, "browser": true, - "requiredPlugins": ["embeddable", "files", "uiActions", "kibanaReact"], - "optionalPlugins": ["security", "screenshotMode", "embeddableEnhanced"], + "server": false, + "requiredPlugins": [ + "embeddable", + "files", + "uiActions", + "kibanaReact" + ], + "optionalPlugins": [ + "security", + "screenshotMode", + "embeddableEnhanced" + ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/src/plugins/input_control_vis/kibana.jsonc b/src/plugins/input_control_vis/kibana.jsonc index 129396f15ace6..0dce906132726 100644 --- a/src/plugins/input_control_vis/kibana.jsonc +++ b/src/plugins/input_control_vis/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/input-control-vis-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "private", "description": "Adds Input Control visualization to Kibana", "plugin": { "id": "inputControlVis", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "data", "expressions", @@ -16,7 +20,8 @@ "uiActions" ], "requiredBundles": [ - "kibanaReact", "embeddable" + "kibanaReact", + "embeddable" ] } -} +} \ No newline at end of file diff --git a/src/plugins/inspector/kibana.jsonc b/src/plugins/inspector/kibana.jsonc index 8ff572bc21f67..b77688378a55b 100644 --- a/src/plugins/inspector/kibana.jsonc +++ b/src/plugins/inspector/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/inspector-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "inspector", - "server": false, "browser": true, + "server": false, "requiredPlugins": [ "share" ], @@ -17,4 +21,4 @@ "common/adapters/request" ] } -} +} \ No newline at end of file diff --git a/src/plugins/interactive_setup/kibana.jsonc b/src/plugins/interactive_setup/kibana.jsonc index 5a6c8dace60b9..f313dc6304ac3 100644 --- a/src/plugins/interactive_setup/kibana.jsonc +++ b/src/plugins/interactive_setup/kibana.jsonc @@ -1,15 +1,19 @@ { "type": "plugin", "id": "@kbn/interactive-setup-plugin", - "owner": "@elastic/kibana-security", + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "private", "description": "This plugin provides UI and APIs for the interactive setup mode.", "plugin": { "id": "interactiveSetup", - "type": "preboot", - "server": true, "browser": true, + "server": true, + "type": "preboot", "configPath": [ "interactiveSetup" ] } -} +} \ No newline at end of file diff --git a/src/plugins/kibana_overview/kibana.jsonc b/src/plugins/kibana_overview/kibana.jsonc index 3fa85f51fce76..6ea60e6a4007b 100644 --- a/src/plugins/kibana_overview/kibana.jsonc +++ b/src/plugins/kibana_overview/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/kibana-overview-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "kibanaOverview", - "server": false, "browser": true, + "server": false, "requiredPlugins": [ "navigation", "dataViews", @@ -22,4 +26,4 @@ "newsfeed" ] } -} +} \ No newline at end of file diff --git a/src/plugins/kibana_react/kibana.jsonc b/src/plugins/kibana_react/kibana.jsonc index 445442e7dc72d..f18c848be2dfe 100644 --- a/src/plugins/kibana_react/kibana.jsonc +++ b/src/plugins/kibana_react/kibana.jsonc @@ -1,13 +1,17 @@ { "type": "plugin", "id": "@kbn/kibana-react-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "kibanaReact", - "server": false, "browser": true, + "server": false, "extraPublicDirs": [ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/kibana_usage_collection/kibana.jsonc b/src/plugins/kibana_usage_collection/kibana.jsonc index df2eee17b0638..00a92e964cbba 100644 --- a/src/plugins/kibana_usage_collection/kibana.jsonc +++ b/src/plugins/kibana_usage_collection/kibana.jsonc @@ -1,13 +1,17 @@ { "type": "plugin", "id": "@kbn/kibana-usage-collection-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "kibanaUsageCollection", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "usageCollection" ] } -} +} \ No newline at end of file diff --git a/src/plugins/kibana_utils/kibana.jsonc b/src/plugins/kibana_utils/kibana.jsonc index 7e12fba0e2b86..f58ee6d1a404a 100644 --- a/src/plugins/kibana_utils/kibana.jsonc +++ b/src/plugins/kibana_utils/kibana.jsonc @@ -1,15 +1,19 @@ { "type": "plugin", "id": "@kbn/kibana-utils-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "kibanaUtils", - "server": false, "browser": true, + "server": false, "extraPublicDirs": [ "common", "demos/state_containers/todomvc", "common/state_containers" ] } -} +} \ No newline at end of file diff --git a/src/plugins/links/kibana.jsonc b/src/plugins/links/kibana.jsonc index 4aed94ab56751..7eaac4ad878e9 100644 --- a/src/plugins/links/kibana.jsonc +++ b/src/plugins/links/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/links-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "private", "description": "A dashboard panel for creating links to dashboards or external links.", "plugin": { "id": "links", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "contentManagement", "dashboard", @@ -18,7 +22,12 @@ "uiActionsEnhanced", "visualizations" ], - "optionalPlugins": ["triggersActionsUi", "usageCollection"], - "requiredBundles": ["savedObjects"] + "optionalPlugins": [ + "triggersActionsUi", + "usageCollection" + ], + "requiredBundles": [ + "savedObjects" + ] } -} +} \ No newline at end of file diff --git a/src/plugins/management/kibana.jsonc b/src/plugins/management/kibana.jsonc index c6e6b59206306..a70b1cce153a3 100644 --- a/src/plugins/management/kibana.jsonc +++ b/src/plugins/management/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/management-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "management", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "share" ], @@ -18,4 +22,4 @@ "kibanaUtils" ] } -} +} \ No newline at end of file diff --git a/src/plugins/maps_ems/kibana.jsonc b/src/plugins/maps_ems/kibana.jsonc index a341ad05f4e4b..902b32c286363 100644 --- a/src/plugins/maps_ems/kibana.jsonc +++ b/src/plugins/maps_ems/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/maps-ems-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "mapsEms", - "server": true, "browser": true, + "server": true, "configPath": [ "map" ], @@ -16,4 +20,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/navigation/kibana.jsonc b/src/plugins/navigation/kibana.jsonc index 92cb0d492572d..04328fa2217f8 100644 --- a/src/plugins/navigation/kibana.jsonc +++ b/src/plugins/navigation/kibana.jsonc @@ -1,13 +1,22 @@ { "type": "plugin", "id": "@kbn/navigation-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "navigation", - "server": true, "browser": true, - "optionalPlugins": ["cloud", "spaces"], - "requiredPlugins": ["unifiedSearch"], + "server": true, + "requiredPlugins": [ + "unifiedSearch" + ], + "optionalPlugins": [ + "cloud", + "spaces" + ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/src/plugins/newsfeed/kibana.jsonc b/src/plugins/newsfeed/kibana.jsonc index b0c9e21b8fa56..113aa7667e582 100644 --- a/src/plugins/newsfeed/kibana.jsonc +++ b/src/plugins/newsfeed/kibana.jsonc @@ -1,14 +1,18 @@ { "type": "plugin", "id": "@kbn/newsfeed-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "newsfeed", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "screenshotMode" ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/src/plugins/no_data_page/kibana.jsonc b/src/plugins/no_data_page/kibana.jsonc index 202917173b7a4..0ebe065d5b5ab 100644 --- a/src/plugins/no_data_page/kibana.jsonc +++ b/src/plugins/no_data_page/kibana.jsonc @@ -1,10 +1,14 @@ { "type": "plugin", "id": "@kbn/no-data-page-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "noDataPage", - "server": true, - "browser": true + "browser": true, + "server": true } -} +} \ No newline at end of file diff --git a/src/plugins/presentation_panel/kibana.jsonc b/src/plugins/presentation_panel/kibana.jsonc index cbcda3501f40f..dd8a20694ac5d 100644 --- a/src/plugins/presentation_panel/kibana.jsonc +++ b/src/plugins/presentation_panel/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/presentation-panel-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "private", "description": "Adds a standardized Presentation panel which allows any forward ref component to interface with various Kibana systems.", "plugin": { "id": "presentationPanel", - "server": false, "browser": true, + "server": false, "requiredPlugins": [ "data", "inspector", @@ -16,6 +20,9 @@ "savedObjectsManagement", "savedObjectsTaggingOss" ], - "requiredBundles": ["kibanaReact", "unifiedSearch"] + "requiredBundles": [ + "kibanaReact", + "unifiedSearch" + ] } -} +} \ No newline at end of file diff --git a/src/plugins/presentation_util/kibana.jsonc b/src/plugins/presentation_util/kibana.jsonc index f9b659fa61630..681877d132b7d 100644 --- a/src/plugins/presentation_util/kibana.jsonc +++ b/src/plugins/presentation_util/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/presentation-util-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared", "description": "The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas).", "plugin": { "id": "presentationUtil", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "kibanaReact", "contentManagement", @@ -15,7 +19,11 @@ "dataViews", "uiActions" ], - "extraPublicDirs": ["common"], - "requiredBundles": ["savedObjects"], + "requiredBundles": [ + "savedObjects" + ], + "extraPublicDirs": [ + "common" + ] } -} +} \ No newline at end of file diff --git a/src/plugins/saved_objects/kibana.jsonc b/src/plugins/saved_objects/kibana.jsonc index 1f063a7cdfa59..86aa1ab920725 100644 --- a/src/plugins/saved_objects/kibana.jsonc +++ b/src/plugins/saved_objects/kibana.jsonc @@ -1,14 +1,18 @@ { "type": "plugin", "id": "@kbn/saved-objects-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "savedObjects", - "server": false, "browser": true, + "server": false, "requiredPlugins": [ "data", "dataViews" ] } -} +} \ No newline at end of file diff --git a/src/plugins/saved_objects_finder/kibana.jsonc b/src/plugins/saved_objects_finder/kibana.jsonc index ad53ee32ae369..5e2b45f0271bc 100644 --- a/src/plugins/saved_objects_finder/kibana.jsonc +++ b/src/plugins/saved_objects_finder/kibana.jsonc @@ -1,11 +1,17 @@ { "type": "plugin", "id": "@kbn/saved-objects-finder-plugin", - "owner": "@elastic/kibana-data-discovery", + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "savedObjectsFinder", - "server": true, "browser": true, - "requiredBundles": ["savedObjectsManagement"] + "server": true, + "requiredBundles": [ + "savedObjectsManagement" + ] } -} +} \ No newline at end of file diff --git a/src/plugins/saved_objects_management/kibana.jsonc b/src/plugins/saved_objects_management/kibana.jsonc index ec6004dca617d..7fab51bcb49ac 100644 --- a/src/plugins/saved_objects_management/kibana.jsonc +++ b/src/plugins/saved_objects_management/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/saved-objects-management-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "savedObjectsManagement", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "management", "data", @@ -23,4 +27,4 @@ "public/lib" ] } -} +} \ No newline at end of file diff --git a/src/plugins/saved_objects_tagging_oss/kibana.jsonc b/src/plugins/saved_objects_tagging_oss/kibana.jsonc index 823dd9c074e9e..2d9ebcc42dbb4 100644 --- a/src/plugins/saved_objects_tagging_oss/kibana.jsonc +++ b/src/plugins/saved_objects_tagging_oss/kibana.jsonc @@ -1,13 +1,17 @@ { "type": "plugin", "id": "@kbn/saved-objects-tagging-oss-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "savedObjectsTaggingOss", - "server": false, "browser": true, + "server": false, "optionalPlugins": [ "savedObjects" ] } -} +} \ No newline at end of file diff --git a/src/plugins/saved_search/kibana.jsonc b/src/plugins/saved_search/kibana.jsonc index da389103a5f78..820d42662ff1c 100644 --- a/src/plugins/saved_search/kibana.jsonc +++ b/src/plugins/saved_search/kibana.jsonc @@ -1,15 +1,29 @@ { "type": "plugin", "id": "@kbn/saved-search-plugin", - "owner": "@elastic/kibana-data-discovery", + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared", "description": "This plugin contains the definition and helper methods around saved searches, used by discover and visualizations.", "plugin": { "id": "savedSearch", - "server": true, "browser": true, - "requiredPlugins": ["data", "contentManagement", "embeddable", "expressions"], - "optionalPlugins": ["spaces", "savedObjectsTaggingOss"], + "server": true, + "requiredPlugins": [ + "data", + "contentManagement", + "embeddable", + "expressions" + ], + "optionalPlugins": [ + "spaces", + "savedObjectsTaggingOss" + ], "requiredBundles": [], - "extraPublicDirs": ["common"] + "extraPublicDirs": [ + "common" + ] } -} +} \ No newline at end of file diff --git a/src/plugins/screenshot_mode/kibana.jsonc b/src/plugins/screenshot_mode/kibana.jsonc index 3b57e37801a15..e00d2f49d6334 100644 --- a/src/plugins/screenshot_mode/kibana.jsonc +++ b/src/plugins/screenshot_mode/kibana.jsonc @@ -1,10 +1,14 @@ { "type": "plugin", "id": "@kbn/screenshot-mode-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "screenshotMode", - "server": true, - "browser": true + "browser": true, + "server": true } -} +} \ No newline at end of file diff --git a/src/plugins/share/kibana.jsonc b/src/plugins/share/kibana.jsonc index a705a73709730..d402d595c1a9b 100644 --- a/src/plugins/share/kibana.jsonc +++ b/src/plugins/share/kibana.jsonc @@ -1,14 +1,18 @@ { "type": "plugin", "id": "@kbn/share-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "description": "Adds URL Service and sharing capabilities to Kibana", "plugin": { "id": "share", - "server": true, "browser": true, + "server": true, "requiredBundles": [ "kibanaUtils" ] } -} +} \ No newline at end of file diff --git a/src/plugins/telemetry/kibana.jsonc b/src/plugins/telemetry/kibana.jsonc index a5edcdde85d99..15b87d686c15a 100644 --- a/src/plugins/telemetry/kibana.jsonc +++ b/src/plugins/telemetry/kibana.jsonc @@ -1,12 +1,15 @@ { "type": "plugin", "id": "@kbn/telemetry-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "telemetry", - "server": true, "browser": true, - "enabledOnAnonymousPages": true, + "server": true, "requiredPlugins": [ "telemetryCollectionManager", "usageCollection", @@ -19,8 +22,9 @@ "requiredBundles": [ "kibanaUtils" ], + "enabledOnAnonymousPages": true, "extraPublicDirs": [ "common/constants" ] } -} +} \ No newline at end of file diff --git a/src/plugins/telemetry_collection_manager/kibana.jsonc b/src/plugins/telemetry_collection_manager/kibana.jsonc index cbf63b44c6115..3c96594530acc 100644 --- a/src/plugins/telemetry_collection_manager/kibana.jsonc +++ b/src/plugins/telemetry_collection_manager/kibana.jsonc @@ -1,13 +1,17 @@ { "type": "plugin", "id": "@kbn/telemetry-collection-manager-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "telemetryCollectionManager", - "server": true, "browser": false, + "server": true, "requiredPlugins": [ "usageCollection" ] } -} +} \ No newline at end of file diff --git a/src/plugins/telemetry_management_section/kibana.jsonc b/src/plugins/telemetry_management_section/kibana.jsonc index 0cd94f9d23234..e86f9f8901d14 100644 --- a/src/plugins/telemetry_management_section/kibana.jsonc +++ b/src/plugins/telemetry_management_section/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/telemetry-management-section-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "telemetryManagementSection", - "server": false, "browser": true, + "server": false, "requiredPlugins": [ "telemetry", "advancedSettings" diff --git a/src/plugins/ui_actions/kibana.jsonc b/src/plugins/ui_actions/kibana.jsonc index e63c80190c074..1af247645ba49 100644 --- a/src/plugins/ui_actions/kibana.jsonc +++ b/src/plugins/ui_actions/kibana.jsonc @@ -1,15 +1,19 @@ { "type": "plugin", "id": "@kbn/ui-actions-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "description": "Adds UI Actions service to Kibana", "plugin": { "id": "uiActions", - "server": false, "browser": true, + "server": false, "requiredPlugins": [], "requiredBundles": [ "kibanaUtils" ] } -} +} \ No newline at end of file diff --git a/src/plugins/ui_actions_enhanced/kibana.jsonc b/src/plugins/ui_actions_enhanced/kibana.jsonc index 595c483a66505..7575e79bf6fe7 100644 --- a/src/plugins/ui_actions_enhanced/kibana.jsonc +++ b/src/plugins/ui_actions_enhanced/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/ui-actions-enhanced-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "description": "Extends UI Actions plugin with more functionality", "plugin": { "id": "uiActionsEnhanced", - "server": true, "browser": true, + "server": true, "configPath": [ "src", "ui_actions_enhanced" @@ -23,4 +27,4 @@ "kibanaReact" ] } -} +} \ No newline at end of file diff --git a/src/plugins/unified_doc_viewer/kibana.jsonc b/src/plugins/unified_doc_viewer/kibana.jsonc index 6bd1b738c0ccb..a741cd93472b3 100644 --- a/src/plugins/unified_doc_viewer/kibana.jsonc +++ b/src/plugins/unified_doc_viewer/kibana.jsonc @@ -1,15 +1,26 @@ { "type": "plugin", "id": "@kbn/unified-doc-viewer-plugin", - "owner": "@elastic/kibana-data-discovery", + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared", "description": "This plugin contains services reliant on the plugin lifecycle for the unified doc viewer component (see @kbn/unified-doc-viewer).", "plugin": { "id": "unifiedDocViewer", - "server": false, "browser": true, - "requiredBundles": ["kibanaUtils"], - "requiredPlugins": ["data", "fieldFormats", "share"], - "optionalPlugins": ["fieldsMetadata"] + "server": false, + "requiredPlugins": [ + "data", + "fieldFormats", + "share" + ], + "optionalPlugins": [ + "fieldsMetadata" + ], + "requiredBundles": [ + "kibanaUtils" + ] } -} - \ No newline at end of file +} \ No newline at end of file diff --git a/src/plugins/unified_histogram/kibana.jsonc b/src/plugins/unified_histogram/kibana.jsonc index 54e749a89f3e4..4af13ca5d6996 100644 --- a/src/plugins/unified_histogram/kibana.jsonc +++ b/src/plugins/unified_histogram/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/unified-histogram-plugin", - "owner": "@elastic/kibana-data-discovery", + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "shared", "description": "The `unifiedHistogram` plugin provides UI components to create a layout including a resizable histogram and a main display.", "plugin": { "id": "unifiedHistogram", - "server": false, "browser": true, + "server": false, "requiredBundles": [ "data", "dataViews", @@ -15,4 +19,4 @@ "visualizations" ] } -} +} \ No newline at end of file diff --git a/src/plugins/unified_search/kibana.jsonc b/src/plugins/unified_search/kibana.jsonc index ad7f73a608857..b3e71c12af28a 100644 --- a/src/plugins/unified_search/kibana.jsonc +++ b/src/plugins/unified_search/kibana.jsonc @@ -1,15 +1,19 @@ { "type": "plugin", "id": "@kbn/unified-search-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared", "description": "Contains all the key functionality of Kibana's unified search experience.Contains all the key functionality of Kibana's unified search experience.", "serviceFolders": [ "autocomplete" ], "plugin": { "id": "unifiedSearch", - "server": true, "browser": true, + "server": true, "configPath": [ "unifiedSearch" ], @@ -30,4 +34,4 @@ "esql" ] } -} +} \ No newline at end of file diff --git a/src/plugins/url_forwarding/kibana.jsonc b/src/plugins/url_forwarding/kibana.jsonc index 3eede9eb9effc..4089ad10fc7b9 100644 --- a/src/plugins/url_forwarding/kibana.jsonc +++ b/src/plugins/url_forwarding/kibana.jsonc @@ -1,10 +1,14 @@ { "type": "plugin", "id": "@kbn/url-forwarding-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "urlForwarding", - "server": false, - "browser": true + "browser": true, + "server": false } -} +} \ No newline at end of file diff --git a/src/plugins/usage_collection/kibana.jsonc b/src/plugins/usage_collection/kibana.jsonc index 78d54f302a327..3e9ccac82974b 100644 --- a/src/plugins/usage_collection/kibana.jsonc +++ b/src/plugins/usage_collection/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/usage-collection-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "usageCollection", - "server": true, "browser": true, + "server": true, "configPath": [ "usageCollection" ], @@ -16,4 +20,4 @@ "kibanaUtils" ] } -} +} \ No newline at end of file diff --git a/src/plugins/vis_default_editor/kibana.jsonc b/src/plugins/vis_default_editor/kibana.jsonc index 15db2338f2ca7..1e096b8be6950 100644 --- a/src/plugins/vis_default_editor/kibana.jsonc +++ b/src/plugins/vis_default_editor/kibana.jsonc @@ -1,15 +1,19 @@ { "type": "plugin", "id": "@kbn/vis-default-editor-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "The default editor used in most aggregation-based visualizations.", "plugin": { "id": "visDefaultEditor", - "server": false, "browser": true, + "server": false, "requiredPlugins": [ "dataViews", - "unifiedSearch", + "unifiedSearch" ], "optionalPlugins": [ "visualizations" @@ -24,4 +28,4 @@ "savedSearch" ] } -} +} \ No newline at end of file diff --git a/src/plugins/vis_type_markdown/kibana.jsonc b/src/plugins/vis_type_markdown/kibana.jsonc index 476dcc0605ad4..49a9f0d00b0bf 100644 --- a/src/plugins/vis_type_markdown/kibana.jsonc +++ b/src/plugins/vis_type_markdown/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/vis-type-markdown-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "private", "description": "Adds a markdown visualization type", "plugin": { "id": "visTypeMarkdown", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "visualizations" @@ -18,4 +22,4 @@ "visualizations" ] } -} +} \ No newline at end of file diff --git a/src/plugins/vis_types/gauge/kibana.jsonc b/src/plugins/vis_types/gauge/kibana.jsonc index 7897ac6a6a3b1..634fe39685cbc 100644 --- a/src/plugins/vis_types/gauge/kibana.jsonc +++ b/src/plugins/vis_types/gauge/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/vis-type-gauge-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "Contains the gauge chart implementation using the elastic-charts library. The goal is to eventually deprecate the old implementation and keep only this. Until then, the library used is defined by the Legacy charts library advanced setting.", "plugin": { "id": "visTypeGauge", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "charts", "data", @@ -26,4 +30,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/vis_types/heatmap/kibana.jsonc b/src/plugins/vis_types/heatmap/kibana.jsonc index f658f744526dd..79b426ed2d7bd 100644 --- a/src/plugins/vis_types/heatmap/kibana.jsonc +++ b/src/plugins/vis_types/heatmap/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/vis-type-heatmap-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "Contains the heatmap implementation using the elastic-charts library. The goal is to eventually deprecate the old implementation and keep only this. Until then, the library used is defined by the Legacy heatmap charts library advanced setting.", "plugin": { "id": "visTypeHeatmap", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "charts", "data", @@ -24,4 +28,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/vis_types/metric/kibana.jsonc b/src/plugins/vis_types/metric/kibana.jsonc index 539e4318a9362..88a3f469e3485 100644 --- a/src/plugins/vis_types/metric/kibana.jsonc +++ b/src/plugins/vis_types/metric/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/vis-type-metric-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "Registers the Metric aggregation-based visualization.", "plugin": { "id": "visTypeMetric", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "data", "visualizations", @@ -19,4 +23,4 @@ "kibanaUtils" ] } -} +} \ No newline at end of file diff --git a/src/plugins/vis_types/pie/kibana.jsonc b/src/plugins/vis_types/pie/kibana.jsonc index 85364316fc19d..79beaa143cbe1 100644 --- a/src/plugins/vis_types/pie/kibana.jsonc +++ b/src/plugins/vis_types/pie/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/vis-type-pie-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "Contains the pie chart implementation using the elastic-charts library. The goal is to eventually deprecate the old implementation and keep only this. Until then, the library used is defined by the Legacy charts library advanced setting.", "plugin": { "id": "visTypePie", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "charts", "data", @@ -24,4 +28,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/vis_types/table/kibana.jsonc b/src/plugins/vis_types/table/kibana.jsonc index de4712484d07d..5cdc5da34d871 100644 --- a/src/plugins/vis_types/table/kibana.jsonc +++ b/src/plugins/vis_types/table/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/vis-type-table-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "Registers the datatable aggregation-based visualization.", "plugin": { "id": "visTypeTable", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "expressions", "visualizations", @@ -22,4 +26,4 @@ "visDefaultEditor" ] } -} +} \ No newline at end of file diff --git a/src/plugins/vis_types/tagcloud/kibana.jsonc b/src/plugins/vis_types/tagcloud/kibana.jsonc index 8694f3f27c2f5..71d9d91d7becf 100644 --- a/src/plugins/vis_types/tagcloud/kibana.jsonc +++ b/src/plugins/vis_types/tagcloud/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/vis-type-tagcloud-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "Registers the tagcloud visualization. It is based on elastic-charts wordcloud.", "plugin": { "id": "visTypeTagcloud", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "data", "expressions", @@ -20,4 +24,4 @@ "kibanaUtils" ] } -} +} \ No newline at end of file diff --git a/src/plugins/vis_types/timelion/kibana.jsonc b/src/plugins/vis_types/timelion/kibana.jsonc index aa11b92e58874..041d1248cfe1e 100644 --- a/src/plugins/vis_types/timelion/kibana.jsonc +++ b/src/plugins/vis_types/timelion/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/vis-type-timelion-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "Registers the timelion visualization. Also contains the backend for both timelion app and timelion visualization.", "plugin": { "id": "visTypeTimelion", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "visualizations", "data", @@ -24,4 +28,4 @@ "visDefaultEditor" ] } -} +} \ No newline at end of file diff --git a/src/plugins/vis_types/timeseries/kibana.jsonc b/src/plugins/vis_types/timeseries/kibana.jsonc index 9ba099aef6321..bd0e4ac352daa 100644 --- a/src/plugins/vis_types/timeseries/kibana.jsonc +++ b/src/plugins/vis_types/timeseries/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/vis-type-timeseries-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "Registers the TSVB visualization. TSVB has its one editor, works with index patterns and index strings and contains 6 types of charts: timeseries, topN, table. markdown, metric and gauge.", "plugin": { "id": "visTypeTimeseries", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "charts", "data", @@ -28,4 +32,4 @@ "fieldFormats" ] } -} +} \ No newline at end of file diff --git a/src/plugins/vis_types/vega/kibana.jsonc b/src/plugins/vis_types/vega/kibana.jsonc index b3a2c28afa698..25c4320825288 100644 --- a/src/plugins/vis_types/vega/kibana.jsonc +++ b/src/plugins/vis_types/vega/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/vis-type-vega-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "Registers the vega visualization. Is the elastic version of vega and vega-lite libraries.", "plugin": { "id": "visTypeVega", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "data", "visualizations", @@ -25,4 +29,4 @@ "visDefaultEditor" ] } -} +} \ No newline at end of file diff --git a/src/plugins/vis_types/vislib/kibana.jsonc b/src/plugins/vis_types/vislib/kibana.jsonc index bb1882e4d860d..8521b198c2b6a 100644 --- a/src/plugins/vis_types/vislib/kibana.jsonc +++ b/src/plugins/vis_types/vislib/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/vis-type-vislib-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "Contains the vislib visualizations. These are the classical area/line/bar, gauge/goal and heatmap charts. We want to replace them with elastic-charts.", "plugin": { "id": "visTypeVislib", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "charts", "data", @@ -23,4 +27,4 @@ "visTypeGauge" ] } -} +} \ No newline at end of file diff --git a/src/plugins/vis_types/xy/kibana.jsonc b/src/plugins/vis_types/xy/kibana.jsonc index bc0f162537fd5..ff8da57388377 100644 --- a/src/plugins/vis_types/xy/kibana.jsonc +++ b/src/plugins/vis_types/xy/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/vis-type-xy-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "description": "Contains the new xy-axis chart using the elastic-charts library, which will eventually replace the vislib xy-axis charts including bar, area, and line.", "plugin": { "id": "visTypeXy", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "charts", "visualizations", @@ -22,4 +26,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/src/plugins/visualizations/kibana.jsonc b/src/plugins/visualizations/kibana.jsonc index 95a2999611bd4..8e8b492e99a0b 100644 --- a/src/plugins/visualizations/kibana.jsonc +++ b/src/plugins/visualizations/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/visualizations-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared", "description": "Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable.", "plugin": { "id": "visualizations", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "data", "charts", @@ -37,7 +41,12 @@ "noDataPage", "embeddableEnhanced" ], - "requiredBundles": ["kibanaUtils", "kibanaReact", "charts", "savedObjects"], + "requiredBundles": [ + "kibanaUtils", + "kibanaReact", + "charts", + "savedObjects" + ], "extraPublicDirs": [ "common/constants", "common/utils", @@ -45,4 +54,4 @@ "common/convert_to_lens" ] } -} +} \ No newline at end of file diff --git a/x-pack/packages/kbn-ai-assistant/kibana.jsonc b/x-pack/packages/kbn-ai-assistant/kibana.jsonc index 4cddd90431e39..f8da31c9d6749 100644 --- a/x-pack/packages/kbn-ai-assistant/kibana.jsonc +++ b/x-pack/packages/kbn-ai-assistant/kibana.jsonc @@ -1,5 +1,7 @@ { "id": "@kbn/ai-assistant", "owner": "@elastic/search-kibana", - "type": "shared-browser" + "type": "shared-browser", + "group": "observability", + "visibility": "private" } diff --git a/x-pack/packages/observability/alerting_test_data/kibana.jsonc b/x-pack/packages/observability/alerting_test_data/kibana.jsonc index 6bbf701e73c75..7cf9294af9b73 100644 --- a/x-pack/packages/observability/alerting_test_data/kibana.jsonc +++ b/x-pack/packages/observability/alerting_test_data/kibana.jsonc @@ -1,5 +1,7 @@ { "type": "shared-common", "id": "@kbn/observability-alerting-test-data", - "owner": "@elastic/obs-ux-management-team" + "owner": "@elastic/obs-ux-management-team", + "group": "observability", + "visibility": "private" } diff --git a/x-pack/plugins/actions/kibana.jsonc b/x-pack/plugins/actions/kibana.jsonc index 78f66742c2a03..3cb9e8bfd79c5 100644 --- a/x-pack/plugins/actions/kibana.jsonc +++ b/x-pack/plugins/actions/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/actions-plugin", - "owner": "@elastic/response-ops", + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "actions", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "actions" @@ -28,4 +32,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/aiops/kibana.jsonc b/x-pack/plugins/aiops/kibana.jsonc index 65ecf52c76258..d327a131aec4d 100644 --- a/x-pack/plugins/aiops/kibana.jsonc +++ b/x-pack/plugins/aiops/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/aiops-plugin", - "owner": "@elastic/ml-ui", + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "shared", "description": "AIOps plugin maintained by ML team.", "plugin": { "id": "aiops", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "charts", "data", @@ -31,7 +35,7 @@ "kibanaReact", "kibanaUtils", "embeddable", - "cases", + "cases" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/alerting/kibana.jsonc b/x-pack/plugins/alerting/kibana.jsonc index 9b6e523e27ebf..0b5f930dbb34a 100644 --- a/x-pack/plugins/alerting/kibana.jsonc +++ b/x-pack/plugins/alerting/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/alerting-plugin", - "owner": "@elastic/response-ops", + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "alerting", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "alerting" @@ -32,11 +36,11 @@ "security", "monitoringCollection", "spaces", - "serverless", + "serverless" ], "extraPublicDirs": [ "common", "common/parse_duration" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/banners/kibana.jsonc b/x-pack/plugins/banners/kibana.jsonc index 75d275a6bde4a..67a5f3b1b79d0 100644 --- a/x-pack/plugins/banners/kibana.jsonc +++ b/x-pack/plugins/banners/kibana.jsonc @@ -1,22 +1,26 @@ { "type": "plugin", "id": "@kbn/banners-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "banners", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "banners" ], - "enabledOnAnonymousPages": true, "requiredPlugins": [ "licensing" ], "optionalPlugins": [ "screenshotMode" ], - "requiredBundles": [] + "requiredBundles": [], + "enabledOnAnonymousPages": true } -} +} \ No newline at end of file diff --git a/x-pack/plugins/canvas/kibana.jsonc b/x-pack/plugins/canvas/kibana.jsonc index f752f37443fef..8beb33892de1a 100644 --- a/x-pack/plugins/canvas/kibana.jsonc +++ b/x-pack/plugins/canvas/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/canvas-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "private", "description": "Adds Canvas application to Kibana", "plugin": { "id": "canvas", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "canvas" @@ -36,7 +40,7 @@ "home", "reporting", "spaces", - "usageCollection", + "usageCollection" ], "requiredBundles": [ "kibanaReact", @@ -45,6 +49,6 @@ "maps", "visualizations", "fieldFormats" - ], + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/cases/kibana.jsonc b/x-pack/plugins/cases/kibana.jsonc index 300b1ee4c2c12..e5dafa52a3a11 100644 --- a/x-pack/plugins/cases/kibana.jsonc +++ b/x-pack/plugins/cases/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/cases-plugin", - "owner": "@elastic/response-ops", + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared", "description": "The Case management system in Kibana", "plugin": { "id": "cases", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "cases" @@ -27,7 +31,7 @@ "ruleRegistry", "files", "contentManagement", - "uiActions", + "uiActions" ], "optionalPlugins": [ "cloud", @@ -35,16 +39,16 @@ "taskManager", "usageCollection", "spaces", - "serverless", + "serverless" ], "requiredBundles": [ "esUiShared", "kibanaReact", "kibanaUtils", - "savedObjectsFinder", + "savedObjectsFinder" ], "extraPublicDirs": [ "common" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/cloud/kibana.jsonc b/x-pack/plugins/cloud/kibana.jsonc index 17edf376bf5cb..18698c2a654b0 100644 --- a/x-pack/plugins/cloud/kibana.jsonc +++ b/x-pack/plugins/cloud/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/cloud-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "cloud", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "cloud" @@ -14,4 +18,4 @@ "usageCollection" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/cloud_defend/kibana.jsonc b/x-pack/plugins/cloud_defend/kibana.jsonc index d7854913945ff..f0155401048d2 100644 --- a/x-pack/plugins/cloud_defend/kibana.jsonc +++ b/x-pack/plugins/cloud_defend/kibana.jsonc @@ -1,13 +1,20 @@ { "type": "plugin", "id": "@kbn/cloud-defend-plugin", - "owner": "@elastic/kibana-cloud-security-posture", + "owner": [ + "@elastic/kibana-cloud-security-posture" + ], + "group": "security", + "visibility": "private", "description": "Defend for containers (D4C)", "plugin": { "id": "cloudDefend", - "server": true, "browser": true, - "configPath": ["xpack", "cloudDefend"], + "server": true, + "configPath": [ + "xpack", + "cloudDefend" + ], "requiredPlugins": [ "navigation", "data", @@ -19,7 +26,12 @@ "licensing", "kubernetesSecurity" ], - "optionalPlugins": ["usageCollection"], - "requiredBundles": ["kibanaReact", "usageCollection"] + "optionalPlugins": [ + "usageCollection" + ], + "requiredBundles": [ + "kibanaReact", + "usageCollection" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/cloud_integrations/cloud_chat/kibana.jsonc b/x-pack/plugins/cloud_integrations/cloud_chat/kibana.jsonc index dad2a22752df1..1a1c833e59ca8 100644 --- a/x-pack/plugins/cloud_integrations/cloud_chat/kibana.jsonc +++ b/x-pack/plugins/cloud_integrations/cloud_chat/kibana.jsonc @@ -1,7 +1,11 @@ { "type": "plugin", "id": "@kbn/cloud-chat-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private", "description": "Chat available on Elastic Cloud deployments for quicker assistance.", "plugin": { "id": "cloudChat", @@ -15,9 +19,7 @@ "requiredPlugins": [ "cloud" ], - "requiredBundles": [ - ], - "optionalPlugins": [ - ] + "optionalPlugins": [], + "requiredBundles": [] } } diff --git a/x-pack/plugins/cloud_integrations/cloud_data_migration/kibana.jsonc b/x-pack/plugins/cloud_integrations/cloud_data_migration/kibana.jsonc index ea019ef61b15e..d2b9883a0c741 100644 --- a/x-pack/plugins/cloud_integrations/cloud_data_migration/kibana.jsonc +++ b/x-pack/plugins/cloud_integrations/cloud_data_migration/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/cloud-data-migration-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private", "description": "Static migration page where self-managed users can see text/copy about migrating to Elastic Cloud", "plugin": { "id": "cloudDataMigration", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "cloud_integrations", @@ -22,4 +26,4 @@ "kibanaReact" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/cloud_integrations/cloud_experiments/kibana.jsonc b/x-pack/plugins/cloud_integrations/cloud_experiments/kibana.jsonc index 3c6b9f8279f01..8ea0fd75ea553 100644 --- a/x-pack/plugins/cloud_integrations/cloud_experiments/kibana.jsonc +++ b/x-pack/plugins/cloud_integrations/cloud_experiments/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/cloud-experiments-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "description": "Provides the necessary APIs to implement A/B testing scenarios, fetching the variations in configuration and reporting back metrics to track conversion rates of the experiments.", "plugin": { "id": "cloudExperiments", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "cloud_integrations", @@ -18,4 +22,4 @@ "usageCollection" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/cloud_integrations/cloud_full_story/kibana.jsonc b/x-pack/plugins/cloud_integrations/cloud_full_story/kibana.jsonc index 53a42a6e903f2..e9bb4a8df07dd 100644 --- a/x-pack/plugins/cloud_integrations/cloud_full_story/kibana.jsonc +++ b/x-pack/plugins/cloud_integrations/cloud_full_story/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/cloud-full-story-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private", "description": "When Kibana runs on Elastic Cloud, this plugin registers FullStory as a shipper for telemetry.", "plugin": { "id": "cloudFullStory", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "cloud_integrations", @@ -19,4 +23,4 @@ "security" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/cloud_integrations/cloud_links/kibana.jsonc b/x-pack/plugins/cloud_integrations/cloud_links/kibana.jsonc index a8dbc9b23af63..46259fa3072a5 100644 --- a/x-pack/plugins/cloud_integrations/cloud_links/kibana.jsonc +++ b/x-pack/plugins/cloud_integrations/cloud_links/kibana.jsonc @@ -1,20 +1,24 @@ { "type": "plugin", "id": "@kbn/cloud-links-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private", "description": "Adds the links to the Elastic Cloud console", "plugin": { "id": "cloudLinks", - "server": false, "browser": true, + "server": false, + "requiredPlugins": [ + "share" + ], "optionalPlugins": [ "cloud", "security", "guidedOnboarding" ], - "requiredBundles": [], - "requiredPlugins": [ - "share" - ] + "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/cloud_security_posture/kibana.jsonc b/x-pack/plugins/cloud_security_posture/kibana.jsonc index d1aacf2f340fc..d43f37fd70484 100644 --- a/x-pack/plugins/cloud_security_posture/kibana.jsonc +++ b/x-pack/plugins/cloud_security_posture/kibana.jsonc @@ -1,13 +1,20 @@ { "type": "plugin", "id": "@kbn/cloud-security-posture-plugin", - "owner": "@elastic/kibana-cloud-security-posture", + "owner": [ + "@elastic/kibana-cloud-security-posture" + ], + "group": "security", + "visibility": "private", "description": "The cloud security posture plugin", "plugin": { "id": "cloudSecurityPosture", - "server": true, "browser": true, - "configPath": ["xpack", "cloudSecurityPosture"], + "server": true, + "configPath": [ + "xpack", + "cloudSecurityPosture" + ], "requiredPlugins": [ "navigation", "data", @@ -25,7 +32,12 @@ "alerting", "spaces" ], - "optionalPlugins": ["usageCollection"], - "requiredBundles": ["kibanaReact", "usageCollection"] + "optionalPlugins": [ + "usageCollection" + ], + "requiredBundles": [ + "kibanaReact", + "usageCollection" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/cross_cluster_replication/kibana.jsonc b/x-pack/plugins/cross_cluster_replication/kibana.jsonc index 0b85ba18781d8..5b29c4fb56618 100644 --- a/x-pack/plugins/cross_cluster_replication/kibana.jsonc +++ b/x-pack/plugins/cross_cluster_replication/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/cross-cluster-replication-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "crossClusterReplication", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "ccr" @@ -28,4 +32,4 @@ "data" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/custom_branding/kibana.jsonc b/x-pack/plugins/custom_branding/kibana.jsonc index 5bd0fccb1f020..01e982e86eb3f 100644 --- a/x-pack/plugins/custom_branding/kibana.jsonc +++ b/x-pack/plugins/custom_branding/kibana.jsonc @@ -1,15 +1,19 @@ { "type": "plugin", "id": "@kbn/custom-branding-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private", "description": " Enables customization of Kibana", "plugin": { "id": "customBranding", - "server": true, "browser": false, + "server": true, "requiredPlugins": [ "licensing", "licenseApiGuard" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/dashboard_enhanced/kibana.jsonc b/x-pack/plugins/dashboard_enhanced/kibana.jsonc index e74f2000ce39f..36f8a02e65ce9 100644 --- a/x-pack/plugins/dashboard_enhanced/kibana.jsonc +++ b/x-pack/plugins/dashboard_enhanced/kibana.jsonc @@ -1,12 +1,19 @@ { "type": "plugin", "id": "@kbn/dashboard-enhanced-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "dashboardEnhanced", - "server": true, "browser": true, - "configPath": ["xpack", "dashboardEnhanced"], + "server": true, + "configPath": [ + "xpack", + "dashboardEnhanced" + ], "requiredPlugins": [ "dashboard", "data", @@ -24,4 +31,4 @@ "uiActions" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/data_visualizer/kibana.jsonc b/x-pack/plugins/data_visualizer/kibana.jsonc index 06d37106c2480..1e83c34113beb 100644 --- a/x-pack/plugins/data_visualizer/kibana.jsonc +++ b/x-pack/plugins/data_visualizer/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/data-visualizer-plugin", - "owner": "@elastic/ml-ui", + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private", "description": "The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index.", "plugin": { "id": "dataVisualizer", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "data", "usageCollection", @@ -40,4 +44,4 @@ "visualizations" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/discover_enhanced/kibana.jsonc b/x-pack/plugins/discover_enhanced/kibana.jsonc index 73243ee5d59d3..39f07bbbd23cc 100644 --- a/x-pack/plugins/discover_enhanced/kibana.jsonc +++ b/x-pack/plugins/discover_enhanced/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/discover-enhanced-plugin", - "owner": "@elastic/kibana-data-discovery", + "owner": [ + "@elastic/kibana-data-discovery" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "discoverEnhanced", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "discoverEnhanced" @@ -25,4 +29,4 @@ "lens" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/drilldowns/url_drilldown/kibana.jsonc b/x-pack/plugins/drilldowns/url_drilldown/kibana.jsonc index a7d0217c4e2ee..05083a54a7080 100644 --- a/x-pack/plugins/drilldowns/url_drilldown/kibana.jsonc +++ b/x-pack/plugins/drilldowns/url_drilldown/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/url-drilldown-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private", "description": "Adds drilldown implementations to Kibana", "plugin": { "id": "urlDrilldown", - "server": false, "browser": true, + "server": false, "requiredPlugins": [ "embeddable", "uiActionsEnhanced" @@ -18,4 +22,4 @@ "uiActions" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/ecs_data_quality_dashboard/kibana.jsonc b/x-pack/plugins/ecs_data_quality_dashboard/kibana.jsonc index 5adbe3eeee830..63d01bdc23e96 100644 --- a/x-pack/plugins/ecs_data_quality_dashboard/kibana.jsonc +++ b/x-pack/plugins/ecs_data_quality_dashboard/kibana.jsonc @@ -1,17 +1,21 @@ { "type": "plugin", "id": "@kbn/ecs-data-quality-dashboard-plugin", - "owner": "@elastic/security-threat-hunting-explore", + "owner": [ + "@elastic/security-threat-hunting-explore" + ], + "group": "security", + "visibility": "private", "description": "APIs used to assess the quality of data in Elasticsearch indexes", "plugin": { "id": "ecsDataQualityDashboard", - "server": true, "browser": false, + "server": true, "requiredPlugins": [ - "data", + "data" ], "optionalPlugins": [ - "spaces", + "spaces" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/elastic_assistant/kibana.jsonc b/x-pack/plugins/elastic_assistant/kibana.jsonc index 8a3e0725c782a..435ec0b916d01 100644 --- a/x-pack/plugins/elastic_assistant/kibana.jsonc +++ b/x-pack/plugins/elastic_assistant/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/elastic-assistant-plugin", - "owner": "@elastic/security-generative-ai", + "owner": [ + "@elastic/security-generative-ai" + ], + "group": "security", + "visibility": "private", "description": "Server APIs for the Elastic AI Assistant", "plugin": { "id": "elasticAssistant", - "server": true, "browser": false, + "server": true, "requiredPlugins": [ "actions", "data", @@ -18,4 +22,4 @@ "security" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/embeddable_enhanced/kibana.jsonc b/x-pack/plugins/embeddable_enhanced/kibana.jsonc index 79c79ee89d649..d795afa4d7938 100644 --- a/x-pack/plugins/embeddable_enhanced/kibana.jsonc +++ b/x-pack/plugins/embeddable_enhanced/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/embeddable-enhanced-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "private", "description": "Extends embeddable plugin with more functionality", "plugin": { "id": "embeddableEnhanced", - "server": false, "browser": true, + "server": false, "requiredPlugins": [ "embeddable", "kibanaReact", @@ -14,4 +18,4 @@ "uiActionsEnhanced" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/encrypted_saved_objects/kibana.jsonc b/x-pack/plugins/encrypted_saved_objects/kibana.jsonc index 7e0cc158363ec..41097c7b70f0e 100644 --- a/x-pack/plugins/encrypted_saved_objects/kibana.jsonc +++ b/x-pack/plugins/encrypted_saved_objects/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/encrypted-saved-objects-plugin", - "owner": "@elastic/kibana-security", + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared", "description": "This plugin provides encryption and decryption utilities for saved objects containing sensitive information.", "plugin": { "id": "encryptedSavedObjects", - "server": true, "browser": false, + "server": true, "configPath": [ "xpack", "encryptedSavedObjects" @@ -15,4 +19,4 @@ "security" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/event_log/kibana.jsonc b/x-pack/plugins/event_log/kibana.jsonc index ae1da1389b1eb..8a792f2a43914 100644 --- a/x-pack/plugins/event_log/kibana.jsonc +++ b/x-pack/plugins/event_log/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/event-log-plugin", - "owner": "@elastic/response-ops", + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "eventLog", - "server": true, "browser": false, + "server": true, "configPath": [ "xpack", "eventLog" @@ -15,4 +19,4 @@ "serverless" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/features/kibana.jsonc b/x-pack/plugins/features/kibana.jsonc index ac9f52175f458..f4b3e364a94fe 100644 --- a/x-pack/plugins/features/kibana.jsonc +++ b/x-pack/plugins/features/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/features-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "features", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "features" @@ -17,4 +21,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/file_upload/kibana.jsonc b/x-pack/plugins/file_upload/kibana.jsonc index 9d8143dafcb46..d2414148524c4 100644 --- a/x-pack/plugins/file_upload/kibana.jsonc +++ b/x-pack/plugins/file_upload/kibana.jsonc @@ -1,12 +1,17 @@ { "type": "plugin", "id": "@kbn/file-upload-plugin", - "owner": ["@elastic/kibana-presentation", "@elastic/ml-ui"], + "owner": [ + "@elastic/kibana-presentation", + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private", "description": "The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON.", "plugin": { "id": "fileUpload", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "data", "usageCollection" @@ -21,4 +26,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/fleet/kibana.jsonc b/x-pack/plugins/fleet/kibana.jsonc index dded2caf4c7e2..dec968457f294 100644 --- a/x-pack/plugins/fleet/kibana.jsonc +++ b/x-pack/plugins/fleet/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/fleet-plugin", - "owner": "@elastic/fleet", + "owner": [ + "@elastic/fleet" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "fleet", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "fleet" @@ -38,7 +42,7 @@ "ingestPipelines", "spaces", "guidedOnboarding", - "integrationAssistant", + "integrationAssistant" ], "requiredBundles": [ "kibanaReact", @@ -52,4 +56,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/global_search/kibana.jsonc b/x-pack/plugins/global_search/kibana.jsonc index 080d327dec4cb..9eb188986901d 100644 --- a/x-pack/plugins/global_search/kibana.jsonc +++ b/x-pack/plugins/global_search/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/global-search-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "globalSearch", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "global_search" @@ -14,4 +18,4 @@ "licensing" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/global_search_bar/kibana.jsonc b/x-pack/plugins/global_search_bar/kibana.jsonc index 6412f7c8ed890..b61cce43fe485 100644 --- a/x-pack/plugins/global_search_bar/kibana.jsonc +++ b/x-pack/plugins/global_search_bar/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/global-search-bar-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "globalSearchBar", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "global_search_bar" @@ -18,4 +22,4 @@ "savedObjectsTagging" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/global_search_providers/kibana.jsonc b/x-pack/plugins/global_search_providers/kibana.jsonc index cdfed2ebbaf5d..aa8228118be09 100644 --- a/x-pack/plugins/global_search_providers/kibana.jsonc +++ b/x-pack/plugins/global_search_providers/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/global-search-providers-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "globalSearchProviders", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "global_search_providers" @@ -14,4 +18,4 @@ "globalSearch" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/graph/kibana.jsonc b/x-pack/plugins/graph/kibana.jsonc index 3c299bbeb4a2b..33862384394b4 100644 --- a/x-pack/plugins/graph/kibana.jsonc +++ b/x-pack/plugins/graph/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/graph-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "graph", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "graph" @@ -31,4 +35,4 @@ "savedObjects" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/grokdebugger/kibana.jsonc b/x-pack/plugins/grokdebugger/kibana.jsonc index c006355cc9265..f72fe281c1942 100644 --- a/x-pack/plugins/grokdebugger/kibana.jsonc +++ b/x-pack/plugins/grokdebugger/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/grokdebugger-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "grokdebugger", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "grokdebugger" @@ -19,4 +23,4 @@ "kibanaReact" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/index_management/kibana.jsonc b/x-pack/plugins/index_management/kibana.jsonc index b9bec8115e019..de2aa50a20eac 100644 --- a/x-pack/plugins/index_management/kibana.jsonc +++ b/x-pack/plugins/index_management/kibana.jsonc @@ -1,14 +1,38 @@ { "type": "plugin", "id": "@kbn/index-management-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "indexManagement", - "server": true, "browser": true, - "configPath": ["xpack", "index_management"], - "requiredPlugins": ["home", "management", "features", "share"], - "optionalPlugins": ["security", "usageCollection", "fleet", "cloud", "ml", "console","licensing"], - "requiredBundles": ["kibanaReact", "esUiShared", "runtimeFields"] + "server": true, + "configPath": [ + "xpack", + "index_management" + ], + "requiredPlugins": [ + "home", + "management", + "features", + "share" + ], + "optionalPlugins": [ + "security", + "usageCollection", + "fleet", + "cloud", + "ml", + "console", + "licensing" + ], + "requiredBundles": [ + "kibanaReact", + "esUiShared", + "runtimeFields" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/kubernetes_security/kibana.jsonc b/x-pack/plugins/kubernetes_security/kibana.jsonc index 838204a7bdbe5..793b5dcce3c6e 100644 --- a/x-pack/plugins/kubernetes_security/kibana.jsonc +++ b/x-pack/plugins/kubernetes_security/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/kubernetes-security-plugin", - "owner": "@elastic/kibana-cloud-security-posture", + "owner": [ + "@elastic/kibana-cloud-security-posture" + ], + "group": "security", + "visibility": "private", "plugin": { "id": "kubernetesSecurity", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "data", "timelines", @@ -16,4 +20,4 @@ "kibanaReact" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/lens/kibana.jsonc b/x-pack/plugins/lens/kibana.jsonc index 6a3f9875d1da9..4b0b14141474f 100644 --- a/x-pack/plugins/lens/kibana.jsonc +++ b/x-pack/plugins/lens/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/lens-plugin", - "owner": "@elastic/kibana-visualizations", + "owner": [ + "@elastic/kibana-visualizations" + ], + "group": "platform", + "visibility": "shared", "description": "Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana.", "plugin": { "id": "lens", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "lens" @@ -35,7 +39,7 @@ "expressionTagcloud", "eventAnnotation", "unifiedSearch", - "contentManagement", + "contentManagement" ], "optionalPlugins": [ "expressionLegacyMetricVis", @@ -57,10 +61,10 @@ "fieldFormats", "charts", "esqlDataGrid", - "esql", + "esql" ], "extraPublicDirs": [ "common/constants" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/license_api_guard/kibana.jsonc b/x-pack/plugins/license_api_guard/kibana.jsonc index a8d0ed45794d5..5f03763403d11 100644 --- a/x-pack/plugins/license_api_guard/kibana.jsonc +++ b/x-pack/plugins/license_api_guard/kibana.jsonc @@ -1,14 +1,18 @@ { "type": "plugin", "id": "@kbn/license-api-guard-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "licenseApiGuard", - "server": true, "browser": false, + "server": true, "configPath": [ "xpack", "licenseApiGuard" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/license_management/kibana.jsonc b/x-pack/plugins/license_management/kibana.jsonc index 72f1dc8b824ea..7fe037ed6b702 100644 --- a/x-pack/plugins/license_management/kibana.jsonc +++ b/x-pack/plugins/license_management/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/license-management-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "licenseManagement", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "license_management" @@ -29,4 +33,4 @@ "common/constants" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/licensing/kibana.jsonc b/x-pack/plugins/licensing/kibana.jsonc index 91eaa2eb4f38a..0fa69adb14b3a 100644 --- a/x-pack/plugins/licensing/kibana.jsonc +++ b/x-pack/plugins/licensing/kibana.jsonc @@ -1,15 +1,19 @@ { "type": "plugin", "id": "@kbn/licensing-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "licensing", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "licensing" ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/lists/kibana.jsonc b/x-pack/plugins/lists/kibana.jsonc index 83be4431ce8e8..92b668dc7bb13 100644 --- a/x-pack/plugins/lists/kibana.jsonc +++ b/x-pack/plugins/lists/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/lists-plugin", - "owner": "@elastic/security-detection-engine", + "owner": [ + "@elastic/security-detection-engine" + ], + "group": "security", + "visibility": "private", "plugin": { "id": "lists", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "lists" @@ -18,4 +22,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/logstash/kibana.jsonc b/x-pack/plugins/logstash/kibana.jsonc index a59fe4ea61af0..83665c1ed344e 100644 --- a/x-pack/plugins/logstash/kibana.jsonc +++ b/x-pack/plugins/logstash/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/logstash-plugin", - "owner": "@elastic/logstash", + "owner": [ + "@elastic/logstash" + ], + "group": "observability", + "visibility": "private", "plugin": { "id": "logstash", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "logstash" @@ -22,4 +26,4 @@ ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/maps/kibana.jsonc b/x-pack/plugins/maps/kibana.jsonc index 421817e87344f..a0472bf343eaa 100644 --- a/x-pack/plugins/maps/kibana.jsonc +++ b/x-pack/plugins/maps/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/maps-plugin", - "owner": "@elastic/kibana-presentation", + "owner": [ + "@elastic/kibana-presentation" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "maps", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "maps" @@ -50,10 +54,10 @@ "unifiedSearch", "fieldFormats", "esql", - "savedObjects", + "savedObjects" ], "extraPublicDirs": [ "common" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/ml/kibana.jsonc b/x-pack/plugins/ml/kibana.jsonc index 4ec2cf57312a9..274a92c57a2c3 100644 --- a/x-pack/plugins/ml/kibana.jsonc +++ b/x-pack/plugins/ml/kibana.jsonc @@ -1,13 +1,20 @@ { "type": "plugin", "id": "@kbn/ml-plugin", - "owner": "@elastic/ml-ui", + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "shared", "description": "This plugin provides access to the machine learning features provided by Elastic.", "plugin": { "id": "ml", - "server": true, "browser": true, - "configPath": ["xpack", "ml"], + "server": true, + "configPath": [ + "xpack", + "ml" + ], "requiredPlugins": [ "aiops", "charts", @@ -58,6 +65,8 @@ "savedObjectsFinder", "usageCollection" ], - "extraPublicDirs": ["common"] + "extraPublicDirs": [ + "common" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/monitoring/kibana.jsonc b/x-pack/plugins/monitoring/kibana.jsonc index 6ffcba1496163..51272f995b012 100644 --- a/x-pack/plugins/monitoring/kibana.jsonc +++ b/x-pack/plugins/monitoring/kibana.jsonc @@ -1,12 +1,18 @@ { "type": "plugin", "id": "@kbn/monitoring-plugin", - "owner": "@elastic/stack-monitoring", + "owner": [ + "@elastic/stack-monitoring" + ], + "group": "observability", + "visibility": "private", "plugin": { "id": "monitoring", - "server": true, "browser": true, - "configPath": ["monitoring"], + "server": true, + "configPath": [ + "monitoring" + ], "requiredPlugins": [ "licensing", "features", @@ -30,6 +36,10 @@ "dashboard", "fleet" ], - "requiredBundles": ["kibanaUtils", "alerting", "kibanaReact"] + "requiredBundles": [ + "kibanaUtils", + "alerting", + "kibanaReact" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/notifications/kibana.jsonc b/x-pack/plugins/notifications/kibana.jsonc index e223a12dbc793..fad93b4261b55 100644 --- a/x-pack/plugins/notifications/kibana.jsonc +++ b/x-pack/plugins/notifications/kibana.jsonc @@ -1,14 +1,18 @@ { "type": "plugin", "id": "@kbn/notifications-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "notifications", - "server": true, "browser": false, + "server": true, "optionalPlugins": [ "actions", "licensing" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/apm/ftr_e2e/kibana.jsonc b/x-pack/plugins/observability_solution/apm/ftr_e2e/kibana.jsonc index e0bf29cc4757c..47319dbadc61c 100644 --- a/x-pack/plugins/observability_solution/apm/ftr_e2e/kibana.jsonc +++ b/x-pack/plugins/observability_solution/apm/ftr_e2e/kibana.jsonc @@ -2,5 +2,7 @@ "type": "test-helper", "id": "@kbn/apm-ftr-e2e", "owner": "@elastic/obs-ux-infra_services-team", + "group": "observability", + "visibility": "private", "devOnly": true } diff --git a/x-pack/plugins/observability_solution/apm/kibana.jsonc b/x-pack/plugins/observability_solution/apm/kibana.jsonc index e12b22a43d60a..656f898f24064 100644 --- a/x-pack/plugins/observability_solution/apm/kibana.jsonc +++ b/x-pack/plugins/observability_solution/apm/kibana.jsonc @@ -1,13 +1,20 @@ { "type": "plugin", "id": "@kbn/apm-plugin", - "owner": "@elastic/obs-ux-infra_services-team", + "owner": [ + "@elastic/obs-ux-infra_services-team" + ], + "group": "observability", + "visibility": "private", "description": "The user interface for Elastic APM", "plugin": { "id": "apm", - "server": true, "browser": true, - "configPath": ["xpack", "apm"], + "server": true, + "configPath": [ + "xpack", + "apm" + ], "requiredPlugins": [ "apmDataAccess", "data", @@ -47,12 +54,19 @@ "serverless", "taskManager", "usageCollection", - "customIntegrations", // Move this to requiredPlugins after completely migrating from the Tutorials Home App + "customIntegrations", "licenseManagement", "profilingDataAccess", "cases", "observabilityAIAssistant" ], - "requiredBundles": ["fleet", "kibanaReact", "kibanaUtils", "ml", "observability", "maps"] + "requiredBundles": [ + "fleet", + "kibanaReact", + "kibanaUtils", + "ml", + "observability", + "maps" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/apm_data_access/kibana.jsonc b/x-pack/plugins/observability_solution/apm_data_access/kibana.jsonc index b898b465a91c1..51968be90cb7d 100644 --- a/x-pack/plugins/observability_solution/apm_data_access/kibana.jsonc +++ b/x-pack/plugins/observability_solution/apm_data_access/kibana.jsonc @@ -1,14 +1,26 @@ { "type": "plugin", "id": "@kbn/apm-data-access-plugin", - "owner": ["@elastic/obs-knowledge-team", "@elastic/obs-ux-infra_services-team"], + "owner": [ + "@elastic/obs-knowledge-team", + "@elastic/obs-ux-infra_services-team" + ], + "group": "observability", + "visibility": "private", "plugin": { "id": "apmDataAccess", - "server": true, "browser": false, - "configPath": ["xpack", "apm_data_access"], - "requiredPlugins": ["data"], - "optionalPlugins": ["security"], + "server": true, + "configPath": [ + "xpack", + "apm_data_access" + ], + "requiredPlugins": [ + "data" + ], + "optionalPlugins": [ + "security" + ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/dataset_quality/kibana.jsonc b/x-pack/plugins/observability_solution/dataset_quality/kibana.jsonc index 62b82fcb3a878..0e688533897e1 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/kibana.jsonc +++ b/x-pack/plugins/observability_solution/dataset_quality/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/dataset-quality-plugin", - "owner": "@elastic/obs-ux-logs-team", + "owner": [ + "@elastic/obs-ux-logs-team" + ], + "group": "observability", + "visibility": "private", "description": "This plugin introduces the concept of data set quality, where users can easily get an overview on the data sets they have.", "plugin": { "id": "datasetQuality", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "datasetQuality" @@ -27,10 +31,15 @@ "taskManager", "usageCollection" ], - "optionalPlugins": ["telemetry"], - "requiredBundles": ["unifiedHistogram", "discover"], + "optionalPlugins": [ + "telemetry" + ], + "requiredBundles": [ + "unifiedHistogram", + "discover" + ], "extraPublicDirs": [ "common" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/exploratory_view/kibana.jsonc b/x-pack/plugins/observability_solution/exploratory_view/kibana.jsonc index 4061de177e427..6795133ce3e00 100644 --- a/x-pack/plugins/observability_solution/exploratory_view/kibana.jsonc +++ b/x-pack/plugins/observability_solution/exploratory_view/kibana.jsonc @@ -1,12 +1,19 @@ { "type": "plugin", "id": "@kbn/exploratory-view-plugin", - "owner": "@elastic/obs-ux-management-team", + "owner": [ + "@elastic/obs-ux-management-team" + ], + "group": "observability", + "visibility": "private", "plugin": { "id": "exploratoryView", - "server": false, "browser": true, - "configPath": ["xpack", "exploratory_view"], + "server": false, + "configPath": [ + "xpack", + "exploratory_view" + ], "requiredPlugins": [ "alerting", "cases", @@ -23,7 +30,15 @@ "triggersActionsUi", "unifiedSearch" ], - "optionalPlugins": ["discover", "embeddable", "home", "licensing", "spaces", "usageCollection", "observabilityAIAssistant"], + "optionalPlugins": [ + "discover", + "embeddable", + "home", + "licensing", + "spaces", + "usageCollection", + "observabilityAIAssistant" + ], "requiredBundles": [ "dataViews", "embeddable", @@ -34,6 +49,8 @@ "unifiedSearch", "visualizations" ], - "extraPublicDirs": ["common"] + "extraPublicDirs": [ + "common" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/logs_explorer/kibana.jsonc b/x-pack/plugins/observability_solution/logs_explorer/kibana.jsonc index ad991a8f3d29a..48eb63efd0c92 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/kibana.jsonc +++ b/x-pack/plugins/observability_solution/logs_explorer/kibana.jsonc @@ -1,13 +1,20 @@ { "type": "plugin", "id": "@kbn/logs-explorer-plugin", - "owner": "@elastic/obs-ux-logs-team", + "owner": [ + "@elastic/obs-ux-logs-team" + ], + "group": "observability", + "visibility": "private", "description": "This plugin provides a LogsExplorer component using the Discover customization framework, offering several affordances specifically designed for log consumption.", "plugin": { "id": "logsExplorer", - "server": true, "browser": true, - "configPath": ["xpack", "logsExplorer"], + "server": true, + "configPath": [ + "xpack", + "logsExplorer" + ], "requiredPlugins": [ "data", "dataViews", @@ -20,7 +27,14 @@ "discoverShared" ], "optionalPlugins": [], - "requiredBundles": ["controls", "fleet", "kibanaReact", "kibanaUtils"], - "extraPublicDirs": ["common"] + "requiredBundles": [ + "controls", + "fleet", + "kibanaReact", + "kibanaUtils" + ], + "extraPublicDirs": [ + "common" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/metrics_data_access/kibana.jsonc b/x-pack/plugins/observability_solution/metrics_data_access/kibana.jsonc index a3446733c7f6f..17ad2991f315d 100644 --- a/x-pack/plugins/observability_solution/metrics_data_access/kibana.jsonc +++ b/x-pack/plugins/observability_solution/metrics_data_access/kibana.jsonc @@ -1,13 +1,21 @@ { "type": "plugin", "id": "@kbn/metrics-data-access-plugin", - "owner": ["@elastic/obs-knowledge-team", "@elastic/obs-ux-infra_services-team"], + "owner": [ + "@elastic/obs-knowledge-team", + "@elastic/obs-ux-infra_services-team" + ], + "group": "observability", + "visibility": "private", "description": "Exposes utilities for accessing metrics data", "plugin": { "id": "metricsDataAccess", - "server": true, "browser": true, - "configPath": ["xpack", "metrics_data_access"], + "server": true, + "configPath": [ + "xpack", + "metrics_data_access" + ], "requiredPlugins": [ "data", "observabilityShared" @@ -15,6 +23,8 @@ "requiredBundles": [ "kibanaReact" ], - "extraPublicDirs": ["common"] + "extraPublicDirs": [ + "common" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/observability/kibana.jsonc b/x-pack/plugins/observability_solution/observability/kibana.jsonc index 859e7340a799d..1c09efd7dd6e1 100644 --- a/x-pack/plugins/observability_solution/observability/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability/kibana.jsonc @@ -1,12 +1,19 @@ { "type": "plugin", "id": "@kbn/observability-plugin", - "owner": "@elastic/obs-ux-management-team", + "owner": [ + "@elastic/obs-ux-management-team" + ], + "group": "observability", + "visibility": "private", "plugin": { "id": "observability", - "server": true, "browser": true, - "configPath": ["xpack", "observability"], + "server": true, + "configPath": [ + "xpack", + "observability" + ], "requiredPlugins": [ "aiops", "alerting", @@ -59,6 +66,8 @@ "stackAlerts", "spaces" ], - "extraPublicDirs": ["common"] + "extraPublicDirs": [ + "common" + ] } -} +} \ No newline at end of file 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 39af4d91bc87b..c61ed31e60b10 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/kibana.jsonc @@ -1,23 +1,38 @@ { "type": "plugin", "id": "@kbn/observability-ai-assistant-plugin", - "owner": "@elastic/obs-ai-assistant", + "owner": [ + "@elastic/obs-ai-assistant" + ], + "group": "observability", + "visibility": "private", "plugin": { "id": "observabilityAIAssistant", - "server": true, "browser": true, - "configPath": ["xpack", "observabilityAIAssistant"], + "server": true, + "configPath": [ + "xpack", + "observabilityAIAssistant" + ], "requiredPlugins": [ "actions", "features", "licensing", "security", "taskManager", - "dataViews", + "dataViews" + ], + "optionalPlugins": [ + "cloud", + "serverless" + ], + "requiredBundles": [ + "kibanaReact", + "kibanaUtils" + ], + "runtimePluginDependencies": [ + "ml" ], - "requiredBundles": ["kibanaReact", "kibanaUtils"], - "optionalPlugins": ["cloud", "serverless"], - "extraPublicDirs": [], - "runtimePluginDependencies": [ "ml" ] + "extraPublicDirs": [] } -} +} \ No newline at end of file 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 1414912d39164..efc948503b0c0 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 @@ -1,12 +1,19 @@ { "type": "plugin", "id": "@kbn/observability-ai-assistant-app-plugin", - "owner": "@elastic/obs-ai-assistant", + "owner": [ + "@elastic/obs-ai-assistant" + ], + "group": "observability", + "visibility": "private", "plugin": { "id": "observabilityAIAssistantApp", - "server": true, "browser": true, - "configPath": ["xpack", "observabilityAIAssistantApp"], + "server": true, + "configPath": [ + "xpack", + "observabilityAIAssistantApp" + ], "requiredPlugins": [ "aiAssistantManagementSelection", "observabilityAIAssistant", @@ -27,8 +34,13 @@ "inference", "logsDataAccess" ], - "requiredBundles": ["kibanaReact", "esqlDataGrid"], - "optionalPlugins": ["cloud"], + "optionalPlugins": [ + "cloud" + ], + "requiredBundles": [ + "kibanaReact", + "esqlDataGrid" + ], "extraPublicDirs": [] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/kibana.jsonc b/x-pack/plugins/observability_solution/observability_logs_explorer/kibana.jsonc index 98073fc2b6f21..40f678ac0a15e 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/observability-logs-explorer-plugin", - "owner": "@elastic/obs-ux-logs-team", + "owner": [ + "@elastic/obs-ux-logs-team" + ], + "group": "observability", + "visibility": "private", "description": "This plugin exposes and registers observability log consumption features.", "plugin": { "id": "observabilityLogsExplorer", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "observabilityLogsExplorer" @@ -40,4 +44,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/observability_onboarding/e2e/kibana.jsonc b/x-pack/plugins/observability_solution/observability_onboarding/e2e/kibana.jsonc index 551d012935b44..655ccc396d3fe 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/e2e/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_onboarding/e2e/kibana.jsonc @@ -5,5 +5,7 @@ "@elastic/obs-ux-logs-team", "@elastic/obs-ux-onboarding-team" ], + "group": "observability", + "visibility": "private", "devOnly": true } diff --git a/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc b/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc index 859f9539bd9fa..8c24f5376a4bb 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_onboarding/kibana.jsonc @@ -1,12 +1,20 @@ { "type": "plugin", "id": "@kbn/observability-onboarding-plugin", - "owner": ["@elastic/obs-ux-logs-team", "@elastic/obs-ux-onboarding-team"], + "owner": [ + "@elastic/obs-ux-logs-team", + "@elastic/obs-ux-onboarding-team" + ], + "group": "observability", + "visibility": "private", "plugin": { "id": "observabilityOnboarding", - "server": true, "browser": true, - "configPath": ["xpack", "observability_onboarding"], + "server": true, + "configPath": [ + "xpack", + "observability_onboarding" + ], "requiredPlugins": [ "data", "observability", @@ -16,8 +24,15 @@ "fleet", "customIntegrations" ], - "optionalPlugins": ["cloud", "usageCollection"], - "requiredBundles": ["kibanaReact"], - "extraPublicDirs": ["common"] + "optionalPlugins": [ + "cloud", + "usageCollection" + ], + "requiredBundles": [ + "kibanaReact" + ], + "extraPublicDirs": [ + "common" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/observability_shared/kibana.jsonc b/x-pack/plugins/observability_solution/observability_shared/kibana.jsonc index 3409c8c11525f..a5cde081c7c54 100644 --- a/x-pack/plugins/observability_solution/observability_shared/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_shared/kibana.jsonc @@ -1,15 +1,36 @@ { "type": "plugin", "id": "@kbn/observability-shared-plugin", - "owner": "@elastic/observability-ui", + "owner": [ + "@elastic/observability-ui" + ], + "group": "observability", + "visibility": "private", "plugin": { "id": "observabilityShared", - "server": false, "browser": true, - "configPath": ["xpack", "observability_shared"], - "requiredPlugins": ["cases", "uiActions", "embeddable", "share"], - "optionalPlugins": ["guidedOnboarding"], - "requiredBundles": ["data", "inspector", "kibanaReact", "kibanaUtils"], - "extraPublicDirs": ["common"] + "server": false, + "configPath": [ + "xpack", + "observability_shared" + ], + "requiredPlugins": [ + "cases", + "uiActions", + "embeddable", + "share" + ], + "optionalPlugins": [ + "guidedOnboarding" + ], + "requiredBundles": [ + "data", + "inspector", + "kibanaReact", + "kibanaUtils" + ], + "extraPublicDirs": [ + "common" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/profiling/kibana.jsonc b/x-pack/plugins/observability_solution/profiling/kibana.jsonc index 329da8be36f1a..e304f0c77e548 100644 --- a/x-pack/plugins/observability_solution/profiling/kibana.jsonc +++ b/x-pack/plugins/observability_solution/profiling/kibana.jsonc @@ -1,20 +1,18 @@ { "type": "plugin", "id": "@kbn/profiling-plugin", - "owner": "@elastic/obs-ux-infra_services-team", + "owner": [ + "@elastic/obs-ux-infra_services-team" + ], + "group": "observability", + "visibility": "private", "plugin": { "id": "profiling", - "server": true, "browser": true, - "configPath": ["xpack", "profiling"], - "optionalPlugins": [ - "spaces", - "usageCollection", - "security", - "cloud", - "fleet", - "observabilityAIAssistant", - "apmDataAccess", + "server": true, + "configPath": [ + "xpack", + "profiling" ], "requiredPlugins": [ "charts", @@ -28,9 +26,18 @@ "share", "profilingDataAccess" ], + "optionalPlugins": [ + "spaces", + "usageCollection", + "security", + "cloud", + "fleet", + "observabilityAIAssistant", + "apmDataAccess" + ], "requiredBundles": [ "kibanaReact", "kibanaUtils" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/profiling_data_access/kibana.jsonc b/x-pack/plugins/observability_solution/profiling_data_access/kibana.jsonc index a2c3fb4cb267b..47a11e19dad3d 100644 --- a/x-pack/plugins/observability_solution/profiling_data_access/kibana.jsonc +++ b/x-pack/plugins/observability_solution/profiling_data_access/kibana.jsonc @@ -1,16 +1,26 @@ { "type": "plugin", "id": "@kbn/profiling-data-access-plugin", - "owner": "@elastic/obs-ux-infra_services-team", + "owner": [ + "@elastic/obs-ux-infra_services-team" + ], + "group": "observability", + "visibility": "private", "plugin": { "id": "profilingDataAccess", - "server": true, "browser": false, - "configPath": ["xpack", "profiling"], + "server": true, + "configPath": [ + "xpack", + "profiling" + ], "requiredPlugins": [ - "data", + "data" + ], + "optionalPlugins": [ + "cloud", + "fleet" ], - "optionalPlugins": ["cloud", "fleet"], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/slo/kibana.jsonc b/x-pack/plugins/observability_solution/slo/kibana.jsonc index c00145f96362e..c1054089c508a 100644 --- a/x-pack/plugins/observability_solution/slo/kibana.jsonc +++ b/x-pack/plugins/observability_solution/slo/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/slo-plugin", - "owner": "@elastic/obs-ux-management-team", + "owner": [ + "@elastic/obs-ux-management-team" + ], + "group": "observability", + "visibility": "private", "plugin": { "id": "slo", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "slo" @@ -52,4 +56,4 @@ "ingestPipelines" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/synthetics/kibana.jsonc b/x-pack/plugins/observability_solution/synthetics/kibana.jsonc index 30f267fc72573..89870a9e6c881 100644 --- a/x-pack/plugins/observability_solution/synthetics/kibana.jsonc +++ b/x-pack/plugins/observability_solution/synthetics/kibana.jsonc @@ -1,13 +1,20 @@ { "type": "plugin", "id": "@kbn/synthetics-plugin", - "owner": "@elastic/obs-ux-management-team", + "owner": [ + "@elastic/obs-ux-management-team" + ], + "group": "observability", + "visibility": "private", "description": "This plugin visualizes data from Synthetics and Heartbeat, and integrates with other Observability solutions.", "plugin": { "id": "synthetics", - "server": true, "browser": true, - "configPath": ["xpack", "uptime"], + "server": true, + "configPath": [ + "xpack", + "uptime" + ], "requiredPlugins": [ "actions", "alerting", @@ -57,7 +64,7 @@ "observability", "spaces", "indexLifecycleManagement", - "unifiedDocViewer", + "unifiedDocViewer" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/uptime/kibana.jsonc b/x-pack/plugins/observability_solution/uptime/kibana.jsonc index b45d8b78bc9cc..c4c8b8b9d76de 100644 --- a/x-pack/plugins/observability_solution/uptime/kibana.jsonc +++ b/x-pack/plugins/observability_solution/uptime/kibana.jsonc @@ -1,13 +1,20 @@ { "type": "plugin", "id": "@kbn/uptime-plugin", - "owner": "@elastic/obs-ux-management-team", + "owner": [ + "@elastic/obs-ux-management-team" + ], + "group": "observability", + "visibility": "private", "description": "This plugin visualizes data from Heartbeat, and integrates with other Observability solutions.", "plugin": { "id": "uptime", - "server": true, "browser": true, - "configPath": ["xpack", "legacy_uptime"], + "server": true, + "configPath": [ + "xpack", + "legacy_uptime" + ], "requiredPlugins": [ "actions", "alerting", @@ -33,12 +40,21 @@ "unifiedSearch", "bfetch" ], - "optionalPlugins": ["cloud", "data", "fleet", "home", "ml", "spaces", "telemetry", "observabilityAIAssistant"], + "optionalPlugins": [ + "cloud", + "data", + "fleet", + "home", + "ml", + "spaces", + "telemetry", + "observabilityAIAssistant" + ], "requiredBundles": [ "fleet", "kibanaReact", "kibanaUtils", - "observability", + "observability" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/observability_solution/ux/kibana.jsonc b/x-pack/plugins/observability_solution/ux/kibana.jsonc index 3e09a387f91b3..f2770a896d89b 100644 --- a/x-pack/plugins/observability_solution/ux/kibana.jsonc +++ b/x-pack/plugins/observability_solution/ux/kibana.jsonc @@ -1,12 +1,19 @@ { "type": "plugin", "id": "@kbn/ux-plugin", - "owner": "@elastic/obs-ux-infra_services-team", + "owner": [ + "@elastic/obs-ux-infra_services-team" + ], + "group": "observability", + "visibility": "private", "plugin": { "id": "ux", - "server": true, "browser": true, - "configPath": ["xpack", "ux"], + "server": true, + "configPath": [ + "xpack", + "ux" + ], "requiredPlugins": [ "features", "data", @@ -39,4 +46,4 @@ "maps" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/painless_lab/kibana.jsonc b/x-pack/plugins/painless_lab/kibana.jsonc index e65ff13f6a8d0..adfc4db52f576 100644 --- a/x-pack/plugins/painless_lab/kibana.jsonc +++ b/x-pack/plugins/painless_lab/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/painless-lab-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "painlessLab", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "painless_lab" @@ -19,4 +23,4 @@ "kibanaReact" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/remote_clusters/kibana.jsonc b/x-pack/plugins/remote_clusters/kibana.jsonc index 305ee26caebae..3c57477b17f5f 100644 --- a/x-pack/plugins/remote_clusters/kibana.jsonc +++ b/x-pack/plugins/remote_clusters/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/remote-clusters-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "remoteClusters", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "remote_clusters" @@ -26,4 +30,4 @@ "esUiShared" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/reporting/kibana.jsonc b/x-pack/plugins/reporting/kibana.jsonc index 8c9e97a1f6291..4273ad8ae6dab 100644 --- a/x-pack/plugins/reporting/kibana.jsonc +++ b/x-pack/plugins/reporting/kibana.jsonc @@ -1,13 +1,20 @@ { "type": "plugin", "id": "@kbn/reporting-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private", "description": "Reporting Services enables applications to feature reports that the user can automate with Watcher and download later.", "plugin": { "id": "reporting", - "server": true, "browser": true, - "configPath": ["xpack", "reporting"], + "server": true, + "configPath": [ + "xpack", + "reporting" + ], "requiredPlugins": [ "data", "discover", @@ -21,7 +28,16 @@ "share", "features" ], - "optionalPlugins": ["security", "spaces", "usageCollection", "screenshotting"], - "requiredBundles": ["embeddable", "esUiShared", "kibanaReact"] + "optionalPlugins": [ + "security", + "spaces", + "usageCollection", + "screenshotting" + ], + "requiredBundles": [ + "embeddable", + "esUiShared", + "kibanaReact" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/rollup/kibana.jsonc b/x-pack/plugins/rollup/kibana.jsonc index 62f2daa8a1704..95e1e21b84956 100644 --- a/x-pack/plugins/rollup/kibana.jsonc +++ b/x-pack/plugins/rollup/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/rollup-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "rollup", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "rollup" @@ -29,4 +33,4 @@ "data" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/rule_registry/kibana.jsonc b/x-pack/plugins/rule_registry/kibana.jsonc index 28612bff2b9cc..d663b254a3a32 100644 --- a/x-pack/plugins/rule_registry/kibana.jsonc +++ b/x-pack/plugins/rule_registry/kibana.jsonc @@ -5,10 +5,12 @@ "@elastic/response-ops", "@elastic/obs-ux-management-team" ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "ruleRegistry", - "server": true, "browser": false, + "server": true, "configPath": [ "xpack", "ruleRegistry" @@ -23,4 +25,4 @@ "spaces" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/runtime_fields/kibana.jsonc b/x-pack/plugins/runtime_fields/kibana.jsonc index 54f222d0fdf23..95d7815414dbf 100644 --- a/x-pack/plugins/runtime_fields/kibana.jsonc +++ b/x-pack/plugins/runtime_fields/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/runtime-fields-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "runtimeFields", - "server": false, "browser": true, + "server": false, "configPath": [ "xpack", "runtime_fields" @@ -15,4 +19,4 @@ "esUiShared" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/saved_objects_tagging/kibana.jsonc b/x-pack/plugins/saved_objects_tagging/kibana.jsonc index a3c5609148d99..3a2cdef308de0 100644 --- a/x-pack/plugins/saved_objects_tagging/kibana.jsonc +++ b/x-pack/plugins/saved_objects_tagging/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/saved-objects-tagging-plugin", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "savedObjectsTagging", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "saved_object_tagging" @@ -21,4 +25,4 @@ ], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/screenshotting/kibana.jsonc b/x-pack/plugins/screenshotting/kibana.jsonc index 426df4176e750..770b8c8fb9b91 100644 --- a/x-pack/plugins/screenshotting/kibana.jsonc +++ b/x-pack/plugins/screenshotting/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/screenshotting-plugin", - "owner": "@elastic/kibana-reporting-services", + "owner": [ + "@elastic/kibana-reporting-services" + ], + "group": "platform", + "visibility": "private", "description": "Kibana Screenshotting Plugin", "plugin": { "id": "screenshotting", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "screenshotting" @@ -19,4 +23,4 @@ "cloud" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/searchprofiler/kibana.jsonc b/x-pack/plugins/searchprofiler/kibana.jsonc index 3c2b0909cef2b..165066ef0dda6 100644 --- a/x-pack/plugins/searchprofiler/kibana.jsonc +++ b/x-pack/plugins/searchprofiler/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/searchprofiler-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "searchprofiler", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "searchprofiler" @@ -20,4 +24,4 @@ "esUiShared" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/security/kibana.jsonc b/x-pack/plugins/security/kibana.jsonc index 01d089a90bea9..f4fe8bceb2bbc 100644 --- a/x-pack/plugins/security/kibana.jsonc +++ b/x-pack/plugins/security/kibana.jsonc @@ -1,17 +1,20 @@ { "type": "plugin", "id": "@kbn/security-plugin", - "owner": "@elastic/kibana-security", + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared", "description": "This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user.", "plugin": { "id": "security", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "security" ], - "enabledOnAnonymousPages": true, "requiredPlugins": [ "features", "licensing", @@ -31,6 +34,7 @@ "spaces", "esUiShared", "remoteClusters" - ] + ], + "enabledOnAnonymousPages": true } -} +} \ No newline at end of file diff --git a/x-pack/plugins/security_solution/kibana.jsonc b/x-pack/plugins/security_solution/kibana.jsonc index e48a9794b7e5c..d6f3e5f6580e3 100644 --- a/x-pack/plugins/security_solution/kibana.jsonc +++ b/x-pack/plugins/security_solution/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/security-solution-plugin", - "owner": "@elastic/security-solution", + "owner": [ + "@elastic/security-solution" + ], + "group": "security", + "visibility": "private", "plugin": { "id": "securitySolution", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "securitySolution" diff --git a/x-pack/plugins/security_solution_ess/kibana.jsonc b/x-pack/plugins/security_solution_ess/kibana.jsonc index b77bafa226adb..849c4eb529987 100644 --- a/x-pack/plugins/security_solution_ess/kibana.jsonc +++ b/x-pack/plugins/security_solution_ess/kibana.jsonc @@ -1,20 +1,29 @@ { "type": "plugin", "id": "@kbn/security-solution-ess", - "owner": "@elastic/security-solution", + "owner": [ + "@elastic/security-solution" + ], + "group": "security", + "visibility": "private", "description": "ESS customizations for Security Solution.", "plugin": { "id": "securitySolutionEss", - "server": true, "browser": true, - "configPath": ["xpack", "securitySolutionEss"], + "server": true, + "configPath": [ + "xpack", + "securitySolutionEss" + ], "requiredPlugins": [ "securitySolution", "management", "navigation", - "licensing", + "licensing" ], "optionalPlugins": [], - "requiredBundles": [ "kibanaReact"] + "requiredBundles": [ + "kibanaReact" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/security_solution_serverless/kibana.jsonc b/x-pack/plugins/security_solution_serverless/kibana.jsonc index 1829503bfe988..fa52190aa2784 100644 --- a/x-pack/plugins/security_solution_serverless/kibana.jsonc +++ b/x-pack/plugins/security_solution_serverless/kibana.jsonc @@ -1,15 +1,19 @@ { "type": "plugin", "id": "@kbn/security-solution-serverless", - "owner": "@elastic/security-solution", + "owner": [ + "@elastic/security-solution" + ], + "group": "security", + "visibility": "private", "description": "Serverless customizations for security.", "plugin": { "id": "securitySolutionServerless", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", - "securitySolutionServerless", + "securitySolutionServerless" ], "requiredPlugins": [ "kibanaReact", @@ -26,6 +30,6 @@ "optionalPlugins": [ "securitySolutionEss", "integrationAssistant" - ], + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/serverless/kibana.jsonc b/x-pack/plugins/serverless/kibana.jsonc index 1c3d5cef4f7bf..e06b7147b79d0 100644 --- a/x-pack/plugins/serverless/kibana.jsonc +++ b/x-pack/plugins/serverless/kibana.jsonc @@ -1,16 +1,20 @@ { "type": "plugin", "id": "@kbn/serverless", - "owner": "@elastic/appex-sharedux", + "owner": [ + "@elastic/appex-sharedux" + ], + "group": "platform", + "visibility": "shared", "description": "The core Serverless plugin, providing APIs to Serverless Project plugins.", "plugin": { "id": "serverless", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "serverless", - "plugin", + "plugin" ], "requiredPlugins": [ "cloud" @@ -18,4 +22,4 @@ "optionalPlugins": [], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/serverless_observability/kibana.jsonc b/x-pack/plugins/serverless_observability/kibana.jsonc index 95795670d0443..fce943c44865a 100644 --- a/x-pack/plugins/serverless_observability/kibana.jsonc +++ b/x-pack/plugins/serverless_observability/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/serverless-observability", - "owner": "@elastic/obs-ux-management-team", + "owner": [ + "@elastic/obs-ux-management-team" + ], + "group": "observability", + "visibility": "private", "description": "Serverless customizations for observability.", "plugin": { "id": "serverlessObservability", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "serverless", @@ -19,9 +23,9 @@ "observabilityShared", "management", "discover", - "security", + "security" ], "optionalPlugins": [], "requiredBundles": [] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/serverless_search/kibana.jsonc b/x-pack/plugins/serverless_search/kibana.jsonc index 504c346262492..f7b404edb37b1 100644 --- a/x-pack/plugins/serverless_search/kibana.jsonc +++ b/x-pack/plugins/serverless_search/kibana.jsonc @@ -1,13 +1,21 @@ { "type": "plugin", "id": "@kbn/serverless-search", - "owner": "@elastic/search-kibana", + "owner": [ + "@elastic/search-kibana" + ], + "group": "search", + "visibility": "private", "description": "Serverless customizations for search.", "plugin": { "id": "serverlessSearch", - "server": true, "browser": true, - "configPath": ["xpack", "serverless", "search"], + "server": true, + "configPath": [ + "xpack", + "serverless", + "search" + ], "requiredPlugins": [ "cloud", "console", diff --git a/x-pack/plugins/session_view/kibana.jsonc b/x-pack/plugins/session_view/kibana.jsonc index d247f924256bb..3ec03862e6af9 100644 --- a/x-pack/plugins/session_view/kibana.jsonc +++ b/x-pack/plugins/session_view/kibana.jsonc @@ -1,13 +1,26 @@ { "type": "plugin", "id": "@kbn/session-view-plugin", - "owner": "@elastic/kibana-cloud-security-posture", + "owner": [ + "@elastic/kibana-cloud-security-posture" + ], + "group": "security", + "visibility": "private", "plugin": { "id": "sessionView", - "server": true, "browser": true, - "requiredPlugins": ["data", "timelines", "ruleRegistry"], - "optionalPlugins": ["usageCollection"], - "requiredBundles": ["kibanaReact", "esUiShared"] + "server": true, + "requiredPlugins": [ + "data", + "timelines", + "ruleRegistry" + ], + "optionalPlugins": [ + "usageCollection" + ], + "requiredBundles": [ + "kibanaReact", + "esUiShared" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/snapshot_restore/kibana.jsonc b/x-pack/plugins/snapshot_restore/kibana.jsonc index 07590900a7a69..10cbead02e85c 100644 --- a/x-pack/plugins/snapshot_restore/kibana.jsonc +++ b/x-pack/plugins/snapshot_restore/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/snapshot-restore-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "snapshotRestore", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "snapshot_restore" @@ -27,4 +31,4 @@ "kibanaReact" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/spaces/kibana.jsonc b/x-pack/plugins/spaces/kibana.jsonc index f59caa16837c3..e502f1de9d8a6 100644 --- a/x-pack/plugins/spaces/kibana.jsonc +++ b/x-pack/plugins/spaces/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/spaces-plugin", - "owner": "@elastic/kibana-security", + "owner": [ + "@elastic/kibana-security" + ], + "group": "platform", + "visibility": "shared", "description": "This plugin provides the Spaces feature, which allows saved objects to be organized into meaningful categories.", "plugin": { "id": "spaces", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "spaces" @@ -19,15 +23,17 @@ "home", "management", "usageCollection", - "cloud", + "cloud" ], "requiredBundles": [ "esUiShared", "kibanaReact" ], + "runtimePluginDependencies": [ + "security" + ], "extraPublicDirs": [ "common" - ], - "runtimePluginDependencies": ["security"] + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/stack_alerts/kibana.jsonc b/x-pack/plugins/stack_alerts/kibana.jsonc index 4d000228b0e07..c3536e923ec26 100644 --- a/x-pack/plugins/stack_alerts/kibana.jsonc +++ b/x-pack/plugins/stack_alerts/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/stack-alerts-plugin", - "owner": "@elastic/response-ops", + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "stackAlerts", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "stack_alerts" @@ -24,6 +28,8 @@ "esUiShared", "esql" ], - "extraPublicDirs": ["common"] + "extraPublicDirs": [ + "common" + ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/stack_connectors/kibana.jsonc b/x-pack/plugins/stack_connectors/kibana.jsonc index da8e973b6f990..91991304f85cb 100644 --- a/x-pack/plugins/stack_connectors/kibana.jsonc +++ b/x-pack/plugins/stack_connectors/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/stack-connectors-plugin", - "owner": "@elastic/response-ops", + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "stackConnectors", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "stack_connectors" @@ -20,4 +24,4 @@ "public/common" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/task_manager/kibana.jsonc b/x-pack/plugins/task_manager/kibana.jsonc index 33edc225e42c1..0e364c7cdaa34 100644 --- a/x-pack/plugins/task_manager/kibana.jsonc +++ b/x-pack/plugins/task_manager/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/task-manager-plugin", - "owner": "@elastic/response-ops", + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "taskManager", - "server": true, "browser": false, + "server": true, "configPath": [ "xpack", "task_manager" @@ -15,4 +19,4 @@ "usageCollection" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/telemetry_collection_xpack/kibana.jsonc b/x-pack/plugins/telemetry_collection_xpack/kibana.jsonc index 5e0675a9e12f8..c5731e427656c 100644 --- a/x-pack/plugins/telemetry_collection_xpack/kibana.jsonc +++ b/x-pack/plugins/telemetry_collection_xpack/kibana.jsonc @@ -1,13 +1,17 @@ { "type": "plugin", "id": "@kbn/telemetry-collection-xpack-plugin", - "owner": "@elastic/kibana-core", + "owner": [ + "@elastic/kibana-core" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "telemetryCollectionXpack", - "server": true, "browser": false, + "server": true, "requiredPlugins": [ "telemetryCollectionManager" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/threat_intelligence/kibana.jsonc b/x-pack/plugins/threat_intelligence/kibana.jsonc index 35077b11facac..b4c5424e51d84 100644 --- a/x-pack/plugins/threat_intelligence/kibana.jsonc +++ b/x-pack/plugins/threat_intelligence/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/threat-intelligence-plugin", - "owner": "@elastic/security-threat-hunting-investigations", + "owner": [ + "@elastic/security-threat-hunting-investigations" + ], + "group": "security", + "visibility": "private", "description": "Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats", "plugin": { "id": "threatIntelligence", - "server": true, "browser": true, + "server": true, "requiredPlugins": [ "cases", "data", @@ -24,4 +28,4 @@ "kibanaReact" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/timelines/kibana.jsonc b/x-pack/plugins/timelines/kibana.jsonc index 8855284d024af..368c570711bd6 100644 --- a/x-pack/plugins/timelines/kibana.jsonc +++ b/x-pack/plugins/timelines/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/timelines-plugin", - "owner": "@elastic/security-threat-hunting-investigations", + "owner": [ + "@elastic/security-threat-hunting-investigations" + ], + "group": "security", + "visibility": "private", "plugin": { "id": "timelines", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "timelines" @@ -24,4 +28,4 @@ "common" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/transform/kibana.jsonc b/x-pack/plugins/transform/kibana.jsonc index 1f8ab0fe72f40..8c81d44c21bc4 100644 --- a/x-pack/plugins/transform/kibana.jsonc +++ b/x-pack/plugins/transform/kibana.jsonc @@ -1,12 +1,16 @@ { "type": "plugin", "id": "@kbn/transform-plugin", - "owner": "@elastic/ml-ui", + "owner": [ + "@elastic/ml-ui" + ], + "group": "platform", + "visibility": "private", "description": "This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics.", "plugin": { "id": "transform", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "transform" @@ -26,7 +30,7 @@ "charts", "savedObjectsFinder", "savedObjectsManagement", - "contentManagement", + "contentManagement" ], "optionalPlugins": [ "dataViewEditor", @@ -39,10 +43,10 @@ "esUiShared", "discover", "kibanaUtils", - "kibanaReact", + "kibanaReact" ], "extraPublicDirs": [ "common" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/translations/kibana.jsonc b/x-pack/plugins/translations/kibana.jsonc index 910429b866de4..a72b43152d4a2 100644 --- a/x-pack/plugins/translations/kibana.jsonc +++ b/x-pack/plugins/translations/kibana.jsonc @@ -1,14 +1,18 @@ { "type": "plugin", "id": "@kbn/translations-plugin", - "owner": "@elastic/kibana-localization", + "owner": [ + "@elastic/kibana-localization" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "translations", - "server": true, "browser": false, + "server": true, "configPath": [ "x-pack", "translations" ] } -} +} \ No newline at end of file diff --git a/x-pack/plugins/triggers_actions_ui/kibana.jsonc b/x-pack/plugins/triggers_actions_ui/kibana.jsonc index 66fcd64dabb93..4f8e8f95bc446 100644 --- a/x-pack/plugins/triggers_actions_ui/kibana.jsonc +++ b/x-pack/plugins/triggers_actions_ui/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/triggers-actions-ui-plugin", - "owner": "@elastic/response-ops", + "owner": [ + "@elastic/response-ops" + ], + "group": "platform", + "visibility": "shared", "plugin": { "id": "triggersActionsUi", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "trigger_actions_ui" @@ -45,7 +49,7 @@ ], "extraPublicDirs": [ "public/common", - "public/common/constants", + "public/common/constants" ] } } \ No newline at end of file diff --git a/x-pack/plugins/watcher/kibana.jsonc b/x-pack/plugins/watcher/kibana.jsonc index 97fad87071f4d..eeac1df8e7199 100644 --- a/x-pack/plugins/watcher/kibana.jsonc +++ b/x-pack/plugins/watcher/kibana.jsonc @@ -1,11 +1,15 @@ { "type": "plugin", "id": "@kbn/watcher-plugin", - "owner": "@elastic/kibana-management", + "owner": [ + "@elastic/kibana-management" + ], + "group": "platform", + "visibility": "private", "plugin": { "id": "watcher", - "server": true, "browser": true, + "server": true, "configPath": [ "xpack", "watcher" @@ -28,4 +32,4 @@ "fieldFormats" ] } -} +} \ No newline at end of file From b4a80d8d506dd474b4dfb599fc123cb612a5d79b Mon Sep 17 00:00:00 2001 From: Kfir Peled <61654899+kfirpeled@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:30:15 +0100 Subject: [PATCH 029/135] [Cloud Security] Added graph visualization in alert's flyout (#196034) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Enables a new experimental feature. To visualize an alert/event by a graph. When the alert/event does not contain the relevant data the graph preview will not be visible (confirmed by @tinnytintin10) To enable the feature through kibana's config: ```yaml xpack.securitySolution.enableExperimental: ['graphVisualizationInFlyoutEnabled'] ```
Event's graph visualization: 🎥 https://github.com/user-attachments/assets/4cee2032-173e-4b44-b371-a8e187763764
Alert's graph visualization: 🎥 https://github.com/user-attachments/assets/4fb942d0-6704-4c79-862c-956821ce59b6
Alert in rule preview: 🎥 https://github.com/user-attachments/assets/4f8d086e-1ee4-414f-8efa-4715c1d5e1f6
**List of TODO's** - Add FTR test to host's flyout - Add FTR test to alerts preview - Enhance graph_preview_container UT to cover all edge cases - Enhance visualization_section UT to cover all edge cases **List of open issues (will be tracked in a different ticket):** - Graph preview search on the past 60 days, which can lead to an empty graph - API should return 404 when the feature is not enabled - ~Empty state message~ Not showing the graph preview instead. **How to test:** First, enable the feature, add to `config/kibana.dev.yml`: ```yaml xpack.securitySolution.enableExperimental: ['graphVisualizationInFlyoutEnabled'] ``` Second, load mocked data ```bash node scripts/es_archiver load x-pack/test/cloud_security_posture_functional/es_archives/logs_gcp_audit \ --es-url http://elastic:changeme@localhost:9200 \ --kibana-url http://elastic:changeme@localhost:5601 node scripts/es_archiver load x-pack/test/cloud_security_posture_functional/es_archives/security_alerts \ --es-url http://elastic:changeme@localhost:9200 \ --kibana-url http://elastic:changeme@localhost:5601 ``` 1. Go to the alerts page 2. Change the query time range to show alerts from the 13th of October 2024 3. Open the alerts flyout 4. Scroll to see the graph visualization : D ### 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] [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 - [x] 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)) - [ ] 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) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../steps/storybooks/build_and_upload.ts | 17 +- .github/CODEOWNERS | 2 +- .../src/worker/webpack.config.ts | 21 + packages/kbn-storybook/src/webpack.config.ts | 19 + .../common/kibana.jsonc | 9 +- .../common/package.json | 14 +- .../common/schema/graph/v1.ts | 4 - .../graph/README.md | 99 +- .../kbn-cloud-security-posture/graph/index.ts | 2 + .../graph/jest.config.js | 2 + .../graph/kibana.jsonc | 4 +- .../graph/setup_tests.ts | 13 + .../graph/src/components/graph/graph.test.tsx | 110 + .../graph/src/components/graph/graph.tsx | 204 + .../src/components/graph/layout_graph.ts | 87 +- ...h.stories.tsx => graph_layout.stories.tsx} | 184 +- .../graph/src/components/index.ts | 11 + .../graph/src/components/mock/react_flow.ts | 69 + .../src/components/mock/test_providers.tsx | 23 + .../src/components/node/button.stories.tsx | 6 +- .../src/components/node/diamond_node.tsx | 91 +- .../src/components/node/ellipse_node.tsx | 95 +- .../src/components/node/hexagon_node.tsx | 91 +- .../src/components/node/pentagon_node.tsx | 91 +- .../src/components/node/rectangle_node.tsx | 99 +- .../components/node/shapes/diamond_shape.tsx | 26 + .../components/node/shapes/ellipse_shape.tsx | 17 + .../components/node/shapes/hexagon_shape.tsx | 26 + .../components/node/shapes/pentagon_shape.tsx | 26 + .../node/shapes/rectangle_shape.tsx | 26 + .../graph/src/components/node/shapes/types.ts | 15 + .../graph/src/components/node/styles.tsx | 30 +- .../graph/src/components/types.ts | 33 +- .../graph/storybook/config/main.ts | 44 - .../graph/tsconfig.json | 2 +- .../public/kibana.jsonc | 8 +- .../storybook/config/README.mdx | 3 + .../{graph => }/storybook/config/constants.ts | 0 .../{graph => }/storybook/config/index.ts | 0 .../storybook/config/main.ts | 16 + .../{graph => }/storybook/config/manager.ts | 0 .../storybook/config/package.json | 6 + .../{graph => }/storybook/config/preview.ts | 0 .../{graph => }/storybook/config/styles.css | 0 .../storybook/config/tsconfig.json | 20 + .../common/components/expandable_panel.tsx | 16 +- .../server/routes/graph/v1.ts | 66 +- .../cloud_security_posture/tsconfig.json | 1 - .../security_solution/common/constants.ts | 2 + .../common/experimental_features.ts | 5 + .../right/components/graph_preview.test.tsx | 72 + .../right/components/graph_preview.tsx | 102 + .../graph_preview_container.test.tsx | 110 + .../components/graph_preview_container.tsx | 72 + .../right/components/test_ids.ts | 3 + .../visualizations_section.test.tsx | 42 +- .../components/visualizations_section.tsx | 21 + .../right/hooks/use_fetch_graph_data.ts | 83 + .../right/hooks/use_graph_preview.test.tsx | 137 + .../right/hooks/use_graph_preview.ts | 65 + .../plugins/security_solution/tsconfig.json | 1 + .../config.ts | 3 + .../es_archives/logs_gcp_audit/data.json | 634 ++ .../es_archives/logs_gcp_audit/mappings.json | 628 ++ .../es_archives/security_alerts/data.json.gz | Bin 0 -> 3143 bytes .../es_archives/security_alerts/mappings.json | 8667 +++++++++++++++++ .../page_objects/alerts_page.ts | 107 + .../page_objects/index.ts | 2 + .../pages/alerts_flyout.ts | 62 + .../pages/index.ts | 1 + 70 files changed, 11990 insertions(+), 577 deletions(-) create mode 100644 x-pack/packages/kbn-cloud-security-posture/graph/setup_tests.ts create mode 100644 x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.test.tsx create mode 100644 x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx rename x-pack/packages/kbn-cloud-security-posture/graph/src/components/{dagree_layout_graph.stories.tsx => graph_layout.stories.tsx} (76%) create mode 100644 x-pack/packages/kbn-cloud-security-posture/graph/src/components/mock/react_flow.ts create mode 100644 x-pack/packages/kbn-cloud-security-posture/graph/src/components/mock/test_providers.tsx create mode 100644 x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/diamond_shape.tsx create mode 100644 x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/ellipse_shape.tsx create mode 100644 x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/hexagon_shape.tsx create mode 100644 x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/pentagon_shape.tsx create mode 100644 x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/rectangle_shape.tsx create mode 100644 x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/types.ts delete mode 100644 x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/main.ts create mode 100644 x-pack/packages/kbn-cloud-security-posture/storybook/config/README.mdx rename x-pack/packages/kbn-cloud-security-posture/{graph => }/storybook/config/constants.ts (100%) rename x-pack/packages/kbn-cloud-security-posture/{graph => }/storybook/config/index.ts (100%) create mode 100644 x-pack/packages/kbn-cloud-security-posture/storybook/config/main.ts rename x-pack/packages/kbn-cloud-security-posture/{graph => }/storybook/config/manager.ts (100%) create mode 100644 x-pack/packages/kbn-cloud-security-posture/storybook/config/package.json rename x-pack/packages/kbn-cloud-security-posture/{graph => }/storybook/config/preview.ts (100%) rename x-pack/packages/kbn-cloud-security-posture/{graph => }/storybook/config/styles.css (100%) create mode 100644 x-pack/packages/kbn-cloud-security-posture/storybook/config/tsconfig.json create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview.test.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview_container.test.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview_container.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_fetch_graph_data.ts create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_graph_preview.test.tsx create mode 100644 x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_graph_preview.ts create mode 100644 x-pack/test/cloud_security_posture_functional/es_archives/logs_gcp_audit/data.json create mode 100644 x-pack/test/cloud_security_posture_functional/es_archives/logs_gcp_audit/mappings.json create mode 100644 x-pack/test/cloud_security_posture_functional/es_archives/security_alerts/data.json.gz create mode 100644 x-pack/test/cloud_security_posture_functional/es_archives/security_alerts/mappings.json create mode 100644 x-pack/test/cloud_security_posture_functional/page_objects/alerts_page.ts create mode 100644 x-pack/test/cloud_security_posture_functional/pages/alerts_flyout.ts diff --git a/.buildkite/scripts/steps/storybooks/build_and_upload.ts b/.buildkite/scripts/steps/storybooks/build_and_upload.ts index 483a5c28a295b..b1135490a2023 100644 --- a/.buildkite/scripts/steps/storybooks/build_and_upload.ts +++ b/.buildkite/scripts/steps/storybooks/build_and_upload.ts @@ -18,15 +18,16 @@ const STORYBOOKS = [ 'canvas', 'cases', 'cell_actions', - 'coloring', 'chart_icons', + 'cloud_security_posture_packages', + 'coloring', 'content_management_examples', 'custom_integrations', 'dashboard_enhanced', 'dashboard', 'data', - 'logs_explorer', 'embeddable', + 'esql_editor', 'expression_error', 'expression_image', 'expression_metric', @@ -34,28 +35,28 @@ const STORYBOOKS = [ 'expression_reveal_image', 'expression_shape', 'expression_tagcloud', - 'management', 'fleet', 'grouping', 'home', 'infra', 'kibana_react', + 'language_documentation_popover', 'lists', - 'observability', + 'logs_explorer', + 'management', 'observability_ai_assistant', 'observability_inventory', 'observability_shared', + 'observability', 'presentation', - 'security_solution', + 'random_sampling', 'security_solution_packages', + 'security_solution', 'serverless', 'shared_ux', 'triggers_actions_ui', 'ui_actions_enhanced', - 'language_documentation_popover', 'unified_search', - 'random_sampling', - 'esql_editor', ]; const GITHUB_CONTEXT = 'Build and Publish Storybooks'; diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3e73a2a40a388..80d9c8b64e9e6 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1911,10 +1911,10 @@ x-pack/plugins/osquery @elastic/security-defend-workflows /x-pack/plugins/security_solution/public/detections/components/osquery @elastic/security-defend-workflows # Cloud Defend -/x-pack/plugins/cloud_defend/ @elastic/kibana-cloud-security-posture /x-pack/plugins/security_solution/public/cloud_defend @elastic/kibana-cloud-security-posture # Cloud Security Posture +x-pack/packages/kbn-cloud-security-posture @elastic/kibana-cloud-security-posture /x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.* @elastic/kibana-cloud-security-posture /x-pack/plugins/security_solution/public/cloud_security_posture @elastic/kibana-cloud-security-posture /x-pack/test/api_integration/apis/cloud_security_posture/ @elastic/kibana-cloud-security-posture diff --git a/packages/kbn-optimizer/src/worker/webpack.config.ts b/packages/kbn-optimizer/src/worker/webpack.config.ts index 52a837724480d..96a17a6ae7229 100644 --- a/packages/kbn-optimizer/src/worker/webpack.config.ts +++ b/packages/kbn-optimizer/src/worker/webpack.config.ts @@ -259,6 +259,27 @@ export function getWebpackConfig( }, }, }, + { + test: /\.js$/, + include: /node_modules[\\\/]@dagrejs/, + use: { + loader: 'babel-loader', + options: { + envName: worker.dist ? 'production' : 'development', + presets: ['@babel/preset-env'], // Doesn't work with BABEL_PRESET + plugins: ['@babel/plugin-proposal-class-properties'], + }, + }, + }, + { + test: /node_modules[\/\\]@?xyflow[\/\\].*.js$/, + loaders: 'babel-loader', + options: { + envName: worker.dist ? 'production' : 'development', + presets: [BABEL_PRESET], + plugins: ['@babel/plugin-transform-logical-assignment-operators'], + }, + }, { test: /\.(html|md|txt|tmpl)$/, use: { diff --git a/packages/kbn-storybook/src/webpack.config.ts b/packages/kbn-storybook/src/webpack.config.ts index b03d78dbbc190..fad795a1e4619 100644 --- a/packages/kbn-storybook/src/webpack.config.ts +++ b/packages/kbn-storybook/src/webpack.config.ts @@ -136,6 +136,25 @@ export default ({ config: storybookConfig }: { config: Configuration }) => { }, }, }, + { + test: /\.js$/, + include: /node_modules[\\\/]@dagrejs/, + use: { + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'], // Doesn't work with @kbn/babel-preset/webpack_preset + plugins: ['@babel/plugin-proposal-class-properties'], + }, + }, + }, + { + test: /node_modules[\/\\]@?xyflow[\/\\].*.js$/, + loaders: 'babel-loader', + options: { + presets: [require.resolve('@kbn/babel-preset/webpack_preset')], + plugins: ['@babel/plugin-transform-logical-assignment-operators'], + }, + }, ], }, plugins: [new IgnoreNotFoundExportPlugin()], diff --git a/x-pack/packages/kbn-cloud-security-posture/common/kibana.jsonc b/x-pack/packages/kbn-cloud-security-posture/common/kibana.jsonc index 21721cfb69f44..f3bd18f10c7a8 100644 --- a/x-pack/packages/kbn-cloud-security-posture/common/kibana.jsonc +++ b/x-pack/packages/kbn-cloud-security-posture/common/kibana.jsonc @@ -1,6 +1,5 @@ - { - "id": "@kbn/cloud-security-posture-common", - "owner": "@elastic/kibana-cloud-security-posture", - "type": "shared-common" - } \ No newline at end of file + "id": "@kbn/cloud-security-posture-common", + "owner": "@elastic/kibana-cloud-security-posture", + "type": "shared-common" +} diff --git a/x-pack/packages/kbn-cloud-security-posture/common/package.json b/x-pack/packages/kbn-cloud-security-posture/common/package.json index 8ead7b37ceeb6..37276e735987d 100644 --- a/x-pack/packages/kbn-cloud-security-posture/common/package.json +++ b/x-pack/packages/kbn-cloud-security-posture/common/package.json @@ -1,8 +1,8 @@ { - "name": "@kbn/cloud-security-posture-common", - "private": true, - "version": "1.0.0", - "license": "Elastic License 2.0", - "description": "Shared components for cloud security posture, both client and server side", - "sideEffects": false - } \ No newline at end of file + "name": "@kbn/cloud-security-posture-common", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0", + "description": "Shared components for cloud security posture, both client and server side", + "sideEffects": false +} diff --git a/x-pack/packages/kbn-cloud-security-posture/common/schema/graph/v1.ts b/x-pack/packages/kbn-cloud-security-posture/common/schema/graph/v1.ts index f27ddb397c57c..3d37331b4cc5d 100644 --- a/x-pack/packages/kbn-cloud-security-posture/common/schema/graph/v1.ts +++ b/x-pack/packages/kbn-cloud-security-posture/common/schema/graph/v1.ts @@ -71,8 +71,6 @@ export const groupNodeDataSchema = schema.allOf([ export const labelNodeDataSchema = schema.allOf([ nodeBaseDataSchema, schema.object({ - source: schema.string(), - target: schema.string(), shape: schema.literal('label'), parentId: schema.maybe(schema.string()), color: colorSchema, @@ -82,8 +80,6 @@ export const labelNodeDataSchema = schema.allOf([ export const edgeDataSchema = schema.object({ id: schema.string(), source: schema.string(), - sourceShape: nodeShapeSchema, target: schema.string(), - targetShape: nodeShapeSchema, color: colorSchema, }); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/README.md b/x-pack/packages/kbn-cloud-security-posture/graph/README.md index c67ca622fe414..bde99acb4e7a6 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/README.md +++ b/x-pack/packages/kbn-cloud-security-posture/graph/README.md @@ -7,11 +7,104 @@ security solution plugin. ## How to use this -Standalone examples will follow. In the meantime check out storybook to view the graph's progress. +### Step 1: Import the Component -## The most important public api members +First, import the `Graph` component into your desired file. -- GraphComponent itself (comming soon..) +```tsx +import { Graph } from '@kbn/cloud-security-posture-graph'; +``` + +### Step 2: Prepare the Data + +Create the nodes and edges data models. These should follow the `NodeViewModel` and `EdgeViewModel` interfaces. + +```tsx +const nodes: NodeViewModel[] = [ + { + id: 'node1', + label: 'Node 1', + color: 'primary', + shape: 'ellipse', + icon: 'user', + }, + { + id: 'node2', + label: 'Node 2', + color: 'primary', + shape: 'hexagon', + icon: 'questionInCircle', + }, +]; + +const edges: EdgeViewModel[] = [ + { + id: 'edge1', + source: 'node1', + target: 'node2', + color: 'primary', + }, +]; +``` + +### Step 3: Render the Component + +Use the `Graph` component in your JSX/TSX, passing the nodes, edges, and interactivity flag as props. + +```tsx + +``` + +### Example Usage + +Here is a complete example of how to use the `Graph` component in a React component. + +```tsx +import React from 'react'; +import { Graph } from '@kbn/cloud-security-posture-graph'; +import type { NodeViewModel, EdgeViewModel } from '@kbn/cloud-security-posture-graph'; + +const App: React.FC = () => { + const nodes: NodeViewModel[] = [ + { + id: 'node1', + label: 'Node 1', + color: 'primary', + shape: 'ellipse', + icon: 'user', + }, + { + id: 'node2', + label: 'Node 2', + color: 'primary', + shape: 'hexagon', + icon: 'questionInCircle', + }, + ]; + + const edges: EdgeViewModel[] = [ + { + id: 'edge1', + source: 'node1', + target: 'node2', + color: 'primary', + }, + ]; + + return ( +
+

Graph Visualization

+ +
+ ); +}; + +export default App; +``` + +### Storybook Example + +You can also see how the `Graph` component is used in the Storybook file `graph_layout.stories.tsx`. ### Extras diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/index.ts b/x-pack/packages/kbn-cloud-security-posture/graph/index.ts index 1fec1c76430eb..c50969cfd6402 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/index.ts +++ b/x-pack/packages/kbn-cloud-security-posture/graph/index.ts @@ -4,3 +4,5 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + +export * from './src/components'; diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/jest.config.js b/x-pack/packages/kbn-cloud-security-posture/graph/jest.config.js index 9e295d0f4d626..3b8fbbd9384a4 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/jest.config.js +++ b/x-pack/packages/kbn-cloud-security-posture/graph/jest.config.js @@ -9,4 +9,6 @@ module.exports = { preset: '@kbn/test', roots: ['/x-pack/packages/kbn-cloud-security-posture/graph'], rootDir: '../../../..', + setupFiles: ['jest-canvas-mock'], + setupFilesAfterEnv: ['/x-pack/packages/kbn-cloud-security-posture/graph/setup_tests.ts'], }; diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/kibana.jsonc b/x-pack/packages/kbn-cloud-security-posture/graph/kibana.jsonc index 455f1607a22a2..513861b347059 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/kibana.jsonc +++ b/x-pack/packages/kbn-cloud-security-posture/graph/kibana.jsonc @@ -1,5 +1,5 @@ { - "type": "shared-browser", "id": "@kbn/cloud-security-posture-graph", - "owner": "@elastic/kibana-cloud-security-posture" + "owner": "@elastic/kibana-cloud-security-posture", + "type": "shared-browser" } diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/setup_tests.ts b/x-pack/packages/kbn-cloud-security-posture/graph/setup_tests.ts new file mode 100644 index 0000000000000..7f6858c0fd40d --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/graph/setup_tests.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. + */ + +// eslint-disable-next-line @kbn/imports/no_boundary_crossing +import { mockReactFlow } from './src/components/mock/react_flow'; +// eslint-disable-next-line import/no-extraneous-dependencies +import '@testing-library/jest-dom'; + +mockReactFlow(); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.test.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.test.tsx new file mode 100644 index 0000000000000..18ba84207f962 --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.test.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render } from '@testing-library/react'; +import React from 'react'; +import { Graph, type GraphProps } from './graph'; +import { TestProviders } from '../mock/test_providers'; + +const renderGraphPreview = (props: GraphProps) => + render( + + + + ); + +describe('', () => { + it('should render empty graph', () => { + const { container } = renderGraphPreview({ + nodes: [], + edges: [], + interactive: false, + }); + + expect(container).not.toBeNull(); + const nodes = container.querySelectorAll('.react-flow__nodes .react-flow__node'); + expect(nodes).toHaveLength(0); + }); + + it('should render hexagon node', () => { + const { container } = renderGraphPreview({ + nodes: [ + { + id: '1', + label: 'Node 1', + color: 'primary', + shape: 'hexagon', + }, + ], + edges: [], + interactive: false, + }); + + const nodeEl = container.querySelector('[data-id="1"]'); + expect(nodeEl).not.toBeNull(); + expect(nodeEl?.textContent).toBe('Node 1'); + }); + + it('should render label node', () => { + const { container } = renderGraphPreview({ + nodes: [ + { + id: '2', + label: 'Node 2', + color: 'primary', + shape: 'label', + }, + ], + edges: [], + interactive: false, + }); + + const nodeEl = container.querySelector('[data-id="2"]'); + expect(nodeEl).not.toBeNull(); + expect(nodeEl?.textContent).toBe('Node 2'); + }); + + it('should render 2 nodes connected', () => { + const { container } = renderGraphPreview({ + nodes: [ + { + id: '1', + label: 'Node 1', + color: 'primary', + shape: 'hexagon', + }, + { + id: '2', + label: 'Node 2', + color: 'primary', + shape: 'label', + }, + ], + edges: [ + { + id: 'a(1)-b(2)', + color: 'primary', + source: '1', + target: '2', + }, + ], + interactive: false, + }); + + const srcNodeEl = container.querySelector('[data-id="1"]'); + expect(srcNodeEl).not.toBeNull(); + expect(srcNodeEl?.textContent).toBe('Node 1'); + + const targetNodeEl = container.querySelector('[data-id="2"]'); + expect(targetNodeEl).not.toBeNull(); + expect(targetNodeEl?.textContent).toBe('Node 2'); + + // TODO: Fix this test (currently it is not rendered in xyflow version 12) https://github.com/xyflow/xyflow/issues/716#issuecomment-2414721074 + // const edgeEl = container.querySelector('[data-id="a(1)-b(2)"]'); + // expect(edgeEl).not.toBeNull(); + }); +}); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx new file mode 100644 index 0000000000000..eca9872d73897 --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo, useRef, useState, useCallback } from 'react'; +import { + Background, + Controls, + Position, + ReactFlow, + useEdgesState, + useNodesState, +} from '@xyflow/react'; +import type { Edge, Node } from '@xyflow/react'; +import type { CommonProps } from '@elastic/eui'; +import { SvgDefsMarker } from '../edge/styles'; +import { + HexagonNode, + PentagonNode, + EllipseNode, + RectangleNode, + DiamondNode, + LabelNode, + EdgeGroupNode, +} from '../node'; +import { layoutGraph } from './layout_graph'; +import { DefaultEdge } from '../edge'; +import type { EdgeViewModel, NodeViewModel } from '../types'; + +import '@xyflow/react/dist/style.css'; + +export interface GraphProps extends CommonProps { + nodes: NodeViewModel[]; + edges: EdgeViewModel[]; + interactive: boolean; +} + +const nodeTypes = { + hexagon: HexagonNode, + pentagon: PentagonNode, + ellipse: EllipseNode, + rectangle: RectangleNode, + diamond: DiamondNode, + label: LabelNode, + group: EdgeGroupNode, +}; + +const edgeTypes = { + default: DefaultEdge, +}; + +/** + * Graph component renders a graph visualization using ReactFlow. + * It takes nodes and edges as input and provides interactive controls + * for panning, zooming, and manipulating the graph. + * + * @component + * @param {GraphProps} props - The properties for the Graph component. + * @param {NodeViewModel[]} props.nodes - Array of node view models to be rendered in the graph. + * @param {EdgeViewModel[]} props.edges - Array of edge view models to be rendered in the graph. + * @param {boolean} props.interactive - Flag to enable or disable interactivity (panning, zooming, etc.). + * @param {CommonProps} [props.rest] - Additional common properties. + * + * @returns {JSX.Element} The rendered Graph component. + */ +export const Graph: React.FC = ({ nodes, edges, interactive, ...rest }) => { + const layoutCalled = useRef(false); + const [isGraphLocked, setIsGraphLocked] = useState(interactive); + const { initialNodes, initialEdges } = useMemo( + () => processGraph(nodes, edges, isGraphLocked), + [nodes, edges, isGraphLocked] + ); + + const [nodesState, setNodes, onNodesChange] = useNodesState(initialNodes); + const [edgesState, _setEdges, onEdgesChange] = useEdgesState(initialEdges); + + if (!layoutCalled.current) { + const { nodes: layoutedNodes } = layoutGraph(nodesState, edgesState); + setNodes(layoutedNodes); + layoutCalled.current = true; + } + + const onInteractiveStateChange = useCallback( + (interactiveStatus: boolean): void => { + setIsGraphLocked(interactiveStatus); + setNodes((prevNodes) => + prevNodes.map((node) => ({ + ...node, + data: { + ...node.data, + interactive: interactiveStatus, + }, + })) + ); + }, + [setNodes] + ); + + return ( +
+ + { + window.requestAnimationFrame(() => xyflow.fitView()); + + // When the graph is not initialized as interactive, we need to fit the view on resize + if (!interactive) { + const resizeObserver = new ResizeObserver(() => { + xyflow.fitView(); + }); + resizeObserver.observe(document.querySelector('.react-flow') as Element); + return () => resizeObserver.disconnect(); + } + }} + nodeTypes={nodeTypes} + edgeTypes={edgeTypes} + nodes={nodesState} + edges={edgesState} + onNodesChange={onNodesChange} + onEdgesChange={onEdgesChange} + proOptions={{ hideAttribution: true }} + panOnDrag={isGraphLocked} + zoomOnScroll={isGraphLocked} + zoomOnPinch={isGraphLocked} + zoomOnDoubleClick={isGraphLocked} + preventScrolling={isGraphLocked} + nodesDraggable={interactive && isGraphLocked} + maxZoom={1.3} + > + {interactive && } + + +
+ ); +}; + +const processGraph = ( + nodesModel: NodeViewModel[], + edgesModel: EdgeViewModel[], + interactive: boolean +): { + initialNodes: Array>; + initialEdges: Array>; +} => { + const nodesById: { [key: string]: NodeViewModel } = {}; + + const initialNodes = nodesModel.map((nodeData) => { + nodesById[nodeData.id] = nodeData; + + const node: Node = { + id: nodeData.id, + type: nodeData.shape, + data: { ...nodeData, interactive }, + position: { x: 0, y: 0 }, // Default position, should be updated later + }; + + if (node.type === 'group' && nodeData.shape === 'group') { + node.sourcePosition = Position.Right; + node.targetPosition = Position.Left; + node.resizing = false; + node.focusable = false; + } else if (nodeData.shape === 'label' && nodeData.parentId) { + node.parentId = nodeData.parentId; + node.extent = 'parent'; + node.expandParent = false; + node.draggable = false; + } + + return node; + }); + + const initialEdges: Array> = edgesModel.map((edgeData) => { + const isIn = + nodesById[edgeData.source].shape !== 'label' && nodesById[edgeData.target].shape === 'group'; + const isInside = + nodesById[edgeData.source].shape === 'group' && nodesById[edgeData.target].shape === 'label'; + const isOut = + nodesById[edgeData.source].shape === 'label' && nodesById[edgeData.target].shape === 'group'; + const isOutside = + nodesById[edgeData.source].shape === 'group' && nodesById[edgeData.target].shape !== 'label'; + + return { + id: edgeData.id, + type: 'default', + source: edgeData.source, + sourceHandle: isInside ? 'inside' : isOutside ? 'outside' : undefined, + target: edgeData.target, + targetHandle: isIn ? 'in' : isOut ? 'out' : undefined, + focusable: false, + selectable: false, + data: { + ...edgeData, + sourceShape: nodesById[edgeData.source].shape, + targetShape: nodesById[edgeData.target].shape, + }, + }; + }); + + return { initialNodes, initialEdges }; +}; diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/layout_graph.ts b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/layout_graph.ts index d9f637483c115..868461f99cdee 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/layout_graph.ts +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/layout_graph.ts @@ -6,18 +6,16 @@ */ import Dagre from '@dagrejs/dagre'; -import type { - EdgeDataModel, - NodeDataModel, -} from '@kbn/cloud-security-posture-common/types/graph/latest'; -import type { NodeViewModel, Size } from '../types'; +import type { Node, Edge } from '@xyflow/react'; +import type { EdgeViewModel, NodeViewModel, Size } from '../types'; import { calcLabelSize } from './utils'; +import { GroupStyleOverride, NODE_HEIGHT, NODE_WIDTH } from '../node/styles'; export const layoutGraph = ( - nodes: NodeDataModel[], - edges: EdgeDataModel[] -): { nodes: NodeViewModel[] } => { - const nodesById: { [key: string]: NodeViewModel } = {}; + nodes: Array>, + edges: Array> +): { nodes: Array> } => { + const nodesById: { [key: string]: Node } = {}; const graphOpts = { compound: true, }; @@ -29,28 +27,27 @@ export const layoutGraph = ( edges.forEach((edge) => g.setEdge(edge.source, edge.target)); nodes.forEach((node) => { - let size = { width: 90, height: 90 }; - const position = { x: 0, y: 0 }; + let size = { width: NODE_WIDTH, height: node.measured?.height ?? NODE_HEIGHT }; - if (node.shape === 'label') { - size = calcLabelSize(node.label); + if (node.data.shape === 'label') { + size = calcLabelSize(node.data.label); // TODO: waiting for a fix: https://github.com/dagrejs/dagre/issues/238 // if (node.parentId) { // g.setParent(node.id, node.parentId); // } - } else if (node.shape === 'group') { + } else if (node.data.shape === 'group') { const res = layoutGroupChildren(node, nodes); size = res.size; res.children.forEach((child) => { - nodesById[child.id] = { ...child }; + nodesById[child.data.id] = child; }); } if (!nodesById[node.id]) { - nodesById[node.id] = { ...node, position }; + nodesById[node.id] = node; } g.setNode(node.id, { @@ -61,8 +58,8 @@ export const layoutGraph = ( Dagre.layout(g); - const nodesViewModel: NodeViewModel[] = nodes.map((nodeData) => { - const dagreNode = g.node(nodeData.id); + const layoutedNodes = nodes.map((node) => { + const dagreNode = g.node(node.data.id); // We are shifting the dagre node position (anchor=center center) to the top left // so it matches the React Flow node anchor point (top left). @@ -70,37 +67,43 @@ export const layoutGraph = ( const y = dagreNode.y - (dagreNode.height ?? 0) / 2; // For grouped nodes, we want to keep the original position relative to the parent - if (nodeData.shape === 'label' && nodeData.parentId) { + if (node.data.shape === 'label' && node.data.parentId) { return { - ...nodeData, - position: nodesById[nodeData.id].position, + ...node, + position: nodesById[node.data.id].position, }; - } else if (nodeData.shape === 'group') { + } else if (node.data.shape === 'group') { return { - ...nodeData, + ...node, position: { x, y }, - size: { + style: GroupStyleOverride({ width: dagreNode.width, height: dagreNode.height, - }, + }), + }; + } else if (node.data.shape === 'label') { + return { + ...node, + position: { x, y }, + }; + } else { + // Align nodes to labels by shifting the node position by it's label height + return { + ...node, + position: { x, y: y + (dagreNode.height - NODE_HEIGHT) / 2 }, }; } - - return { - ...nodeData, - position: { x, y }, - }; }); - return { nodes: nodesViewModel }; + return { nodes: layoutedNodes }; }; const layoutGroupChildren = ( - groupNode: NodeDataModel, - nodes: NodeDataModel[] -): { size: Size; children: NodeViewModel[] } => { + groupNode: Node, + nodes: Array> +): { size: Size; children: Array> } => { const children = nodes.filter( - (child) => child.shape === 'label' && child.parentId === groupNode.id + (child) => child.data.shape === 'label' && child.parentId === groupNode.id ); const STACK_VERTICAL_PADDING = 20; @@ -108,7 +111,7 @@ const layoutGroupChildren = ( const PADDING = 20; const stackSize = children.length; const allChildrenHeight = children.reduce( - (prevHeight, node) => prevHeight + calcLabelSize(node.label).height, + (prevHeight, node) => prevHeight + calcLabelSize(node.data.label).height, 0 ); const stackHeight = Math.max( @@ -118,23 +121,21 @@ const layoutGroupChildren = ( const space = (stackHeight - allChildrenHeight) / (stackSize - 1); const groupNodeWidth = children.reduce((acc, child) => { - const currLblWidth = PADDING * 2 + calcLabelSize(child.label).width; + const currLblWidth = PADDING * 2 + calcLabelSize(child.data.label).width; return Math.max(acc, currLblWidth); }, 0); // Layout children relative to parent - const positionedChildren: NodeViewModel[] = children.map((child, index) => { - const childSize = calcLabelSize(child.label); - const childPosition = { + children.forEach((child, index) => { + const childSize = calcLabelSize(child.data.label); + child.position = { x: groupNodeWidth / 2 - childSize.width / 2, y: index * (childSize.height * 2 + space), }; - - return { ...child, position: childPosition }; }); return { size: { width: groupNodeWidth, height: stackHeight }, - children: positionedChildren, + children, }; }; diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/dagree_layout_graph.stories.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_layout.stories.tsx similarity index 76% rename from x-pack/packages/kbn-cloud-security-posture/graph/src/components/dagree_layout_graph.stories.tsx rename to x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_layout.stories.tsx index 94bc7e8af353b..140e81238d390 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/dagree_layout_graph.stories.tsx +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph_layout.stories.tsx @@ -7,68 +7,40 @@ import React from 'react'; import { ThemeProvider } from '@emotion/react'; -import { - ReactFlow, - Controls, - Background, - Node, - Edge, - Position, - useNodesState, - useEdgesState, -} from '@xyflow/react'; import { Story } from '@storybook/react'; -import type { - EdgeDataModel, - LabelNodeDataModel, - NodeDataModel, -} from '@kbn/cloud-security-posture-common/types/graph/latest'; import { Writable } from '@kbn/utility-types'; -import { - HexagonNode, - PentagonNode, - EllipseNode, - RectangleNode, - DiamondNode, - LabelNode, - EdgeGroupNode, -} from './node'; -import type { NodeViewModel } from './types'; -import { DefaultEdge } from './edge'; -import { SvgDefsMarker } from './edge/styles'; -import { GroupStyleOverride } from './node/styles'; - -import '@xyflow/react/dist/style.css'; -import { layoutGraph } from './graph/layout_graph'; +import { css } from '@emotion/react'; +import type { + EdgeViewModel, + LabelNodeViewModel, + NodeViewModel, + EntityNodeViewModel, + GroupNodeViewModel, +} from '.'; +import { Graph } from '.'; export default { - title: 'Components/Graph Components/Dagree Layout Graph', + title: 'Components/Graph Components/Graph Layout', description: 'CDR - Graph visualization', -}; - -const nodeTypes = { - hexagon: HexagonNode, - pentagon: PentagonNode, - ellipse: EllipseNode, - rectangle: RectangleNode, - diamond: DiamondNode, - label: LabelNode, - group: EdgeGroupNode, -}; - -const edgeTypes = { - default: DefaultEdge, + argTypes: { + interactive: { control: 'boolean', defaultValue: true }, + }, }; interface GraphData { - nodes: NodeDataModel[]; - edges: EdgeDataModel[]; + nodes: NodeViewModel[]; + edges: EdgeViewModel[]; interactive: boolean; } +type EnhancedNodeViewModel = + | EntityNodeViewModel + | GroupNodeViewModel + | (LabelNodeViewModel & { source: string; target: string }); + const extractEdges = ( - graphData: NodeDataModel[] -): { nodes: NodeDataModel[]; edges: EdgeDataModel[] } => { + graphData: EnhancedNodeViewModel[] +): { nodes: NodeViewModel[]; edges: EdgeViewModel[] } => { // Process nodes, transform nodes of id in the format of a(source)-b(target) to edges from a to label and from label to b // If there are multiple edges from a to b, create a parent node and group the labels under it. The parent node will be a group node. // Connect from a to the group node and from the group node to all the labels. and from the labels to the group again and from the group to b. @@ -77,14 +49,14 @@ const extractEdges = ( [key: string]: { source: string; target: string; edgesStacked: number; edges: string[] }; } = {}; const labelsMetadata: { - [key: string]: { source: string; target: string; labelsNodes: LabelNodeDataModel[] }; + [key: string]: { source: string; target: string; labelsNodes: LabelNodeViewModel[] }; } = {}; - const nodes: { [key: string]: NodeDataModel } = {}; - const edges: EdgeDataModel[] = []; + const nodes: { [key: string]: NodeViewModel } = {}; + const edges: EdgeViewModel[] = []; graphData.forEach((node) => { if (node.shape === 'label') { - const labelNode = { ...node, id: `${node.id}label(${node.label})` }; + const labelNode: LabelNodeViewModel = { ...node, id: `${node.id}label(${node.label})` }; const { source, target } = node; if (labelsMetadata[node.id]) { @@ -119,7 +91,7 @@ const extractEdges = ( Object.values(labelsMetadata).forEach((edge) => { if (edge.labelsNodes.length > 1) { - const groupNode: NodeDataModel = { + const groupNode: NodeViewModel = { id: `grp(a(${edge.source})-b(${edge.target}))`, shape: 'group', }; @@ -143,7 +115,7 @@ const extractEdges = ( color: edge.labelsNodes[0].color, }); - edge.labelsNodes.forEach((labelNode: Writable) => { + edge.labelsNodes.forEach((labelNode: Writable) => { labelNode.parentId = groupNode.id; edges.push({ @@ -189,28 +161,18 @@ const extractEdges = ( return { nodes: Object.values(nodes).reverse(), edges }; }; -const Template: Story = ({ nodes, edges }: GraphData) => { - const { initialNodes, initialEdges } = processGraph(nodes, edges); - - const [nodesState, _setNodes, onNodesChange] = useNodesState(initialNodes); - const [edgesState, _setEdges, onEdgesChange] = useEdgesState(initialEdges); - +const Template: Story = ({ nodes, edges, interactive }: GraphData) => { return ( - - - - - + ); }; @@ -359,8 +321,8 @@ GroupWithWarningAPIMock.args = { ], }; -export const Graph = Template.bind({}); -const baseGraph: NodeDataModel[] = [ +export const LargeGraph = Template.bind({}); +const baseGraph: EnhancedNodeViewModel[] = [ { id: 'siem-windows', label: '', @@ -483,7 +445,7 @@ const baseGraph: NodeDataModel[] = [ }, ]; -Graph.args = { +LargeGraph.args = { ...extractEdges(baseGraph), }; @@ -541,67 +503,3 @@ GraphStackedEdgeCases.args = { }, ]), }; - -function processGraph( - nodesModel: NodeDataModel[], - edgesModel: EdgeDataModel[] -): { - initialNodes: Node[]; - initialEdges: Edge[]; -} { - const { nodes: nodesViewModel } = layoutGraph(nodesModel, edgesModel); - - const nodesById: { [key: string]: NodeViewModel } = {}; - - const initialNodes = nodesViewModel.map((nodeData) => { - nodesById[nodeData.id] = nodeData; - - const node: Node = { - id: nodeData.id, - type: nodeData.shape, - data: { ...nodeData, interactive: true }, - position: nodeData.position, - draggable: true, - }; - - if (node.type === 'group' && nodeData.shape === 'group') { - node.sourcePosition = Position.Right; - node.targetPosition = Position.Left; - node.resizing = false; - node.style = GroupStyleOverride({ - width: nodeData.size?.width ?? 0, - height: nodeData.size?.height ?? 0, - }); - } else if (nodeData.shape === 'label' && nodeData.parentId) { - node.parentId = nodeData.parentId; - node.extent = 'parent'; - node.expandParent = false; - node.draggable = false; - } - - return node; - }); - - const initialEdges: Edge[] = edgesModel.map((edgeData) => { - const isIn = - nodesById[edgeData.source].shape !== 'label' && nodesById[edgeData.target].shape === 'group'; - const isInside = - nodesById[edgeData.source].shape === 'group' && nodesById[edgeData.target].shape === 'label'; - const isOut = - nodesById[edgeData.source].shape === 'label' && nodesById[edgeData.target].shape === 'group'; - const isOutside = - nodesById[edgeData.source].shape === 'group' && nodesById[edgeData.target].shape !== 'label'; - - return { - id: edgeData.id, - type: 'default', - source: edgeData.source, - sourceHandle: isInside ? 'inside' : isOutside ? 'outside' : undefined, - target: edgeData.target, - targetHandle: isIn ? 'in' : isOut ? 'out' : undefined, - data: { ...edgeData }, - }; - }); - - return { initialNodes, initialEdges }; -} diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/index.ts b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/index.ts index 1fec1c76430eb..5b2f8d71323bb 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/index.ts +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/index.ts @@ -4,3 +4,14 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + +export { Graph } from './graph/graph'; +export type { GraphProps } from './graph/graph'; +export type { + NodeViewModel, + EdgeViewModel, + GroupNodeViewModel, + LabelNodeViewModel, + EntityNodeViewModel, + NodeProps, +} from './types'; diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/mock/react_flow.ts b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/mock/react_flow.ts new file mode 100644 index 0000000000000..35282dedcc6de --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/mock/react_flow.ts @@ -0,0 +1,69 @@ +/* + * 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. + */ + +/* eslint-disable max-classes-per-file */ + +// Copied from https://reactflow.dev/learn/advanced-use/testing#using-jest + +// To make sure that the tests are working, it's important that you are using +// this implementation of ResizeObserver and DOMMatrixReadOnly +class ResizeObserver { + callback: globalThis.ResizeObserverCallback; + + constructor(callback: globalThis.ResizeObserverCallback) { + this.callback = callback; + } + + observe(target: Element) { + this.callback([{ target } as globalThis.ResizeObserverEntry], this); + } + + unobserve() {} + + disconnect() {} +} + +class DOMMatrixReadOnly { + m22: number; + constructor(transform: string) { + const scale = transform?.match(/scale\(([1-9.])\)/)?.[1]; + this.m22 = scale !== undefined ? +scale : 1; + } +} + +// Only run the shim once when requested +let init = false; + +export const mockReactFlow = () => { + if (init) return; + init = true; + + global.ResizeObserver = ResizeObserver; + + // @ts-ignore + global.DOMMatrixReadOnly = DOMMatrixReadOnly; + + Object.defineProperties(global.HTMLElement.prototype, { + offsetHeight: { + get() { + return parseFloat(this.style.height) || 1; + }, + }, + offsetWidth: { + get() { + return parseFloat(this.style.width) || 1; + }, + }, + }); + + (global.SVGElement as any).prototype.getBBox = () => ({ + x: 0, + y: 0, + width: 0, + height: 0, + }); +}; diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/mock/test_providers.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/mock/test_providers.tsx new file mode 100644 index 0000000000000..3d07c1c6037ed --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/mock/test_providers.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { euiDarkVars } from '@kbn/ui-theme'; +import { ThemeProvider } from '@emotion/react'; + +interface Props { + children?: React.ReactNode; +} + +/** A utility for wrapping children in the providers required to run most tests */ +export const TestProvidersComponent: React.FC = ({ children }) => { + return ( + ({ eui: euiDarkVars, darkMode: true })}>{children} + ); +}; + +export const TestProviders = React.memo(TestProvidersComponent); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/button.stories.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/button.stories.tsx index 5e6e4cd37b432..4a034c05ee166 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/button.stories.tsx +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/button.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ThemeProvider } from '@emotion/react'; import { Story } from '@storybook/react'; -import { NodeButton, type NodeButtonProps, NodeContainer } from './styles'; +import { NodeButton, type NodeButtonProps, NodeShapeContainer } from './styles'; export default { title: 'Components/Graph Components', @@ -20,10 +20,10 @@ export default { const Template: Story = (args) => ( - + Hover me - + ); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/diamond_node.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/diamond_node.tsx index 76e7a3cd9eeeb..f96068061a433 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/diamond_node.tsx +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/diamond_node.tsx @@ -10,7 +10,7 @@ import { useEuiBackgroundColor, useEuiTheme } from '@elastic/eui'; import { Handle, Position } from '@xyflow/react'; import type { EntityNodeViewModel, NodeProps } from '../types'; import { - NodeContainer, + NodeShapeContainer, NodeLabel, NodeShapeOnHoverSvg, NodeShapeSvg, @@ -18,6 +18,7 @@ import { NodeButton, HandleStyleOverride, } from './styles'; +import { DiamondHoverShape, DiamondShape } from './shapes/diamond_shape'; const NODE_WIDTH = 99; const NODE_HEIGHT = 98; @@ -27,59 +28,55 @@ export const DiamondNode: React.FC = memo((props: NodeProps) => { props.data as EntityNodeViewModel; const { euiTheme } = useEuiTheme(); return ( - - {interactive && ( - + + {interactive && ( + + + + )} + - - - )} - - } + + {interactive && ( + expandButtonClick?.(e, props)} + x={`${NODE_WIDTH - NodeButton.ExpandButtonSize}px`} + y={`${(NODE_HEIGHT - NodeButton.ExpandButtonSize) / 2 - 4}px`} + /> + )} + - {icon && } - - {interactive && ( - expandButtonClick?.(e, props)} - x={`${NODE_WIDTH - NodeButton.ExpandButtonSize}px`} - y={`${(NODE_HEIGHT - NodeButton.ExpandButtonSize) / 2 - 4}px`} + - )} - - + {Boolean(label) ? label : id} - + ); }); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/ellipse_node.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/ellipse_node.tsx index 3359905196b9d..987b9d7577812 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/ellipse_node.tsx +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/ellipse_node.tsx @@ -9,7 +9,7 @@ import React, { memo } from 'react'; import { useEuiBackgroundColor, useEuiTheme } from '@elastic/eui'; import { Handle, Position } from '@xyflow/react'; import { - NodeContainer, + NodeShapeContainer, NodeLabel, NodeShapeOnHoverSvg, NodeShapeSvg, @@ -18,6 +18,7 @@ import { HandleStyleOverride, } from './styles'; import type { EntityNodeViewModel, NodeProps } from '../types'; +import { EllipseHoverShape, EllipseShape } from './shapes/ellipse_shape'; const NODE_WIDTH = 90; const NODE_HEIGHT = 90; @@ -27,63 +28,55 @@ export const EllipseNode: React.FC = memo((props: NodeProps) => { props.data as EntityNodeViewModel; const { euiTheme } = useEuiTheme(); return ( - - {interactive && ( - + + {interactive && ( + + + + )} + - - - )} - - } + + {interactive && ( + expandButtonClick?.(e, props)} + x={`${NODE_WIDTH - NodeButton.ExpandButtonSize / 2}px`} + y={`${(NODE_HEIGHT - NodeButton.ExpandButtonSize) / 2}px`} + /> + )} + - {icon && } - - {interactive && ( - expandButtonClick?.(e, props)} - x={`${NODE_WIDTH - NodeButton.ExpandButtonSize / 2}px`} - y={`${(NODE_HEIGHT - NodeButton.ExpandButtonSize) / 2}px`} + - )} - - + {Boolean(label) ? label : id} - + ); }); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/hexagon_node.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/hexagon_node.tsx index dee8df697c844..0bd8c33fc6484 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/hexagon_node.tsx +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/hexagon_node.tsx @@ -9,7 +9,7 @@ import React, { memo } from 'react'; import { useEuiBackgroundColor, useEuiTheme } from '@elastic/eui'; import { Handle, Position } from '@xyflow/react'; import { - NodeContainer, + NodeShapeContainer, NodeLabel, NodeShapeOnHoverSvg, NodeShapeSvg, @@ -18,6 +18,7 @@ import { HandleStyleOverride, } from './styles'; import type { EntityNodeViewModel, NodeProps } from '../types'; +import { HexagonHoverShape, HexagonShape } from './shapes/hexagon_shape'; const NODE_WIDTH = 87; const NODE_HEIGHT = 96; @@ -27,59 +28,55 @@ export const HexagonNode: React.FC = memo((props: NodeProps) => { props.data as EntityNodeViewModel; const { euiTheme } = useEuiTheme(); return ( - - {interactive && ( - + + {interactive && ( + + + + )} + - - - )} - - } + + {interactive && ( + expandButtonClick?.(e, props)} + x={`${NODE_WIDTH - NodeButton.ExpandButtonSize / 2 + 2}px`} + y={`${(NODE_HEIGHT - NodeButton.ExpandButtonSize) / 2 - 2}px`} + /> + )} + - {icon && } - - {interactive && ( - expandButtonClick?.(e, props)} - x={`${NODE_WIDTH - NodeButton.ExpandButtonSize / 2 + 2}px`} - y={`${(NODE_HEIGHT - NodeButton.ExpandButtonSize) / 2 - 2}px`} + - )} - - + {Boolean(label) ? label : id} - + ); }); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/pentagon_node.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/pentagon_node.tsx index 74ea8c05b5940..f2282e9fa2d7d 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/pentagon_node.tsx +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/pentagon_node.tsx @@ -10,7 +10,7 @@ import { useEuiBackgroundColor, useEuiTheme } from '@elastic/eui'; import styled from '@emotion/styled'; import { Handle, Position } from '@xyflow/react'; import { - NodeContainer, + NodeShapeContainer, NodeLabel, NodeShapeOnHoverSvg, NodeShapeSvg, @@ -19,6 +19,7 @@ import { HandleStyleOverride, } from './styles'; import type { EntityNodeViewModel, NodeProps } from '../types'; +import { PentagonHoverShape, PentagonShape } from './shapes/pentagon_shape'; const PentagonShapeOnHover = styled(NodeShapeOnHoverSvg)` transform: translate(-50%, -51.5%); @@ -32,59 +33,55 @@ export const PentagonNode: React.FC = memo((props: NodeProps) => { props.data as EntityNodeViewModel; const { euiTheme } = useEuiTheme(); return ( - - {interactive && ( - + + {interactive && ( + + + + )} + - - - )} - - } + + {interactive && ( + expandButtonClick?.(e, props)} + x={`${NODE_WIDTH - NodeButton.ExpandButtonSize / 2}px`} + y={`${(NODE_HEIGHT - NodeButton.ExpandButtonSize) / 2}px`} + /> + )} + - {icon && } - - {interactive && ( - expandButtonClick?.(e, props)} - x={`${NODE_WIDTH - NodeButton.ExpandButtonSize / 2}px`} - y={`${(NODE_HEIGHT - NodeButton.ExpandButtonSize) / 2}px`} + - )} - - + {Boolean(label) ? label : id} - + ); }); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/rectangle_node.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/rectangle_node.tsx index 22d9fbf25a4eb..7a5fc14855bc9 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/rectangle_node.tsx +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/rectangle_node.tsx @@ -9,7 +9,7 @@ import React, { memo } from 'react'; import { useEuiBackgroundColor, useEuiTheme } from '@elastic/eui'; import { Handle, Position } from '@xyflow/react'; import { - NodeContainer, + NodeShapeContainer, NodeLabel, NodeShapeOnHoverSvg, NodeShapeSvg, @@ -18,6 +18,7 @@ import { HandleStyleOverride, } from './styles'; import type { EntityNodeViewModel, NodeProps } from '../types'; +import { RectangleHoverShape, RectangleShape } from './shapes/rectangle_shape'; const NODE_WIDTH = 81; const NODE_HEIGHT = 80; @@ -27,67 +28,55 @@ export const RectangleNode: React.FC = memo((props: NodeProps) => { props.data as EntityNodeViewModel; const { euiTheme } = useEuiTheme(); return ( - - {interactive && ( - + + {interactive && ( + + + + )} + - - - )} - - } + + {interactive && ( + expandButtonClick?.(e, props)} + x={`${NODE_WIDTH - NodeButton.ExpandButtonSize / 4}px`} + y={`${(NODE_HEIGHT - NodeButton.ExpandButtonSize / 2) / 2}px`} + /> + )} + - {icon && } - - {interactive && ( - expandButtonClick?.(e, props)} - x={`${NODE_WIDTH - NodeButton.ExpandButtonSize / 4}px`} - y={`${(NODE_HEIGHT - NodeButton.ExpandButtonSize / 2) / 2}px`} + - )} - - + {Boolean(label) ? label : id} - + ); }); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/diamond_shape.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/diamond_shape.tsx new file mode 100644 index 0000000000000..126a5702cf5d0 --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/diamond_shape.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import type { HoverShapeProps, ShapeProps } from './types'; + +export const DiamondHoverShape: React.FC = memo(({ stroke }) => ( + +)); + +export const DiamondShape: React.FC = memo(({ stroke, fill }) => ( + +)); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/ellipse_shape.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/ellipse_shape.tsx new file mode 100644 index 0000000000000..18fe56440c5f5 --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/ellipse_shape.tsx @@ -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 React, { memo } from 'react'; +import type { HoverShapeProps, ShapeProps } from './types'; + +export const EllipseHoverShape: React.FC = memo(({ stroke }) => ( + +)); + +export const EllipseShape: React.FC = memo(({ stroke, fill }) => ( + +)); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/hexagon_shape.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/hexagon_shape.tsx new file mode 100644 index 0000000000000..12aeebec88605 --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/hexagon_shape.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import type { HoverShapeProps, ShapeProps } from './types'; + +export const HexagonHoverShape: React.FC = memo(({ stroke }) => ( + +)); + +export const HexagonShape: React.FC = memo(({ stroke, fill }) => ( + +)); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/pentagon_shape.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/pentagon_shape.tsx new file mode 100644 index 0000000000000..f4d07fc69db79 --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/pentagon_shape.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import type { HoverShapeProps, ShapeProps } from './types'; + +export const PentagonHoverShape: React.FC = memo(({ stroke }) => ( + +)); + +export const PentagonShape: React.FC = memo(({ stroke, fill }) => ( + +)); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/rectangle_shape.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/rectangle_shape.tsx new file mode 100644 index 0000000000000..7d019ce331baf --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/rectangle_shape.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import type { HoverShapeProps, ShapeProps } from './types'; + +export const RectangleHoverShape: React.FC = memo(({ stroke }) => ( + +)); + +export const RectangleShape: React.FC = memo(({ stroke, fill }) => ( + +)); diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/types.ts b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/types.ts new file mode 100644 index 0000000000000..0f6910258fed6 --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/shapes/types.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export interface HoverShapeProps { + stroke: string; +} + +export interface ShapeProps { + stroke: string; + fill: string; +} diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/styles.tsx b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/styles.tsx index f1bee0cf95e30..e76da737af0f9 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/styles.tsx +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/node/styles.tsx @@ -23,6 +23,7 @@ export const LABEL_PADDING_X = 15; export const LABEL_BORDER_WIDTH = 1; export const NODE_WIDTH = 90; export const NODE_HEIGHT = 90; +const NODE_LABEL_WIDTH = 120; export const LabelNodeContainer = styled.div` text-wrap: nowrap; @@ -79,9 +80,13 @@ export const LabelShapeOnHover = styled.div` ${LabelNodeContainer}:hover & { opacity: 1; /* Show on hover */ } + + .react-flow__node:focus:focus-visible & { + opacity: 1; /* Show on hover */ + } `; -export const NodeContainer = styled.div` +export const NodeShapeContainer = styled.div` position: relative; width: ${NODE_WIDTH}px; height: ${NODE_HEIGHT}px; @@ -99,7 +104,11 @@ export const NodeShapeOnHoverSvg = styled(NodeShapeSvg)` opacity: 0; /* Hidden by default */ transition: opacity 0.2s ease; /* Smooth transition */ - ${NodeContainer}:hover & { + ${NodeShapeContainer}:hover & { + opacity: 1; /* Show on hover */ + } + + .react-flow__node:focus:focus-visible & { opacity: 1; /* Show on hover */ } `; @@ -124,11 +133,8 @@ export const NodeIcon = ({ icon, color, x, y }: NodeIconProps) => { }; export const NodeLabel = styled(EuiText)` - position: absolute; - top: 108%; - left: 50%; - transform: translateX(-50%); - width: 130%; + width: ${NODE_LABEL_WIDTH}px; + margin-left: ${-(NODE_LABEL_WIDTH - NODE_WIDTH) / 2}px; text-overflow: ellipsis; // white-space: nowrap; overflow: hidden; @@ -167,9 +173,17 @@ export const StyledNodeButton = styled.div` position: absolute; z-index: 1; - ${NodeContainer}:hover & { + ${NodeShapeContainer}:hover & { opacity: 1; /* Show on hover */ } + + &:has(button:focus) { + opacity: 1; /* Show when button is active */ + } + + .react-flow__node:focus:focus-visible & { + opacity: 1; /* Show on node focus */ + } `; export interface NodeButtonProps { diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts index 262254c80afe3..27ec18f35f45b 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts +++ b/x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts @@ -10,29 +10,17 @@ import type { GroupNodeDataModel, LabelNodeDataModel, EdgeDataModel, + NodeShape, } from '@kbn/cloud-security-posture-common/types/graph/latest'; import type { Node, NodeProps as xyNodeProps } from '@xyflow/react'; import type { Edge, EdgeProps as xyEdgeProps } from '@xyflow/react'; -export interface PositionXY { - x: number; - y: number; -} - export interface Size { width: number; height: number; } -export interface GraphMetadata { - nodes: { [key: string]: { edgesIn: number; edgesOut: number } }; - edges: { - [key: string]: { source: string; target: string; edgesStacked: number; edges: string[] }; - }; -} - interface BaseNodeDataViewModel { - position: PositionXY; interactive?: boolean; } @@ -46,9 +34,7 @@ export interface EntityNodeViewModel export interface GroupNodeViewModel extends Record, GroupNodeDataModel, - BaseNodeDataViewModel { - size?: Size; -} + BaseNodeDataViewModel {} export interface LabelNodeViewModel extends Record, @@ -61,10 +47,13 @@ export type NodeViewModel = EntityNodeViewModel | GroupNodeViewModel | LabelNode export type NodeProps = xyNodeProps>; -export interface EdgeViewModel extends Record, EdgeDataModel { - graphMetadata?: GraphMetadata; - interactive?: boolean; - onClick?: (e: React.MouseEvent, edge: EdgeProps) => void; -} +export interface EdgeViewModel extends Record, EdgeDataModel {} -export type EdgeProps = xyEdgeProps>; +export type EdgeProps = xyEdgeProps< + Edge< + EdgeViewModel & { + sourceShape: NodeShape; + targetShape: NodeShape; + } + > +>; diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/main.ts b/x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/main.ts deleted file mode 100644 index 186e1a2a76bed..0000000000000 --- a/x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/main.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 { defaultConfig } from '@kbn/storybook'; -import { Configuration } from 'webpack'; - -module.exports = { - ...defaultConfig, - stories: ['../../**/*.stories.+(tsx|mdx)'], - reactOptions: { - strictMode: true, - }, - webpack: (config: Configuration) => { - config.module?.rules.push({ - test: /\.js$/, - include: /node_modules[\\\/]@dagrejs/, - use: { - loader: 'babel-loader', - options: { - presets: ['@babel/preset-env'], - plugins: ['@babel/plugin-proposal-class-properties'], - }, - }, - }); - config.module?.rules.push({ - test: /node_modules[\/\\]@?xyflow[\/\\].*.js$/, - loaders: 'babel-loader', - options: { - presets: [['@babel/preset-env', { modules: false }], '@babel/preset-react'], - plugins: [ - '@babel/plugin-proposal-optional-chaining', - '@babel/plugin-proposal-nullish-coalescing-operator', - '@babel/plugin-transform-logical-assignment-operators', - ], - }, - }); - - return config; - }, -}; diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/tsconfig.json b/x-pack/packages/kbn-cloud-security-posture/graph/tsconfig.json index d97809a59772d..d0056e29e6784 100644 --- a/x-pack/packages/kbn-cloud-security-posture/graph/tsconfig.json +++ b/x-pack/packages/kbn-cloud-security-posture/graph/tsconfig.json @@ -13,6 +13,6 @@ "kbn_references": [ "@kbn/cloud-security-posture-common", "@kbn/utility-types", - "@kbn/storybook" + "@kbn/ui-theme", ] } diff --git a/x-pack/packages/kbn-cloud-security-posture/public/kibana.jsonc b/x-pack/packages/kbn-cloud-security-posture/public/kibana.jsonc index 4c5a4f1f0165d..811a1ab5dad41 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/kibana.jsonc +++ b/x-pack/packages/kbn-cloud-security-posture/public/kibana.jsonc @@ -1,5 +1,5 @@ { - "id": "@kbn/cloud-security-posture", - "owner": "@elastic/kibana-cloud-security-posture", - "type": "shared-browser" -} \ No newline at end of file + "id": "@kbn/cloud-security-posture", + "owner": "@elastic/kibana-cloud-security-posture", + "type": "shared-browser" +} diff --git a/x-pack/packages/kbn-cloud-security-posture/storybook/config/README.mdx b/x-pack/packages/kbn-cloud-security-posture/storybook/config/README.mdx new file mode 100644 index 0000000000000..ab9ce5263ec69 --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/storybook/config/README.mdx @@ -0,0 +1,3 @@ +# @kbn/cloud-security-posture-storybook-config + +Storybook configuration used by `yarn storybook`. Refer to `@kbn/storybook` for more information. diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/constants.ts b/x-pack/packages/kbn-cloud-security-posture/storybook/config/constants.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/constants.ts rename to x-pack/packages/kbn-cloud-security-posture/storybook/config/constants.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/index.ts b/x-pack/packages/kbn-cloud-security-posture/storybook/config/index.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/index.ts rename to x-pack/packages/kbn-cloud-security-posture/storybook/config/index.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/storybook/config/main.ts b/x-pack/packages/kbn-cloud-security-posture/storybook/config/main.ts new file mode 100644 index 0000000000000..4e7fca030c2f6 --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/storybook/config/main.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. + */ + +import { defaultConfig } from '@kbn/storybook'; + +module.exports = { + ...defaultConfig, + stories: ['../../**/*.stories.+(tsx|mdx)'], + reactOptions: { + strictMode: true, + }, +}; diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/manager.ts b/x-pack/packages/kbn-cloud-security-posture/storybook/config/manager.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/manager.ts rename to x-pack/packages/kbn-cloud-security-posture/storybook/config/manager.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/storybook/config/package.json b/x-pack/packages/kbn-cloud-security-posture/storybook/config/package.json new file mode 100644 index 0000000000000..4ba8c8fd3d57f --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/storybook/config/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/cloud-security-posture-storybook-config", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0" +} diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/preview.ts b/x-pack/packages/kbn-cloud-security-posture/storybook/config/preview.ts similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/preview.ts rename to x-pack/packages/kbn-cloud-security-posture/storybook/config/preview.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/styles.css b/x-pack/packages/kbn-cloud-security-posture/storybook/config/styles.css similarity index 100% rename from x-pack/packages/kbn-cloud-security-posture/graph/storybook/config/styles.css rename to x-pack/packages/kbn-cloud-security-posture/storybook/config/styles.css diff --git a/x-pack/packages/kbn-cloud-security-posture/storybook/config/tsconfig.json b/x-pack/packages/kbn-cloud-security-posture/storybook/config/tsconfig.json new file mode 100644 index 0000000000000..1f8b2275f5191 --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/storybook/config/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "@kbn/ambient-storybook-types", + ] + }, + "include": [ + "**/*.ts" + ], + "kbn_references": [ + "@kbn/storybook", + ], + "exclude": [ + "target/**/*", + ] +} diff --git a/x-pack/packages/security-solution/common/src/flyout/common/components/expandable_panel.tsx b/x-pack/packages/security-solution/common/src/flyout/common/components/expandable_panel.tsx index 4f1890e58554f..383bbbb341c8e 100644 --- a/x-pack/packages/security-solution/common/src/flyout/common/components/expandable_panel.tsx +++ b/x-pack/packages/security-solution/common/src/flyout/common/components/expandable_panel.tsx @@ -22,7 +22,7 @@ import { EuiSkeletonText, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import type { IconType } from '@elastic/eui'; +import type { EuiPanelProps, IconType } from '@elastic/eui'; import { css } from '@emotion/react'; export interface ExpandablePanelPanelProps { @@ -59,6 +59,10 @@ export interface ExpandablePanelPanelProps { * Returns a null component if true */ error?: boolean; + /** + * Content's padding size + */ + paddingSize?: EuiPanelProps['paddingSize']; }; expand?: { /** @@ -84,7 +88,11 @@ export interface ExpandablePanelPanelProps { */ export const ExpandablePanel: FC> = ({ header: { title, link, iconType, headerContent }, - content: { loading, error } = { loading: false, error: false }, + content: { loading, error, paddingSize: contentPaddingSize } = { + loading: false, + error: false, + paddingSize: 'm', + }, expand: { expandable, expandedOnFirstRender } = { expandable: false, expandedOnFirstRender: false, @@ -228,7 +236,9 @@ export const ExpandablePanel: FC> = {showContent && ( - {content} + + {content} + )} diff --git a/x-pack/plugins/cloud_security_posture/server/routes/graph/v1.ts b/x-pack/plugins/cloud_security_posture/server/routes/graph/v1.ts index eb372a2bfea4f..5102d153c1905 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/graph/v1.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/graph/v1.ts @@ -6,6 +6,7 @@ */ import { castArray } from 'lodash'; +import { v4 as uuidv4 } from 'uuid'; import type { Logger, IScopedClusterClient } from '@kbn/core/server'; import type { EdgeDataModel, @@ -13,10 +14,9 @@ import type { EntityNodeDataModel, LabelNodeDataModel, GroupNodeDataModel, - NodeShape, } from '@kbn/cloud-security-posture-common/types/graph/latest'; import type { EsqlToRecords } from '@elastic/elasticsearch/lib/helpers'; -import type { Writeable } from '@kbn/zod'; +import type { Writable } from '@kbn/utility-types'; import type { GraphContextServices, GraphContext } from './types'; interface GraphEdge { @@ -31,6 +31,11 @@ interface GraphEdge { isAlert: boolean; } +interface LabelEdges { + source: string; + target: string; +} + export const getGraph = async ( services: GraphContextServices, query: { @@ -63,28 +68,29 @@ export const getGraph = async ( interface ParseContext { nodesMap: Record; - edgeLabelsNodes: Record; edgesMap: Record; + edgeLabelsNodes: Record; + labelEdges: Record; } const parseRecords = (logger: Logger, records: GraphEdge[]): GraphContext => { - const nodesMap: Record = {}; - const edgeLabelsNodes: Record = {}; - const edgesMap: Record = {}; + const ctx: ParseContext = { nodesMap: {}, edgeLabelsNodes: {}, edgesMap: {}, labelEdges: {} }; logger.trace(`Parsing records [length: ${records.length}]`); - createNodes(logger, records, { nodesMap, edgeLabelsNodes }); - createEdgesAndGroups(logger, { edgeLabelsNodes, edgesMap, nodesMap }); + createNodes(logger, records, ctx); + createEdgesAndGroups(logger, ctx); logger.trace( - `Parsed [nodes: ${Object.keys(nodesMap).length}, edges: ${Object.keys(edgesMap).length}]` + `Parsed [nodes: ${Object.keys(ctx.nodesMap).length}, edges: ${ + Object.keys(ctx.edgesMap).length + }]` ); // Sort groups to be first (fixes minor layout issue) - const nodes = sortNodes(nodesMap); + const nodes = sortNodes(ctx.nodesMap); - return { nodes, edges: Object.values(edgesMap) }; + return { nodes, edges: Object.values(ctx.edgesMap) }; }; const fetchGraph = async ({ @@ -168,12 +174,21 @@ const createNodes = ( records: GraphEdge[], context: Omit ) => { - const { nodesMap, edgeLabelsNodes } = context; + const { nodesMap, edgeLabelsNodes, labelEdges } = context; for (const record of records) { const { ips, hosts, users, actorIds, action, targetIds, isAlert, eventOutcome } = record; const actorIdsArray = castArray(actorIds); const targetIdsArray = castArray(targetIds); + const unknownTargets: string[] = []; + + // Ensure all targets has an id (target can return null from the query) + targetIdsArray.forEach((id, idx) => { + if (!id) { + targetIdsArray[idx] = `unknown ${uuidv4()}`; + unknownTargets.push(targetIdsArray[idx]); + } + }); logger.trace( `Parsing record [actorIds: ${actorIdsArray.join( @@ -186,7 +201,7 @@ const createNodes = ( if (nodesMap[id] === undefined) { nodesMap[id] = { id, - label: id, + label: unknownTargets.includes(id) ? 'Unknown' : undefined, color: isAlert ? 'danger' : 'primary', ...determineEntityNodeShape(id, ips ?? [], hosts ?? [], users ?? []), }; @@ -204,19 +219,18 @@ const createNodes = ( edgeLabelsNodes[edgeId] = []; } - const labelNode = { + const labelNode: LabelNodeDataModel = { id: edgeId + `label(${action})outcome(${eventOutcome})`, label: action, - source: actorId, - target: targetId, color: isAlert ? 'danger' : eventOutcome === 'failed' ? 'warning' : 'primary', shape: 'label', - } as LabelNodeDataModel; + }; logger.trace(`Creating label node [${labelNode.id}]`); nodesMap[labelNode.id] = labelNode; edgeLabelsNodes[edgeId].push(labelNode.id); + labelEdges[labelNode.id] = { source: actorId, target: targetId }; } } } @@ -265,7 +279,7 @@ const sortNodes = (nodesMap: Record) => { }; const createEdgesAndGroups = (logger: Logger, context: ParseContext) => { - const { edgeLabelsNodes, edgesMap, nodesMap } = context; + const { edgeLabelsNodes, edgesMap, nodesMap, labelEdges } = context; Object.entries(edgeLabelsNodes).forEach(([edgeId, edgeLabelsIds]) => { // When there's more than one edge label, create a group node @@ -276,9 +290,9 @@ const createEdgesAndGroups = (logger: Logger, context: ParseContext) => { logger, edgesMap, nodesMap, - (nodesMap[edgeLabelId] as LabelNodeDataModel).source, + labelEdges[edgeLabelId].source, edgeLabelId, - (nodesMap[edgeLabelId] as LabelNodeDataModel).target + labelEdges[edgeLabelId].target ); } else { const groupNode: GroupNodeDataModel = { @@ -291,13 +305,13 @@ const createEdgesAndGroups = (logger: Logger, context: ParseContext) => { logger, edgesMap, nodesMap, - (nodesMap[edgeLabelsIds[0]] as LabelNodeDataModel).source, + labelEdges[edgeLabelsIds[0]].source, groupNode.id, - (nodesMap[edgeLabelsIds[0]] as LabelNodeDataModel).target + labelEdges[edgeLabelsIds[0]].target ); edgeLabelsIds.forEach((edgeLabelId) => { - (nodesMap[edgeLabelId] as Writeable).parentId = groupNode.id; + (nodesMap[edgeLabelId] as Writable).parentId = groupNode.id; connectEntitiesAndLabelNode( logger, edgesMap, @@ -332,7 +346,7 @@ const connectNodes = ( nodesMap: Record, sourceNodeId: string, targetNodeId: string -) => { +): EdgeDataModel => { const sourceNode = nodesMap[sourceNodeId]; const targetNode = nodesMap[targetNodeId]; const color = @@ -345,9 +359,7 @@ const connectNodes = ( return { id: `a(${sourceNodeId})-b(${targetNodeId})`, source: sourceNodeId, - sourceShape: nodesMap[sourceNodeId].shape as NodeShape, target: targetNodeId, - targetShape: nodesMap[targetNodeId].shape as NodeShape, color, - } as EdgeDataModel; + }; }; diff --git a/x-pack/plugins/cloud_security_posture/tsconfig.json b/x-pack/plugins/cloud_security_posture/tsconfig.json index 456035c9112d1..f3883e0fc43c6 100755 --- a/x-pack/plugins/cloud_security_posture/tsconfig.json +++ b/x-pack/plugins/cloud_security_posture/tsconfig.json @@ -66,7 +66,6 @@ "@kbn/cloud-security-posture-common", "@kbn/cloud-security-posture", "@kbn/analytics", - "@kbn/zod" ], "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index 584b992a0f61d..68aaf7bf9cf04 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -280,6 +280,8 @@ export const PINNED_EVENT_URL = '/api/pinned_event' as const; export const SOURCERER_API_URL = '/internal/security_solution/sourcerer' as const; export const RISK_SCORE_INDEX_STATUS_API_URL = '/internal/risk_score/index_status' as const; +export const EVENT_GRAPH_VISUALIZATION_API = '/internal/cloud_security_posture/graph' as const; + /** * Default signals index key for kibana.dev.yml */ diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index ffb9e9748d9c1..792b6352912b3 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -190,6 +190,11 @@ export const allowedExperimentalValues = Object.freeze({ */ analyzerDatePickersAndSourcererDisabled: false, + /** + * Enables graph visualization in alerts flyout + */ + graphVisualizationInFlyoutEnabled: false, + /** * Enables an ability to customize Elastic prebuilt rules. * diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview.test.tsx new file mode 100644 index 0000000000000..22ac27eaa4e00 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview.test.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render } from '@testing-library/react'; +import React from 'react'; +import { TestProviders } from '../../../../common/mock'; +import { mockContextValue } from '../../shared/mocks/mock_context'; +import { DocumentDetailsContext } from '../../shared/context'; +import { GraphPreview, type GraphPreviewProps } from './graph_preview'; +import { GRAPH_PREVIEW_TEST_ID, GRAPH_PREVIEW_LOADING_TEST_ID } from './test_ids'; + +const mockGraph = () =>
; + +jest.mock('@kbn/cloud-security-posture-graph', () => { + return { Graph: mockGraph }; +}); + +const renderGraphPreview = (contextValue: DocumentDetailsContext, props: GraphPreviewProps) => + render( + + + + + + ); + +const ERROR_MESSAGE = 'An error is preventing this alert from being visualized.'; + +describe('', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('shows graph preview correctly when data is loaded', async () => { + const graphProps = { + isLoading: false, + isError: false, + data: { nodes: [], edges: [] }, + }; + + const { findByTestId } = renderGraphPreview(mockContextValue, graphProps); + + // Using findByTestId to wait for the component to be rendered because it is a lazy loaded component + expect(await findByTestId(GRAPH_PREVIEW_TEST_ID)).toBeInTheDocument(); + }); + + it('shows loading when data is loading', () => { + const graphProps = { + isLoading: true, + isError: false, + }; + + const { getByTestId } = renderGraphPreview(mockContextValue, graphProps); + + expect(getByTestId(GRAPH_PREVIEW_LOADING_TEST_ID)).toBeInTheDocument(); + }); + + it('shows error message when there is an error', () => { + const graphProps = { + isLoading: false, + isError: true, + }; + + const { getByText } = renderGraphPreview(mockContextValue, graphProps); + + expect(getByText(ERROR_MESSAGE)).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview.tsx new file mode 100644 index 0000000000000..c3c6d65c7e986 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview.tsx @@ -0,0 +1,102 @@ +/* + * 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, { memo, useMemo } from 'react'; +import { EuiSkeletonText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { css } from '@emotion/react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import type { + NodeDataModel, + EdgeDataModel, +} from '@kbn/cloud-security-posture-common/types/graph/latest'; +import { GRAPH_PREVIEW_TEST_ID, GRAPH_PREVIEW_LOADING_TEST_ID } from './test_ids'; + +/** + * Props for the GraphPreview component. + */ +export interface GraphPreviewProps { + /** + * Indicates whether the graph is currently loading. + */ + isLoading: boolean; + + /** + * Indicates whether there was an error loading the graph. + */ + isError: boolean; + + /** + * Optional data for the graph, including nodes and edges. + */ + data?: { + /** + * Array of node data models. + */ + nodes: NodeDataModel[]; + + /** + * Array of edge data models. + */ + edges: EdgeDataModel[]; + }; +} + +const GraphLazy = React.lazy(() => + import('@kbn/cloud-security-posture-graph').then((module) => ({ default: module.Graph })) +); + +const LoadingComponent = () => ( + +); + +/** + * Graph preview under Overview, Visualizations. It shows a graph without abilities to expand. + */ +export const GraphPreview: React.FC = memo( + ({ isLoading, isError, data }: GraphPreviewProps) => { + const memoizedNodes = useMemo(() => data?.nodes ?? [], [data?.nodes]); + const memoizedEdges = useMemo(() => data?.edges ?? [], [data?.edges]); + + return isLoading ? ( + + ) : isError ? ( + + ) : ( + }> + + + ); + } +); + +GraphPreview.displayName = 'GraphPreview'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview_container.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview_container.test.tsx new file mode 100644 index 0000000000000..6b30e2127a2f8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview_container.test.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render } from '@testing-library/react'; +import { TestProviders } from '../../../../common/mock'; +import React from 'react'; +import { DocumentDetailsContext } from '../../shared/context'; +import { mockContextValue } from '../../shared/mocks/mock_context'; +import { GraphPreviewContainer } from './graph_preview_container'; +import { GRAPH_PREVIEW_TEST_ID } from './test_ids'; +import { useGraphPreview } from '../hooks/use_graph_preview'; +import { useFetchGraphData } from '../hooks/use_fetch_graph_data'; + +import { + EXPANDABLE_PANEL_CONTENT_TEST_ID, + EXPANDABLE_PANEL_HEADER_TITLE_ICON_TEST_ID, + EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID, + EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID, + EXPANDABLE_PANEL_TOGGLE_ICON_TEST_ID, +} from '@kbn/security-solution-common'; + +jest.mock('../hooks/use_graph_preview'); +jest.mock('../hooks/use_fetch_graph_data', () => ({ + useFetchGraphData: jest.fn(), +})); +const mockUseFetchGraphData = useFetchGraphData as jest.Mock; + +const mockUseUiSetting = jest.fn().mockReturnValue([false]); +jest.mock('@kbn/kibana-react-plugin/public', () => { + const original = jest.requireActual('@kbn/kibana-react-plugin/public'); + return { + ...original, + useUiSetting$: () => mockUseUiSetting(), + }; +}); + +const mockGraph = () =>
; + +jest.mock('@kbn/cloud-security-posture-graph', () => { + return { Graph: mockGraph }; +}); + +const renderGraphPreview = (context = mockContextValue) => + render( + + + + + + ); + +describe('', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should render component and link in header', async () => { + mockUseFetchGraphData.mockReturnValue({ + isLoading: false, + isError: false, + data: { nodes: [], edges: [] }, + }); + + (useGraphPreview as jest.Mock).mockReturnValue({ + isAuditLog: true, + }); + + const { getByTestId, queryByTestId, findByTestId } = renderGraphPreview(); + + // Using findByTestId to wait for the component to be rendered because it is a lazy loaded component + expect(await findByTestId(GRAPH_PREVIEW_TEST_ID)).toBeInTheDocument(); + expect( + queryByTestId(EXPANDABLE_PANEL_HEADER_TITLE_LINK_TEST_ID(GRAPH_PREVIEW_TEST_ID)) + ).not.toBeInTheDocument(); + expect( + queryByTestId(EXPANDABLE_PANEL_TOGGLE_ICON_TEST_ID(GRAPH_PREVIEW_TEST_ID)) + ).not.toBeInTheDocument(); + expect( + getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_ICON_TEST_ID(GRAPH_PREVIEW_TEST_ID)) + ).toBeInTheDocument(); + expect( + getByTestId(EXPANDABLE_PANEL_CONTENT_TEST_ID(GRAPH_PREVIEW_TEST_ID)) + ).toBeInTheDocument(); + expect( + getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(GRAPH_PREVIEW_TEST_ID)) + ).toBeInTheDocument(); + }); + + it('should render error message and text in header', () => { + mockUseFetchGraphData.mockReturnValue({ + isLoading: false, + isError: false, + data: undefined, + }); + + (useGraphPreview as jest.Mock).mockReturnValue({ + isAuditLog: false, + }); + + const { getByTestId } = renderGraphPreview(); + + expect( + getByTestId(EXPANDABLE_PANEL_HEADER_TITLE_TEXT_TEST_ID(GRAPH_PREVIEW_TEST_ID)) + ).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview_container.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview_container.tsx new file mode 100644 index 0000000000000..1bc6a8dd7e547 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/graph_preview_container.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { ExpandablePanel } from '@kbn/security-solution-common'; +import { useDocumentDetailsContext } from '../../shared/context'; +import { GRAPH_PREVIEW_TEST_ID } from './test_ids'; +import { GraphPreview } from './graph_preview'; +import { useFetchGraphData } from '../hooks/use_fetch_graph_data'; +import { useGraphPreview } from '../hooks/use_graph_preview'; + +const DEFAULT_FROM = 'now-60d/d'; +const DEFAULT_TO = 'now/d'; + +/** + * Graph preview under Overview, Visualizations. It shows a graph representation of entities. + */ +export const GraphPreviewContainer: React.FC = () => { + const { dataAsNestedObject, getFieldsData } = useDocumentDetailsContext(); + + const { eventIds } = useGraphPreview({ + getFieldsData, + ecsData: dataAsNestedObject, + }); + + // TODO: default start and end might not capture the original event + const graphFetchQuery = useFetchGraphData({ + req: { + query: { + actorIds: [], + eventIds, + start: DEFAULT_FROM, + end: DEFAULT_TO, + }, + }, + }); + + return ( + + ), + iconType: 'indexMapping', + }} + data-test-subj={GRAPH_PREVIEW_TEST_ID} + content={ + !graphFetchQuery.isLoading && !graphFetchQuery.isError + ? { + paddingSize: 'none', + } + : undefined + } + > + + + ); +}; + +GraphPreviewContainer.displayName = 'GraphPreviewContainer'; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts index e0d8bc6db0f5c..e649c578bf487 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/test_ids.ts @@ -178,6 +178,9 @@ export const SESSION_PREVIEW_TEST_ID = `${PREFIX}SessionPreview` as const; export const SESSION_PREVIEW_RULE_DETAILS_LINK_TEST_ID = `${SESSION_PREVIEW_TEST_ID}RuleDetailsLink` as const; +export const GRAPH_PREVIEW_TEST_ID = `${PREFIX}GraphPreview` as const; +export const GRAPH_PREVIEW_LOADING_TEST_ID = `${GRAPH_PREVIEW_TEST_ID}Loading` as const; + /* Response section */ const RESPONSE_TEST_ID = `${PREFIX}Response` as const; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.test.tsx index 9af61e21fb67d..3aeb7d30f8e48 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.test.tsx @@ -11,6 +11,7 @@ import { render } from '@testing-library/react'; import { ANALYZER_PREVIEW_TEST_ID, SESSION_PREVIEW_TEST_ID, + GRAPH_PREVIEW_TEST_ID, VISUALIZATIONS_SECTION_CONTENT_TEST_ID, VISUALIZATIONS_SECTION_HEADER_TEST_ID, } from './test_ids'; @@ -24,6 +25,9 @@ import { TestProvider } from '@kbn/expandable-flyout/src/test/provider'; import { useExpandSection } from '../hooks/use_expand_section'; import { useInvestigateInTimeline } from '../../../../detections/components/alerts_table/timeline_actions/use_investigate_in_timeline'; import { useIsInvestigateInResolverActionEnabled } from '../../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver'; +import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; +import { useGraphPreview } from '../hooks/use_graph_preview'; +import { useFetchGraphData } from '../hooks/use_fetch_graph_data'; jest.mock('../hooks/use_expand_section'); jest.mock('../../shared/hooks/use_alert_prevalence_from_process_tree', () => ({ @@ -49,6 +53,11 @@ jest.mock( jest.mock( '../../../../detections/components/alerts_table/timeline_actions/investigate_in_resolver' ); +jest.mock('../../../../common/hooks/use_experimental_features', () => ({ + useIsExperimentalFeatureEnabled: jest.fn(), +})); + +const useIsExperimentalFeatureEnabledMock = useIsExperimentalFeatureEnabled as jest.Mock; const mockUseUiSetting = jest.fn().mockReturnValue([false]); jest.mock('@kbn/kibana-react-plugin/public', () => { @@ -58,6 +67,15 @@ jest.mock('@kbn/kibana-react-plugin/public', () => { useUiSetting$: () => mockUseUiSetting(), }; }); +jest.mock('../hooks/use_graph_preview'); + +const mockUseGraphPreview = useGraphPreview as jest.Mock; + +jest.mock('../hooks/use_fetch_graph_data', () => ({ + useFetchGraphData: jest.fn(), +})); + +const mockUseFetchGraphData = useFetchGraphData as jest.Mock; const panelContextValue = { ...mockContextValue, @@ -84,6 +102,17 @@ describe('', () => { alertIds: undefined, statsNodes: undefined, }); + mockUseGraphPreview.mockReturnValue({ + isAuditLog: true, + }); + mockUseFetchGraphData.mockReturnValue({ + isLoading: false, + isError: false, + data: { + nodes: [], + edges: [], + }, + }); }); it('should render visualizations component', () => { @@ -107,11 +136,22 @@ describe('', () => { }); (useIsInvestigateInResolverActionEnabled as jest.Mock).mockReturnValue(true); (useExpandSection as jest.Mock).mockReturnValue(true); + useIsExperimentalFeatureEnabledMock.mockReturnValue(false); - const { getByTestId } = renderVisualizationsSection(); + const { getByTestId, queryByTestId } = renderVisualizationsSection(); expect(getByTestId(VISUALIZATIONS_SECTION_CONTENT_TEST_ID)).toBeVisible(); expect(getByTestId(`${SESSION_PREVIEW_TEST_ID}LeftSection`)).toBeInTheDocument(); expect(getByTestId(`${ANALYZER_PREVIEW_TEST_ID}LeftSection`)).toBeInTheDocument(); + expect(queryByTestId(`${GRAPH_PREVIEW_TEST_ID}LeftSection`)).not.toBeInTheDocument(); + }); + + it('should render the graph preview component if the feature is enabled', () => { + (useExpandSection as jest.Mock).mockReturnValue(true); + useIsExperimentalFeatureEnabledMock.mockReturnValue(true); + + const { getByTestId } = renderVisualizationsSection(); + + expect(getByTestId(`${GRAPH_PREVIEW_TEST_ID}LeftSection`)).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.tsx index afb828ebdb4e8..c328036eece43 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/visualizations_section.tsx @@ -13,6 +13,10 @@ import { AnalyzerPreviewContainer } from './analyzer_preview_container'; import { SessionPreviewContainer } from './session_preview_container'; import { ExpandableSection } from './expandable_section'; import { VISUALIZATIONS_TEST_ID } from './test_ids'; +import { GraphPreviewContainer } from './graph_preview_container'; +import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; +import { useDocumentDetailsContext } from '../../shared/context'; +import { useGraphPreview } from '../hooks/use_graph_preview'; const KEY = 'visualizations'; @@ -21,6 +25,17 @@ const KEY = 'visualizations'; */ export const VisualizationsSection = memo(() => { const expanded = useExpandSection({ title: KEY, defaultValue: false }); + const graphVisualizationInFlyoutEnabled = useIsExperimentalFeatureEnabled( + 'graphVisualizationInFlyoutEnabled' + ); + + const { dataAsNestedObject, getFieldsData } = useDocumentDetailsContext(); + + // Decide whether to show the graph preview or not + const { isAuditLog: isGraphPreviewEnabled } = useGraphPreview({ + getFieldsData, + ecsData: dataAsNestedObject, + }); return ( { + {graphVisualizationInFlyoutEnabled && isGraphPreviewEnabled && ( + <> + + + + )} ); }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_fetch_graph_data.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_fetch_graph_data.ts new file mode 100644 index 0000000000000..2304cfb8d4fd2 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_fetch_graph_data.ts @@ -0,0 +1,83 @@ +/* + * 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 { useQuery } from '@tanstack/react-query'; +import type { + GraphRequest, + GraphResponse, +} from '@kbn/cloud-security-posture-common/types/graph/latest'; +import { EVENT_GRAPH_VISUALIZATION_API } from '../../../../../common/constants'; +import { useHttp } from '../../../../common/lib/kibana'; + +/** + * Interface for the input parameters of the useFetchGraphData hook. + */ +export interface UseFetchGraphDataParams { + /** + * The request object containing the query parameters for the graph data. + */ + req: GraphRequest; + /** + * Optional configuration options for the query. + */ + options?: { + /** + * If false, the query will not automatically run. + * Defaults to true. + */ + enabled?: boolean; + }; +} + +/** + * Interface for the result of the useFetchGraphData hook. + */ +export interface UseFetchGraphDataResult { + /** + * Indicates if the query is currently loading. + */ + isLoading: boolean; + /** + * Indicates if there was an error during the query. + */ + isError: boolean; + /** + * The data returned from the query. + */ + data?: GraphResponse; +} + +/** + * Hook to fetch event's graph visualization data. + * + * @param params - The input parameters for the hook. + * @returns The result of the hook. + */ +export const useFetchGraphData = ({ + req, + options, +}: UseFetchGraphDataParams): UseFetchGraphDataResult => { + const { actorIds, eventIds, start, end } = req.query; + const http = useHttp(); + + const { isLoading, isError, data } = useQuery( + ['useFetchGraphData', actorIds, eventIds, start, end], + () => { + return http.post(EVENT_GRAPH_VISUALIZATION_API, { + version: '1', + body: JSON.stringify(req), + }); + }, + options + ); + + return { + isLoading, + isError, + data, + }; +}; diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_graph_preview.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_graph_preview.test.tsx new file mode 100644 index 0000000000000..ff6118ec9b743 --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_graph_preview.test.tsx @@ -0,0 +1,137 @@ +/* + * 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 { RenderHookResult } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react-hooks'; +import type { UseGraphPreviewParams, UseGraphPreviewResult } from './use_graph_preview'; +import { useGraphPreview } from './use_graph_preview'; +import type { GetFieldsData } from '../../shared/hooks/use_get_fields_data'; +import { mockFieldData } from '../../shared/mocks/mock_get_fields_data'; + +describe('useGraphPreview', () => { + let hookResult: RenderHookResult; + + it(`should return false when missing actor`, () => { + const getFieldsData: GetFieldsData = (field: string) => { + if (field === 'kibana.alert.original_event.id') { + return field; + } + return mockFieldData[field]; + }; + + hookResult = renderHook((props: UseGraphPreviewParams) => useGraphPreview(props), { + initialProps: { + getFieldsData, + ecsData: { + _id: 'id', + event: { + action: ['action'], + }, + }, + }, + }); + + expect(hookResult.result.current.isAuditLog).toEqual(false); + }); + + it(`should return false when missing event.action`, () => { + const getFieldsData: GetFieldsData = (field: string) => { + if (field === 'kibana.alert.original_event.id') { + return 'eventId'; + } else if (field === 'actor.entity.id') { + return 'actorId'; + } + return mockFieldData[field]; + }; + + hookResult = renderHook((props: UseGraphPreviewParams) => useGraphPreview(props), { + initialProps: { + getFieldsData, + ecsData: { + _id: 'id', + }, + }, + }); + + expect(hookResult.result.current.isAuditLog).toEqual(false); + }); + + it(`should return false when missing original_event.id`, () => { + const getFieldsData: GetFieldsData = (field: string) => { + if (field === 'actor.entity.id') { + return 'actorId'; + } + return mockFieldData[field]; + }; + + hookResult = renderHook((props: UseGraphPreviewParams) => useGraphPreview(props), { + initialProps: { + getFieldsData, + ecsData: { + _id: 'id', + event: { + action: ['action'], + }, + }, + }, + }); + + expect(hookResult.result.current.isAuditLog).toEqual(false); + }); + + it(`should return true when alert is has graph preview`, () => { + const getFieldsData: GetFieldsData = (field: string) => { + if (field === 'kibana.alert.original_event.id') { + return 'eventId'; + } else if (field === 'actor.entity.id') { + return 'actorId'; + } + + return mockFieldData[field]; + }; + + hookResult = renderHook((props: UseGraphPreviewParams) => useGraphPreview(props), { + initialProps: { + getFieldsData, + ecsData: { + _id: 'id', + event: { + action: ['action'], + }, + }, + }, + }); + + expect(hookResult.result.current.isAuditLog).toEqual(true); + }); + + it(`should return true when alert is has graph preview with multiple values`, () => { + const getFieldsData: GetFieldsData = (field: string) => { + if (field === 'kibana.alert.original_event.id') { + return ['id1', 'id2']; + } else if (field === 'actor.entity.id') { + return ['actorId1', 'actorId2']; + } + + return mockFieldData[field]; + }; + + hookResult = renderHook((props: UseGraphPreviewParams) => useGraphPreview(props), { + initialProps: { + getFieldsData, + ecsData: { + _id: 'id', + event: { + action: ['action1', 'action2'], + }, + }, + }, + }); + + expect(hookResult.result.current.isAuditLog).toEqual(true); + }); +}); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_graph_preview.ts b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_graph_preview.ts new file mode 100644 index 0000000000000..d833c0aa86dbc --- /dev/null +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/hooks/use_graph_preview.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 type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs'; +import { get } from 'lodash/fp'; +import type { GetFieldsData } from '../../shared/hooks/use_get_fields_data'; +import { getFieldArray } from '../../shared/utils'; + +export interface UseGraphPreviewParams { + /** + * Retrieves searchHit values for the provided field + */ + getFieldsData: GetFieldsData; + + /** + * An object with top level fields from the ECS object + */ + ecsData: Ecs; +} +/** + * Interface for the result of the useGraphPreview hook + */ +export interface UseGraphPreviewResult { + /** + * Array of event IDs associated with the alert + */ + eventIds: string[]; + + /** + * Array of actor entity IDs associated with the alert + */ + actorIds: string[]; + + /** + * Action associated with the event + */ + action: string | undefined; + + /** + * Boolean indicating if the event is an audit log (contains event ids, actor ids and action) + */ + isAuditLog: boolean; +} + +/** + * Hook that returns the graph view configuration if the graph view is available for the alert + */ +export const useGraphPreview = ({ + getFieldsData, + ecsData, +}: UseGraphPreviewParams): UseGraphPreviewResult => { + const originalEventId = getFieldsData('kibana.alert.original_event.id'); + const eventId = getFieldsData('event.id'); + const eventIds = originalEventId ? getFieldArray(originalEventId) : getFieldArray(eventId); + + const actorIds = getFieldArray(getFieldsData('actor.entity.id')); + const action = get(['event', 'action'], ecsData); + const isAuditLog = actorIds.length > 0 && action?.length > 0 && eventIds.length > 0; + + return { eventIds, actorIds, action, isAuditLog }; +}; diff --git a/x-pack/plugins/security_solution/tsconfig.json b/x-pack/plugins/security_solution/tsconfig.json index 2b11529ea4d72..15d082d32edda 100644 --- a/x-pack/plugins/security_solution/tsconfig.json +++ b/x-pack/plugins/security_solution/tsconfig.json @@ -220,6 +220,7 @@ "@kbn/cloud-security-posture", "@kbn/security-solution-distribution-bar", "@kbn/cloud-security-posture-common", + "@kbn/cloud-security-posture-graph", "@kbn/presentation-publishing", "@kbn/entityManager-plugin", "@kbn/entities-schema", diff --git a/x-pack/test/cloud_security_posture_functional/config.ts b/x-pack/test/cloud_security_posture_functional/config.ts index 28283fe427949..7e80788ffccfe 100644 --- a/x-pack/test/cloud_security_posture_functional/config.ts +++ b/x-pack/test/cloud_security_posture_functional/config.ts @@ -38,6 +38,9 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { * 1. release a new package to EPR * 2. merge the updated version number change to kibana */ + `--xpack.securitySolution.enableExperimental=${JSON.stringify([ + 'graphVisualizationInFlyoutEnabled', + ])}`, `--xpack.fleet.packages.0.name=cloud_security_posture`, `--xpack.fleet.packages.0.version=${CLOUD_SECURITY_PLUGIN_VERSION}`, // `--xpack.fleet.registryUrl=https://localhost:8080`, diff --git a/x-pack/test/cloud_security_posture_functional/es_archives/logs_gcp_audit/data.json b/x-pack/test/cloud_security_posture_functional/es_archives/logs_gcp_audit/data.json new file mode 100644 index 0000000000000..5e3d4cdfdffd5 --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/es_archives/logs_gcp_audit/data.json @@ -0,0 +1,634 @@ +{ + "type": "doc", + "value": { + "data_stream": "logs-gcp.audit-default", + "id": "1", + "index": ".ds-logs-gcp.audit-default-2024.10.07-000001", + "source": { + "@timestamp": "2024-09-01T12:34:56.789Z", + "actor": { + "entity": { + "id": "admin@example.com" + } + }, + "client": { + "user": { + "email": "admin@example.com" + } + }, + "cloud": { + "project": { + "id": "your-project-id" + }, + "provider": "gcp" + }, + "ecs": { + "version": "8.11.0" + }, + "event": { + "action": "google.iam.admin.v1.CreateRole", + "agent_id_status": "missing", + "category": [ + "session", + "network", + "configuration" + ], + "id": "kabcd1234efgh5678", + "ingested": "2024-10-07T17:47:35Z", + "kind": "event", + "outcome": "success", + "provider": "activity", + "type": [ + "end", + "access", + "allowed" + ] + }, + "gcp": { + "audit": { + "authorization_info": [ + { + "granted": true, + "permission": "iam.roles.create", + "resource": "projects/your-project-id" + } + ], + "logentry_operation": { + "id": "operation-0987654321" + }, + "request": { + "@type": "type.googleapis.com/google.iam.admin.v1.CreateRoleRequest", + "parent": "projects/your-project-id", + "role": { + "description": "A custom role with specific permissions", + "includedPermissions": [ + "resourcemanager.projects.get", + "resourcemanager.projects.list" + ], + "name": "projects/your-project-id/roles/customRole", + "title": "Custom Role" + }, + "roleId": "customRole" + }, + "resource_name": "projects/your-project-id/roles/customRole", + "response": { + "@type": "type.googleapis.com/google.iam.admin.v1.Role", + "description": "A custom role with specific permissions", + "includedPermissions": [ + "resourcemanager.projects.get", + "resourcemanager.projects.list" + ], + "name": "projects/your-project-id/roles/customRole", + "stage": "GA", + "title": "Custom Role" + }, + "type": "type.googleapis.com/google.cloud.audit.AuditLog" + } + }, + "log": { + "level": "NOTICE", + "logger": "projects/your-project-id/logs/cloudaudit.googleapis.com%2Factivity" + }, + "related": { + "ip": [ + "10.0.0.1" + ], + "user": [ + "admin@example.com" + ] + }, + "service": { + "name": "iam.googleapis.com" + }, + "source": { + "ip": "10.0.0.1" + }, + "tags": [ + "_geoip_database_unavailable_GeoLite2-City.mmdb", + "_geoip_database_unavailable_GeoLite2-ASN.mmdb" + ], + "target": { + "entity": { + "id": "projects/your-project-id/roles/customRole" + } + }, + "user_agent": { + "device": { + "name": "Other" + }, + "name": "Other", + "original": "google-cloud-sdk/324.0.0" + } + } + } +} + +{ + "type": "doc", + "value": { + "data_stream": "logs-gcp.audit-default", + "id": "2", + "index": ".ds-logs-gcp.audit-default-2024.10.07-000001", + "source": { + "@timestamp": "2024-09-01T12:34:56.789Z", + "actor": { + "entity": { + "id": "admin2@example.com" + } + }, + "client": { + "user": { + "email": "admin2@example.com" + } + }, + "cloud": { + "project": { + "id": "your-project-id" + }, + "provider": "gcp" + }, + "ecs": { + "version": "8.11.0" + }, + "event": { + "action": "google.iam.admin.v1.CreateRole", + "agent_id_status": "missing", + "category": [ + "session", + "network", + "configuration" + ], + "id": "failed-event", + "ingested": "2024-10-07T17:47:35Z", + "kind": "event", + "outcome": "failed", + "provider": "activity", + "type": [ + "end", + "access", + "allowed" + ] + }, + "gcp": { + "audit": { + "authorization_info": [ + { + "granted": true, + "permission": "iam.roles.create", + "resource": "projects/your-project-id" + } + ], + "logentry_operation": { + "id": "operation-0987654321" + }, + "request": { + "@type": "type.googleapis.com/google.iam.admin.v1.CreateRoleRequest", + "parent": "projects/your-project-id", + "role": { + "description": "A custom role with specific permissions", + "includedPermissions": [ + "resourcemanager.projects.get", + "resourcemanager.projects.list" + ], + "name": "projects/your-project-id/roles/customRole", + "title": "Custom Role" + }, + "roleId": "customRole" + }, + "resource_name": "projects/your-project-id/roles/customRole", + "response": { + "@type": "type.googleapis.com/google.iam.admin.v1.Role", + "description": "A custom role with specific permissions", + "includedPermissions": [ + "resourcemanager.projects.get", + "resourcemanager.projects.list" + ], + "name": "projects/your-project-id/roles/customRole", + "stage": "GA", + "title": "Custom Role" + }, + "type": "type.googleapis.com/google.cloud.audit.AuditLog" + } + }, + "log": { + "level": "NOTICE", + "logger": "projects/your-project-id/logs/cloudaudit.googleapis.com%2Factivity" + }, + "related": { + "ip": [ + "10.0.0.1" + ], + "user": [ + "admin2@example.com" + ] + }, + "service": { + "name": "iam.googleapis.com" + }, + "source": { + "ip": "10.0.0.1" + }, + "tags": [ + "_geoip_database_unavailable_GeoLite2-City.mmdb", + "_geoip_database_unavailable_GeoLite2-ASN.mmdb" + ], + "target": { + "entity": { + "id": "projects/your-project-id/roles/customRole" + } + }, + "user_agent": { + "device": { + "name": "Other" + }, + "name": "Other", + "original": "google-cloud-sdk/324.0.0" + } + } + } +} + +{ + "type": "doc", + "value": { + "data_stream": "logs-gcp.audit-default", + "id": "3", + "index": ".ds-logs-gcp.audit-default-2024.10.07-000001", + "source": { + "@timestamp": "2024-09-01T12:34:56.789Z", + "actor": { + "entity": { + "id": "admin3@example.com" + } + }, + "client": { + "user": { + "email": "admin3@example.com" + } + }, + "cloud": { + "project": { + "id": "your-project-id" + }, + "provider": "gcp" + }, + "ecs": { + "version": "8.11.0" + }, + "event": { + "action": "google.iam.admin.v1.CreateRole", + "agent_id_status": "missing", + "category": [ + "session", + "network", + "configuration" + ], + "id": "grouped-event1", + "ingested": "2024-10-07T17:47:35Z", + "kind": "event", + "outcome": "failed", + "provider": "activity", + "type": [ + "end", + "access", + "allowed" + ] + }, + "gcp": { + "audit": { + "authorization_info": [ + { + "granted": true, + "permission": "iam.roles.create", + "resource": "projects/your-project-id" + } + ], + "logentry_operation": { + "id": "operation-0987654321" + }, + "request": { + "@type": "type.googleapis.com/google.iam.admin.v1.CreateRoleRequest", + "parent": "projects/your-project-id", + "role": { + "description": "A custom role with specific permissions", + "includedPermissions": [ + "resourcemanager.projects.get", + "resourcemanager.projects.list" + ], + "name": "projects/your-project-id/roles/customRole", + "title": "Custom Role" + }, + "roleId": "customRole" + }, + "resource_name": "projects/your-project-id/roles/customRole", + "response": { + "@type": "type.googleapis.com/google.iam.admin.v1.Role", + "description": "A custom role with specific permissions", + "includedPermissions": [ + "resourcemanager.projects.get", + "resourcemanager.projects.list" + ], + "name": "projects/your-project-id/roles/customRole", + "stage": "GA", + "title": "Custom Role" + }, + "type": "type.googleapis.com/google.cloud.audit.AuditLog" + } + }, + "log": { + "level": "NOTICE", + "logger": "projects/your-project-id/logs/cloudaudit.googleapis.com%2Factivity" + }, + "related": { + "ip": [ + "10.0.0.1" + ], + "user": [ + "admin3@example.com" + ] + }, + "service": { + "name": "iam.googleapis.com" + }, + "source": { + "ip": "10.0.0.1" + }, + "tags": [ + "_geoip_database_unavailable_GeoLite2-City.mmdb", + "_geoip_database_unavailable_GeoLite2-ASN.mmdb" + ], + "target": { + "entity": { + "id": "projects/your-project-id/roles/customRole" + } + }, + "user_agent": { + "device": { + "name": "Other" + }, + "name": "Other", + "original": "google-cloud-sdk/324.0.0" + } + } + } +} + +{ + "type": "doc", + "value": { + "data_stream": "logs-gcp.audit-default", + "id": "4", + "index": ".ds-logs-gcp.audit-default-2024.10.07-000001", + "source": { + "@timestamp": "2024-09-01T12:34:56.789Z", + "actor": { + "entity": { + "id": "admin3@example.com" + } + }, + "client": { + "user": { + "email": "admin3@example.com" + } + }, + "cloud": { + "project": { + "id": "your-project-id" + }, + "provider": "gcp" + }, + "ecs": { + "version": "8.11.0" + }, + "event": { + "action": "google.iam.admin.v1.CreateRole", + "agent_id_status": "missing", + "category": [ + "session", + "network", + "configuration" + ], + "id": "grouped-event2", + "ingested": "2024-10-07T17:47:35Z", + "kind": "event", + "outcome": "success", + "provider": "activity", + "type": [ + "end", + "access", + "allowed" + ] + }, + "gcp": { + "audit": { + "authorization_info": [ + { + "granted": true, + "permission": "iam.roles.create", + "resource": "projects/your-project-id" + } + ], + "logentry_operation": { + "id": "operation-0987654321" + }, + "request": { + "@type": "type.googleapis.com/google.iam.admin.v1.CreateRoleRequest", + "parent": "projects/your-project-id", + "role": { + "description": "A custom role with specific permissions", + "includedPermissions": [ + "resourcemanager.projects.get", + "resourcemanager.projects.list" + ], + "name": "projects/your-project-id/roles/customRole", + "title": "Custom Role" + }, + "roleId": "customRole" + }, + "resource_name": "projects/your-project-id/roles/customRole", + "response": { + "@type": "type.googleapis.com/google.iam.admin.v1.Role", + "description": "A custom role with specific permissions", + "includedPermissions": [ + "resourcemanager.projects.get", + "resourcemanager.projects.list" + ], + "name": "projects/your-project-id/roles/customRole", + "stage": "GA", + "title": "Custom Role" + }, + "type": "type.googleapis.com/google.cloud.audit.AuditLog" + } + }, + "log": { + "level": "NOTICE", + "logger": "projects/your-project-id/logs/cloudaudit.googleapis.com%2Factivity" + }, + "related": { + "ip": [ + "10.0.0.1" + ], + "user": [ + "admin3@example.com" + ] + }, + "service": { + "name": "iam.googleapis.com" + }, + "source": { + "ip": "10.0.0.1" + }, + "tags": [ + "_geoip_database_unavailable_GeoLite2-City.mmdb", + "_geoip_database_unavailable_GeoLite2-ASN.mmdb" + ], + "target": { + "entity": { + "id": "projects/your-project-id/roles/customRole" + } + }, + "user_agent": { + "device": { + "name": "Other" + }, + "name": "Other", + "original": "google-cloud-sdk/324.0.0" + } + } + } +} + +{ + "type": "doc", + "value": { + "data_stream": "logs-gcp.audit-default", + "id": "5", + "index": ".ds-logs-gcp.audit-default-2024.10.07-000001", + "source": { + "@timestamp": "2024-09-01T12:34:56.789Z", + "actor": { + "entity": { + "id": "admin4@example.com" + } + }, + "client": { + "user": { + "email": "admin4@example.com" + } + }, + "cloud": { + "project": { + "id": "your-project-id" + }, + "provider": "gcp" + }, + "ecs": { + "version": "8.11.0" + }, + "event": { + "action": "google.iam.admin.v1.CreateRole", + "agent_id_status": "missing", + "category": [ + "session", + "network", + "configuration" + ], + "id": "host-event", + "ingested": "2024-10-07T17:47:35Z", + "kind": "event", + "outcome": "success", + "provider": "activity", + "type": [ + "end", + "access", + "allowed" + ] + }, + "gcp": { + "audit": { + "authorization_info": [ + { + "granted": true, + "permission": "iam.roles.create", + "resource": "projects/your-project-id" + } + ], + "logentry_operation": { + "id": "operation-0987654321" + }, + "request": { + "@type": "type.googleapis.com/google.iam.admin.v1.CreateRoleRequest", + "parent": "projects/your-project-id", + "role": { + "description": "A custom role with specific permissions", + "includedPermissions": [ + "resourcemanager.projects.get", + "resourcemanager.projects.list" + ], + "name": "projects/your-project-id/roles/customRole", + "title": "Custom Role" + }, + "roleId": "customRole" + }, + "resource_name": "projects/your-project-id/roles/customRole", + "response": { + "@type": "type.googleapis.com/google.iam.admin.v1.Role", + "description": "A custom role with specific permissions", + "includedPermissions": [ + "resourcemanager.projects.get", + "resourcemanager.projects.list" + ], + "name": "projects/your-project-id/roles/customRole", + "stage": "GA", + "title": "Custom Role" + }, + "type": "type.googleapis.com/google.cloud.audit.AuditLog" + } + }, + "host": { + "hostname": "host1.example.com", + "name": "host1.example.com", + "ip": "192.168.1.1", + "os": { + "name": "Linux", + "version": "5.4.0-42-generic" + } + }, + "log": { + "level": "NOTICE", + "logger": "projects/your-project-id/logs/cloudaudit.googleapis.com%2Factivity" + }, + "related": { + "ip": [ + "10.0.0.1" + ], + "user": [ + "admin4@example.com" + ] + }, + "service": { + "name": "iam.googleapis.com" + }, + "source": { + "ip": "10.0.0.1" + }, + "tags": [ + "_geoip_database_unavailable_GeoLite2-City.mmdb", + "_geoip_database_unavailable_GeoLite2-ASN.mmdb" + ], + "target": { + "entity": { + "id": "projects/your-project-id/roles/customRole" + } + }, + "user_agent": { + "device": { + "name": "Other" + }, + "name": "Other", + "original": "google-cloud-sdk/324.0.0" + } + } + } +} + diff --git a/x-pack/test/cloud_security_posture_functional/es_archives/logs_gcp_audit/mappings.json b/x-pack/test/cloud_security_posture_functional/es_archives/logs_gcp_audit/mappings.json new file mode 100644 index 0000000000000..085fc6d11d475 --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/es_archives/logs_gcp_audit/mappings.json @@ -0,0 +1,628 @@ +{ + "type": "data_stream", + "value": { + "data_stream": "logs-gcp.audit-default", + "template": { + "_meta": { + "managed": true, + "managed_by": "fleet", + "package": { + "name": "gcp" + } + }, + "data_stream": { + "allow_custom_routing": false, + "hidden": false + }, + "ignore_missing_component_templates": [ + "logs-gcp.audit@custom" + ], + "index_patterns": [ + "logs-gcp.audit-*" + ], + "name": "logs-gcp.audit", + "priority": 200, + "template": { + "mappings": { + "_meta": { + "managed": true, + "managed_by": "fleet", + "package": { + "name": "gcp" + } + }, + "date_detection": false, + "dynamic_templates": [ + { + "ecs_message_match_only_text": { + "mapping": { + "type": "match_only_text" + }, + "path_match": [ + "message", + "*.message" + ], + "unmatch_mapping_type": "object" + } + }, + { + "ecs_non_indexed_keyword": { + "mapping": { + "doc_values": false, + "index": false, + "type": "keyword" + }, + "path_match": [ + "*event.original" + ] + } + }, + { + "ecs_non_indexed_long": { + "mapping": { + "doc_values": false, + "index": false, + "type": "long" + }, + "path_match": [ + "*.x509.public_key_exponent" + ] + } + }, + { + "ecs_ip": { + "mapping": { + "type": "ip" + }, + "match_mapping_type": "string", + "path_match": [ + "ip", + "*.ip", + "*_ip" + ] + } + }, + { + "ecs_wildcard": { + "mapping": { + "type": "wildcard" + }, + "path_match": [ + "*.io.text", + "*.message_id", + "*registry.data.strings", + "*url.path" + ], + "unmatch_mapping_type": "object" + } + }, + { + "ecs_path_match_wildcard_and_match_only_text": { + "mapping": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "path_match": [ + "*.body.content", + "*url.full", + "*url.original" + ], + "unmatch_mapping_type": "object" + } + }, + { + "ecs_match_wildcard_and_match_only_text": { + "mapping": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "match": [ + "*command_line", + "*stack_trace" + ], + "unmatch_mapping_type": "object" + } + }, + { + "ecs_path_match_keyword_and_match_only_text": { + "mapping": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "keyword" + }, + "path_match": [ + "*.title", + "*.executable", + "*.name", + "*.working_directory", + "*.full_name", + "*file.path", + "*file.target_path", + "*os.full", + "*email.subject", + "*vulnerability.description", + "*user_agent.original" + ], + "unmatch_mapping_type": "object" + } + }, + { + "ecs_date": { + "mapping": { + "type": "date" + }, + "path_match": [ + "*.timestamp", + "*_timestamp", + "*.not_after", + "*.not_before", + "*.accessed", + "created", + "*.created", + "*.installed", + "*.creation_date", + "*.ctime", + "*.mtime", + "ingested", + "*.ingested", + "*.start", + "*.end", + "*.indicator.first_seen", + "*.indicator.last_seen", + "*.indicator.modified_at", + "*threat.enrichments.matched.occurred" + ], + "unmatch_mapping_type": "object" + } + }, + { + "ecs_path_match_float": { + "mapping": { + "type": "float" + }, + "path_match": [ + "*.score.*", + "*_score*" + ], + "path_unmatch": "*.version", + "unmatch_mapping_type": "object" + } + }, + { + "ecs_usage_double_scaled_float": { + "mapping": { + "scaling_factor": 1000, + "type": "scaled_float" + }, + "match_mapping_type": [ + "double", + "long", + "string" + ], + "path_match": "*.usage" + } + }, + { + "ecs_geo_point": { + "mapping": { + "type": "geo_point" + }, + "path_match": [ + "*.geo.location" + ] + } + }, + { + "ecs_flattened": { + "mapping": { + "type": "flattened" + }, + "match_mapping_type": "object", + "path_match": [ + "*structured_data", + "*exports", + "*imports" + ] + } + }, + { + "all_strings_to_keywords": { + "mapping": { + "ignore_above": 1024, + "type": "keyword" + }, + "match_mapping_type": "string" + } + } + ], + "properties": { + "@timestamp": { + "ignore_malformed": false, + "type": "date" + }, + "cloud": { + "properties": { + "image": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "data_stream": { + "properties": { + "dataset": { + "type": "constant_keyword" + }, + "namespace": { + "type": "constant_keyword" + }, + "type": { + "type": "constant_keyword" + } + } + }, + "data_stream.dataset": { + "type": "constant_keyword" + }, + "data_stream.namespace": { + "type": "constant_keyword" + }, + "data_stream.type": { + "type": "constant_keyword", + "value": "logs" + }, + "event": { + "properties": { + "agent_id_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "dataset": { + "type": "constant_keyword", + "value": "gcp.audit" + }, + "ingested": { + "format": "strict_date_time_no_millis||strict_date_optional_time||epoch_millis", + "ignore_malformed": false, + "type": "date" + }, + "module": { + "type": "constant_keyword", + "value": "gcp" + } + } + }, + "gcp": { + "properties": { + "audit": { + "properties": { + "authentication_info": { + "properties": { + "authority_selector": { + "ignore_above": 1024, + "type": "keyword" + }, + "principal_email": { + "ignore_above": 1024, + "type": "keyword" + }, + "principal_subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "service_account_delegation_info": { + "type": "flattened" + }, + "service_account_key_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "third_party_principal": { + "type": "flattened" + } + } + }, + "authorization_info": { + "properties": { + "granted": { + "type": "boolean" + }, + "permission": { + "ignore_above": 1024, + "type": "keyword" + }, + "resource": { + "ignore_above": 1024, + "type": "keyword" + }, + "resource_attributes": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + }, + "type": "nested" + }, + "flattened": { + "type": "flattened" + }, + "labels": { + "type": "flattened" + }, + "logentry_operation": { + "properties": { + "first": { + "type": "boolean" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "last": { + "type": "boolean" + }, + "producer": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "metadata": { + "type": "flattened" + }, + "method_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "num_response_items": { + "type": "long" + }, + "policy_violation_info": { + "properties": { + "payload": { + "type": "flattened" + }, + "resource_tags": { + "type": "flattened" + }, + "resource_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "violations": { + "properties": { + "checkedValue": { + "ignore_above": 1024, + "type": "keyword" + }, + "constraint": { + "ignore_above": 1024, + "type": "keyword" + }, + "errorMessage": { + "ignore_above": 1024, + "type": "keyword" + }, + "policyType": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + } + } + }, + "request": { + "type": "flattened" + }, + "request_metadata": { + "properties": { + "caller_ip": { + "type": "ip" + }, + "caller_supplied_user_agent": { + "ignore_above": 1024, + "type": "keyword" + }, + "raw": { + "properties": { + "caller_ip": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "resource_location": { + "properties": { + "current_locations": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "resource_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "response": { + "type": "flattened" + }, + "service_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "properties": { + "code": { + "type": "long" + }, + "details": { + "type": "flattened" + }, + "message": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "destination": { + "properties": { + "instance": { + "properties": { + "project_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vpc": { + "properties": { + "project_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "subnetwork_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "vpc_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "source": { + "properties": { + "instance": { + "properties": { + "project_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vpc": { + "properties": { + "project_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "subnetwork_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "vpc_name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "host": { + "properties": { + "containerized": { + "type": "boolean" + }, + "os": { + "properties": { + "build": { + "ignore_above": 1024, + "type": "keyword" + }, + "codename": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "input": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "log": { + "properties": { + "offset": { + "type": "long" + } + } + } + } + }, + "settings": { + "index": { + "codec": "best_compression", + "final_pipeline": ".fleet_final_pipeline-1", + "mapping": { + "ignore_malformed": "true", + "total_fields": { + "ignore_dynamic_beyond_limit": "true", + "limit": "1000" + } + } + } + } + } + } + } +} diff --git a/x-pack/test/cloud_security_posture_functional/es_archives/security_alerts/data.json.gz b/x-pack/test/cloud_security_posture_functional/es_archives/security_alerts/data.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..93b2c20b81c86a7cd2edc5006f73c3668bf404a1 GIT binary patch literal 3143 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 VLPjs>Eq*^?iI?8NxVx~h{0rLzLWckV literal 0 HcmV?d00001 diff --git a/x-pack/test/cloud_security_posture_functional/es_archives/security_alerts/mappings.json b/x-pack/test/cloud_security_posture_functional/es_archives/security_alerts/mappings.json new file mode 100644 index 0000000000000..d13b6edbd768f --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/es_archives/security_alerts/mappings.json @@ -0,0 +1,8667 @@ +{ + "type": "index", + "value": { + "aliases": { + ".alerts-security.alerts-default": { + "is_write_index": true + }, + ".siem-signals-default": { + "is_write_index": false + } + }, + "index": ".internal.alerts-security.alerts-default-000001", + "mappings": { + "_meta": { + "kibana": { + "version": "9.0.0" + }, + "managed": true, + "namespace": "default" + }, + "dynamic": "false", + "properties": { + "@timestamp": { + "ignore_malformed": false, + "type": "date" + }, + "agent": { + "properties": { + "build": { + "properties": { + "original": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "client": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "cloud": { + "properties": { + "account": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "availability_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "instance": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "machine": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "origin": { + "properties": { + "account": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "availability_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "instance": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "machine": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "project": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "project": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "target": { + "properties": { + "account": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "availability_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "instance": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "machine": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "project": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "container": { + "properties": { + "cpu": { + "properties": { + "usage": { + "scaling_factor": 1000, + "type": "scaled_float" + } + } + }, + "disk": { + "properties": { + "read": { + "properties": { + "bytes": { + "type": "long" + } + } + }, + "write": { + "properties": { + "bytes": { + "type": "long" + } + } + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "image": { + "properties": { + "hash": { + "properties": { + "all": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "tag": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "labels": { + "type": "object" + }, + "memory": { + "properties": { + "usage": { + "scaling_factor": 1000, + "type": "scaled_float" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "network": { + "properties": { + "egress": { + "properties": { + "bytes": { + "type": "long" + } + } + }, + "ingress": { + "properties": { + "bytes": { + "type": "long" + } + } + } + } + }, + "runtime": { + "ignore_above": 1024, + "type": "keyword" + }, + "security_context": { + "properties": { + "privileged": { + "type": "boolean" + } + } + } + } + }, + "destination": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "device": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "manufacturer": { + "ignore_above": 1024, + "type": "keyword" + }, + "model": { + "properties": { + "identifier": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "dll": { + "properties": { + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + }, + "sections": { + "properties": { + "entropy": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "var_entropy": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + } + } + } + } + }, + "dns": { + "properties": { + "answers": { + "properties": { + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "ttl": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "header_flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "op_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "question": { + "properties": { + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "resolved_ip": { + "type": "ip" + }, + "response_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ecs": { + "properties": { + "version": { + "type": "keyword" + } + } + }, + "email": { + "properties": { + "attachments": { + "properties": { + "file": { + "properties": { + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + } + } + } + }, + "type": "nested" + }, + "bcc": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "cc": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "content_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "delivery_timestamp": { + "type": "date" + }, + "direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "from": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "local_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "message_id": { + "type": "wildcard" + }, + "origination_timestamp": { + "type": "date" + }, + "reply_to": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "sender": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "subject": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "to": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "x_mailer": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "error": { + "properties": { + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "message": { + "type": "match_only_text" + }, + "stack_trace": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "event": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "agent_id_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "created": { + "type": "date" + }, + "dataset": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration": { + "type": "long" + }, + "end": { + "type": "date" + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ingested": { + "type": "date" + }, + "kind": { + "ignore_above": 1024, + "type": "keyword" + }, + "module": { + "ignore_above": 1024, + "type": "keyword" + }, + "original": { + "ignore_above": 1024, + "type": "keyword" + }, + "outcome": { + "ignore_above": 1024, + "type": "keyword" + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk_score": { + "type": "float" + }, + "risk_score_norm": { + "type": "float" + }, + "sequence": { + "type": "long" + }, + "severity": { + "type": "long" + }, + "start": { + "type": "date" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "faas": { + "properties": { + "coldstart": { + "type": "boolean" + }, + "execution": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "file": { + "properties": { + "accessed": { + "type": "date" + }, + "attributes": { + "ignore_above": 1024, + "type": "keyword" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "created": { + "type": "date" + }, + "ctime": { + "type": "date" + }, + "device": { + "ignore_above": 1024, + "type": "keyword" + }, + "directory": { + "ignore_above": 1024, + "type": "keyword" + }, + "drive_letter": { + "ignore_above": 1, + "type": "keyword" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "var_entropy": { + "type": "long" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fork_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "gid": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "inode": { + "ignore_above": 1024, + "type": "keyword" + }, + "macho": { + "properties": { + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "sections": { + "properties": { + "entropy": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "var_entropy": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "symhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mtime": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + }, + "sections": { + "properties": { + "entropy": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "var_entropy": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + } + } + }, + "size": { + "type": "long" + }, + "target_path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "host": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "asset": { + "properties": { + "criticality": { + "type": "keyword" + } + } + }, + "boot": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "cpu": { + "properties": { + "usage": { + "scaling_factor": 1000, + "type": "scaled_float" + } + } + }, + "disk": { + "properties": { + "read": { + "properties": { + "bytes": { + "type": "long" + } + } + }, + "write": { + "properties": { + "bytes": { + "type": "long" + } + } + } + } + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "network": { + "properties": { + "egress": { + "properties": { + "bytes": { + "type": "long" + }, + "packets": { + "type": "long" + } + } + }, + "ingress": { + "properties": { + "bytes": { + "type": "long" + }, + "packets": { + "type": "long" + } + } + } + } + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pid_ns_ino": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk": { + "properties": { + "calculated_level": { + "ignore_above": 1024, + "type": "keyword" + }, + "calculated_score": { + "type": "float" + }, + "calculated_score_norm": { + "type": "float" + }, + "static_level": { + "ignore_above": 1024, + "type": "keyword" + }, + "static_score": { + "type": "float" + }, + "static_score_norm": { + "type": "float" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uptime": { + "type": "long" + } + } + }, + "http": { + "properties": { + "request": { + "properties": { + "body": { + "properties": { + "bytes": { + "type": "long" + }, + "content": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + } + } + }, + "bytes": { + "type": "long" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "referrer": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "response": { + "properties": { + "body": { + "properties": { + "bytes": { + "type": "long" + }, + "content": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + } + } + }, + "bytes": { + "type": "long" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "status_code": { + "type": "long" + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "kibana": { + "properties": { + "alert": { + "properties": { + "action_group": { + "type": "keyword" + }, + "ancestors": { + "properties": { + "depth": { + "type": "long" + }, + "id": { + "type": "keyword" + }, + "index": { + "type": "keyword" + }, + "rule": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + }, + "building_block_type": { + "type": "keyword" + }, + "case_ids": { + "type": "keyword" + }, + "consecutive_matches": { + "type": "long" + }, + "depth": { + "type": "long" + }, + "duration": { + "properties": { + "us": { + "type": "long" + } + } + }, + "end": { + "type": "date" + }, + "flapping": { + "type": "boolean" + }, + "flapping_history": { + "type": "boolean" + }, + "group": { + "properties": { + "id": { + "type": "keyword" + }, + "index": { + "type": "integer" + } + } + }, + "host": { + "properties": { + "criticality_level": { + "type": "keyword" + } + } + }, + "instance": { + "properties": { + "id": { + "type": "keyword" + } + } + }, + "intended_timestamp": { + "type": "date" + }, + "last_detected": { + "type": "date" + }, + "maintenance_window_ids": { + "type": "keyword" + }, + "new_terms": { + "type": "keyword" + }, + "original_event": { + "properties": { + "action": { + "ignore_above": 1024, + "type": "keyword" + }, + "agent_id_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "created": { + "type": "date" + }, + "dataset": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration": { + "ignore_above": 1024, + "type": "keyword" + }, + "end": { + "type": "date" + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ingested": { + "type": "date" + }, + "kind": { + "ignore_above": 1024, + "type": "keyword" + }, + "module": { + "ignore_above": 1024, + "type": "keyword" + }, + "original": { + "ignore_above": 1024, + "type": "keyword" + }, + "outcome": { + "ignore_above": 1024, + "type": "keyword" + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk_score": { + "type": "float" + }, + "risk_score_norm": { + "type": "float" + }, + "sequence": { + "type": "long" + }, + "severity": { + "type": "long" + }, + "start": { + "type": "date" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "original_time": { + "type": "date" + }, + "previous_action_group": { + "type": "keyword" + }, + "reason": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "keyword" + }, + "risk_score": { + "type": "float" + }, + "rule": { + "properties": { + "author": { + "type": "keyword" + }, + "building_block_type": { + "type": "keyword" + }, + "category": { + "type": "keyword" + }, + "consumer": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "created_by": { + "type": "keyword" + }, + "description": { + "type": "keyword" + }, + "enabled": { + "type": "keyword" + }, + "exceptions_list": { + "type": "object" + }, + "execution": { + "properties": { + "timestamp": { + "type": "date" + }, + "uuid": { + "type": "keyword" + } + } + }, + "false_positives": { + "type": "keyword" + }, + "from": { + "type": "keyword" + }, + "immutable": { + "type": "keyword" + }, + "interval": { + "type": "keyword" + }, + "license": { + "type": "keyword" + }, + "max_signals": { + "type": "long" + }, + "name": { + "type": "keyword" + }, + "note": { + "type": "keyword" + }, + "parameters": { + "ignore_above": 4096, + "type": "flattened" + }, + "producer": { + "type": "keyword" + }, + "references": { + "type": "keyword" + }, + "revision": { + "type": "long" + }, + "rule_id": { + "type": "keyword" + }, + "rule_name_override": { + "type": "keyword" + }, + "rule_type_id": { + "type": "keyword" + }, + "tags": { + "type": "keyword" + }, + "threat": { + "properties": { + "framework": { + "type": "keyword" + }, + "tactic": { + "properties": { + "id": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "reference": { + "type": "keyword" + } + } + }, + "technique": { + "properties": { + "id": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "reference": { + "type": "keyword" + }, + "subtechnique": { + "properties": { + "id": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "reference": { + "type": "keyword" + } + } + } + } + } + } + }, + "timeline_id": { + "type": "keyword" + }, + "timeline_title": { + "type": "keyword" + }, + "timestamp_override": { + "type": "keyword" + }, + "to": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + }, + "updated_by": { + "type": "keyword" + }, + "uuid": { + "type": "keyword" + }, + "version": { + "type": "keyword" + } + } + }, + "severity": { + "type": "keyword" + }, + "severity_improving": { + "type": "boolean" + }, + "start": { + "type": "date" + }, + "status": { + "type": "keyword" + }, + "suppression": { + "properties": { + "docs_count": { + "type": "long" + }, + "end": { + "type": "date" + }, + "start": { + "type": "date" + }, + "terms": { + "properties": { + "field": { + "type": "keyword" + }, + "value": { + "type": "keyword" + } + } + } + } + }, + "system_status": { + "type": "keyword" + }, + "threshold_result": { + "properties": { + "cardinality": { + "properties": { + "field": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + }, + "count": { + "type": "long" + }, + "from": { + "type": "date" + }, + "terms": { + "properties": { + "field": { + "type": "keyword" + }, + "value": { + "type": "keyword" + } + } + } + } + }, + "time_range": { + "format": "epoch_millis||strict_date_optional_time", + "type": "date_range" + }, + "url": { + "ignore_above": 2048, + "index": false, + "type": "keyword" + }, + "user": { + "properties": { + "criticality_level": { + "type": "keyword" + } + } + }, + "uuid": { + "type": "keyword" + }, + "workflow_assignee_ids": { + "type": "keyword" + }, + "workflow_reason": { + "type": "keyword" + }, + "workflow_status": { + "type": "keyword" + }, + "workflow_status_updated_at": { + "type": "date" + }, + "workflow_tags": { + "type": "keyword" + }, + "workflow_user": { + "type": "keyword" + } + } + }, + "space_ids": { + "type": "keyword" + }, + "version": { + "type": "version" + } + } + }, + "labels": { + "type": "object" + }, + "log": { + "properties": { + "file": { + "properties": { + "path": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "level": { + "ignore_above": 1024, + "type": "keyword" + }, + "logger": { + "ignore_above": 1024, + "type": "keyword" + }, + "origin": { + "properties": { + "file": { + "properties": { + "line": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "function": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "syslog": { + "properties": { + "appname": { + "ignore_above": 1024, + "type": "keyword" + }, + "facility": { + "properties": { + "code": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "msgid": { + "ignore_above": 1024, + "type": "keyword" + }, + "priority": { + "type": "long" + }, + "procid": { + "ignore_above": 1024, + "type": "keyword" + }, + "severity": { + "properties": { + "code": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "structured_data": { + "type": "flattened" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "message": { + "type": "match_only_text" + }, + "network": { + "properties": { + "application": { + "ignore_above": 1024, + "type": "keyword" + }, + "bytes": { + "type": "long" + }, + "community_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "forwarded_ip": { + "type": "ip" + }, + "iana_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "inner": { + "properties": { + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "packets": { + "type": "long" + }, + "protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "transport": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "observer": { + "properties": { + "egress": { + "properties": { + "interface": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "ingress": { + "properties": { + "interface": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "vendor": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "orchestrator": { + "properties": { + "api_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "cluster": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "namespace": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "resource": { + "properties": { + "annotation": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "label": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "parent": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "organization": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "package": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "build_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "checksum": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "install_scope": { + "ignore_above": 1024, + "type": "keyword" + }, + "installed": { + "type": "date" + }, + "license": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "process": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "var_entropy": { + "type": "long" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "end": { + "type": "date" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "entry_leader": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "attested_groups": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "attested_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "entry_meta": { + "properties": { + "source": { + "properties": { + "ip": { + "type": "ip" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "parent": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "session_leader": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "start": { + "type": "date" + }, + "vpid": { + "type": "long" + } + } + }, + "start": { + "type": "date" + }, + "vpid": { + "type": "long" + } + } + }, + "pid": { + "type": "long" + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "same_as_process": { + "type": "boolean" + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + } + } + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vpid": { + "type": "long" + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "env_vars": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "exit_code": { + "type": "long" + }, + "group_leader": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "same_as_process": { + "type": "boolean" + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + } + } + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vpid": { + "type": "long" + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "io": { + "properties": { + "bytes_skipped": { + "properties": { + "length": { + "type": "long" + }, + "offset": { + "type": "long" + } + } + }, + "max_bytes_per_process_exceeded": { + "type": "boolean" + }, + "text": { + "type": "wildcard" + }, + "total_bytes_captured": { + "type": "long" + }, + "total_bytes_skipped": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "macho": { + "properties": { + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "sections": { + "properties": { + "entropy": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "var_entropy": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "symhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "parent": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "var_entropy": { + "type": "long" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "end": { + "type": "date" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "exit_code": { + "type": "long" + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "group_leader": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "start": { + "type": "date" + }, + "vpid": { + "type": "long" + } + } + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "macho": { + "properties": { + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "sections": { + "properties": { + "entropy": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "var_entropy": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "symhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + }, + "sections": { + "properties": { + "entropy": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "var_entropy": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + } + } + }, + "pgid": { + "type": "long" + }, + "pid": { + "type": "long" + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "thread": { + "properties": { + "capabilities": { + "properties": { + "effective": { + "ignore_above": 1024, + "type": "keyword" + }, + "permitted": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "title": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + } + } + }, + "uptime": { + "type": "long" + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vpid": { + "type": "long" + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + }, + "sections": { + "properties": { + "entropy": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "var_entropy": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + } + } + }, + "pgid": { + "type": "long" + }, + "pid": { + "type": "long" + }, + "previous": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "session_leader": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "parent": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "session_leader": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "start": { + "type": "date" + }, + "vpid": { + "type": "long" + } + } + }, + "start": { + "type": "date" + }, + "vpid": { + "type": "long" + } + } + }, + "pid": { + "type": "long" + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "same_as_process": { + "type": "boolean" + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + } + } + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vpid": { + "type": "long" + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "thread": { + "properties": { + "capabilities": { + "properties": { + "effective": { + "ignore_above": 1024, + "type": "keyword" + }, + "permitted": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "id": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "title": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + }, + "columns": { + "type": "long" + }, + "rows": { + "type": "long" + } + } + }, + "uptime": { + "type": "long" + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vpid": { + "type": "long" + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "registry": { + "properties": { + "data": { + "properties": { + "bytes": { + "ignore_above": 1024, + "type": "keyword" + }, + "strings": { + "type": "wildcard" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hive": { + "ignore_above": 1024, + "type": "keyword" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "related": { + "properties": { + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "hosts": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "user": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "rule": { + "properties": { + "author": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "license": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "ruleset": { + "ignore_above": 1024, + "type": "keyword" + }, + "uuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "server": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "service": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "environment": { + "ignore_above": 1024, + "type": "keyword" + }, + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "role": { + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "origin": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "environment": { + "ignore_above": 1024, + "type": "keyword" + }, + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "role": { + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "target": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "environment": { + "ignore_above": 1024, + "type": "keyword" + }, + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "role": { + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "signal": { + "properties": { + "ancestors": { + "properties": { + "depth": { + "path": "kibana.alert.ancestors.depth", + "type": "alias" + }, + "id": { + "path": "kibana.alert.ancestors.id", + "type": "alias" + }, + "index": { + "path": "kibana.alert.ancestors.index", + "type": "alias" + }, + "type": { + "path": "kibana.alert.ancestors.type", + "type": "alias" + } + } + }, + "depth": { + "path": "kibana.alert.depth", + "type": "alias" + }, + "group": { + "properties": { + "id": { + "path": "kibana.alert.group.id", + "type": "alias" + }, + "index": { + "path": "kibana.alert.group.index", + "type": "alias" + } + } + }, + "original_event": { + "properties": { + "action": { + "path": "kibana.alert.original_event.action", + "type": "alias" + }, + "category": { + "path": "kibana.alert.original_event.category", + "type": "alias" + }, + "code": { + "path": "kibana.alert.original_event.code", + "type": "alias" + }, + "created": { + "path": "kibana.alert.original_event.created", + "type": "alias" + }, + "dataset": { + "path": "kibana.alert.original_event.dataset", + "type": "alias" + }, + "duration": { + "path": "kibana.alert.original_event.duration", + "type": "alias" + }, + "end": { + "path": "kibana.alert.original_event.end", + "type": "alias" + }, + "hash": { + "path": "kibana.alert.original_event.hash", + "type": "alias" + }, + "id": { + "path": "kibana.alert.original_event.id", + "type": "alias" + }, + "kind": { + "path": "kibana.alert.original_event.kind", + "type": "alias" + }, + "module": { + "path": "kibana.alert.original_event.module", + "type": "alias" + }, + "outcome": { + "path": "kibana.alert.original_event.outcome", + "type": "alias" + }, + "provider": { + "path": "kibana.alert.original_event.provider", + "type": "alias" + }, + "reason": { + "path": "kibana.alert.original_event.reason", + "type": "alias" + }, + "risk_score": { + "path": "kibana.alert.original_event.risk_score", + "type": "alias" + }, + "risk_score_norm": { + "path": "kibana.alert.original_event.risk_score_norm", + "type": "alias" + }, + "sequence": { + "path": "kibana.alert.original_event.sequence", + "type": "alias" + }, + "severity": { + "path": "kibana.alert.original_event.severity", + "type": "alias" + }, + "start": { + "path": "kibana.alert.original_event.start", + "type": "alias" + }, + "timezone": { + "path": "kibana.alert.original_event.timezone", + "type": "alias" + }, + "type": { + "path": "kibana.alert.original_event.type", + "type": "alias" + } + } + }, + "original_time": { + "path": "kibana.alert.original_time", + "type": "alias" + }, + "reason": { + "path": "kibana.alert.reason", + "type": "alias" + }, + "rule": { + "properties": { + "author": { + "path": "kibana.alert.rule.author", + "type": "alias" + }, + "building_block_type": { + "path": "kibana.alert.building_block_type", + "type": "alias" + }, + "created_at": { + "path": "kibana.alert.rule.created_at", + "type": "alias" + }, + "created_by": { + "path": "kibana.alert.rule.created_by", + "type": "alias" + }, + "description": { + "path": "kibana.alert.rule.description", + "type": "alias" + }, + "enabled": { + "path": "kibana.alert.rule.enabled", + "type": "alias" + }, + "false_positives": { + "path": "kibana.alert.rule.false_positives", + "type": "alias" + }, + "from": { + "path": "kibana.alert.rule.from", + "type": "alias" + }, + "id": { + "path": "kibana.alert.rule.uuid", + "type": "alias" + }, + "immutable": { + "path": "kibana.alert.rule.immutable", + "type": "alias" + }, + "interval": { + "path": "kibana.alert.rule.interval", + "type": "alias" + }, + "license": { + "path": "kibana.alert.rule.license", + "type": "alias" + }, + "max_signals": { + "path": "kibana.alert.rule.max_signals", + "type": "alias" + }, + "name": { + "path": "kibana.alert.rule.name", + "type": "alias" + }, + "note": { + "path": "kibana.alert.rule.note", + "type": "alias" + }, + "references": { + "path": "kibana.alert.rule.references", + "type": "alias" + }, + "risk_score": { + "path": "kibana.alert.risk_score", + "type": "alias" + }, + "rule_id": { + "path": "kibana.alert.rule.rule_id", + "type": "alias" + }, + "rule_name_override": { + "path": "kibana.alert.rule.rule_name_override", + "type": "alias" + }, + "severity": { + "path": "kibana.alert.severity", + "type": "alias" + }, + "tags": { + "path": "kibana.alert.rule.tags", + "type": "alias" + }, + "threat": { + "properties": { + "framework": { + "path": "kibana.alert.rule.threat.framework", + "type": "alias" + }, + "tactic": { + "properties": { + "id": { + "path": "kibana.alert.rule.threat.tactic.id", + "type": "alias" + }, + "name": { + "path": "kibana.alert.rule.threat.tactic.name", + "type": "alias" + }, + "reference": { + "path": "kibana.alert.rule.threat.tactic.reference", + "type": "alias" + } + } + }, + "technique": { + "properties": { + "id": { + "path": "kibana.alert.rule.threat.technique.id", + "type": "alias" + }, + "name": { + "path": "kibana.alert.rule.threat.technique.name", + "type": "alias" + }, + "reference": { + "path": "kibana.alert.rule.threat.technique.reference", + "type": "alias" + }, + "subtechnique": { + "properties": { + "id": { + "path": "kibana.alert.rule.threat.technique.subtechnique.id", + "type": "alias" + }, + "name": { + "path": "kibana.alert.rule.threat.technique.subtechnique.name", + "type": "alias" + }, + "reference": { + "path": "kibana.alert.rule.threat.technique.subtechnique.reference", + "type": "alias" + } + } + } + } + } + } + }, + "timeline_id": { + "path": "kibana.alert.rule.timeline_id", + "type": "alias" + }, + "timeline_title": { + "path": "kibana.alert.rule.timeline_title", + "type": "alias" + }, + "timestamp_override": { + "path": "kibana.alert.rule.timestamp_override", + "type": "alias" + }, + "to": { + "path": "kibana.alert.rule.to", + "type": "alias" + }, + "type": { + "path": "kibana.alert.rule.type", + "type": "alias" + }, + "updated_at": { + "path": "kibana.alert.rule.updated_at", + "type": "alias" + }, + "updated_by": { + "path": "kibana.alert.rule.updated_by", + "type": "alias" + }, + "version": { + "path": "kibana.alert.rule.version", + "type": "alias" + } + } + }, + "status": { + "path": "kibana.alert.workflow_status", + "type": "alias" + }, + "threshold_result": { + "properties": { + "cardinality": { + "properties": { + "field": { + "path": "kibana.alert.threshold_result.cardinality.field", + "type": "alias" + }, + "value": { + "path": "kibana.alert.threshold_result.cardinality.value", + "type": "alias" + } + } + }, + "count": { + "path": "kibana.alert.threshold_result.count", + "type": "alias" + }, + "from": { + "path": "kibana.alert.threshold_result.from", + "type": "alias" + }, + "terms": { + "properties": { + "field": { + "path": "kibana.alert.threshold_result.terms.field", + "type": "alias" + }, + "value": { + "path": "kibana.alert.threshold_result.terms.value", + "type": "alias" + } + } + } + } + } + } + }, + "source": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "span": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tags": { + "type": "keyword" + }, + "threat": { + "properties": { + "enrichments": { + "properties": { + "indicator": { + "properties": { + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "confidence": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "file": { + "properties": { + "accessed": { + "type": "date" + }, + "attributes": { + "ignore_above": 1024, + "type": "keyword" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "created": { + "type": "date" + }, + "ctime": { + "type": "date" + }, + "device": { + "ignore_above": 1024, + "type": "keyword" + }, + "directory": { + "ignore_above": 1024, + "type": "keyword" + }, + "drive_letter": { + "ignore_above": 1, + "type": "keyword" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "var_entropy": { + "type": "long" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fork_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "gid": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "inode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mtime": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + }, + "sections": { + "properties": { + "entropy": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "var_entropy": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + } + } + }, + "size": { + "type": "long" + }, + "target_path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "first_seen": { + "type": "date" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "last_seen": { + "type": "date" + }, + "marking": { + "properties": { + "tlp": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlp_version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "modified_at": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "port": { + "type": "long" + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "registry": { + "properties": { + "data": { + "properties": { + "bytes": { + "ignore_above": 1024, + "type": "keyword" + }, + "strings": { + "type": "wildcard" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hive": { + "ignore_above": 1024, + "type": "keyword" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "scanner_stats": { + "type": "long" + }, + "sightings": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fragment": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "original": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "type": "wildcard" + }, + "port": { + "type": "long" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "scheme": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "matched": { + "properties": { + "atomic": { + "ignore_above": 1024, + "type": "keyword" + }, + "field": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "index": { + "ignore_above": 1024, + "type": "keyword" + }, + "occurred": { + "type": "date" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + }, + "type": "nested" + }, + "feed": { + "properties": { + "dashboard_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "framework": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "indicator": { + "properties": { + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "confidence": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "file": { + "properties": { + "accessed": { + "type": "date" + }, + "attributes": { + "ignore_above": 1024, + "type": "keyword" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "created": { + "type": "date" + }, + "ctime": { + "type": "date" + }, + "device": { + "ignore_above": 1024, + "type": "keyword" + }, + "directory": { + "ignore_above": 1024, + "type": "keyword" + }, + "drive_letter": { + "ignore_above": 1, + "type": "keyword" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "var_entropy": { + "type": "long" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fork_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "gid": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "inode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mtime": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "go_imports": { + "type": "flattened" + }, + "go_imports_names_entropy": { + "type": "long" + }, + "go_imports_names_var_entropy": { + "type": "long" + }, + "go_stripped": { + "type": "boolean" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "import_hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "imports": { + "type": "flattened" + }, + "imports_names_entropy": { + "type": "long" + }, + "imports_names_var_entropy": { + "type": "long" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + }, + "sections": { + "properties": { + "entropy": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "var_entropy": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + } + } + }, + "size": { + "type": "long" + }, + "target_path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "first_seen": { + "type": "date" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "last_seen": { + "type": "date" + }, + "marking": { + "properties": { + "tlp": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlp_version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "modified_at": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "port": { + "type": "long" + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "registry": { + "properties": { + "data": { + "properties": { + "bytes": { + "ignore_above": 1024, + "type": "keyword" + }, + "strings": { + "type": "wildcard" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hive": { + "ignore_above": 1024, + "type": "keyword" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "scanner_stats": { + "type": "long" + }, + "sightings": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fragment": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "original": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "type": "wildcard" + }, + "port": { + "type": "long" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "scheme": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "software": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "platforms": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tactic": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "technique": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "subtechnique": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "tls": { + "properties": { + "cipher": { + "ignore_above": 1024, + "type": "keyword" + }, + "client": { + "properties": { + "certificate": { + "ignore_above": 1024, + "type": "keyword" + }, + "certificate_chain": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "issuer": { + "ignore_above": 1024, + "type": "keyword" + }, + "ja3": { + "ignore_above": 1024, + "type": "keyword" + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "server_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "supported_ciphers": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "established": { + "type": "boolean" + }, + "next_protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "resumed": { + "type": "boolean" + }, + "server": { + "properties": { + "certificate": { + "ignore_above": 1024, + "type": "keyword" + }, + "certificate_chain": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "issuer": { + "ignore_above": 1024, + "type": "keyword" + }, + "ja3s": { + "ignore_above": 1024, + "type": "keyword" + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + }, + "version_protocol": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "trace": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "transaction": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "url": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fragment": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "original": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "type": "wildcard" + }, + "port": { + "type": "long" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "scheme": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "user": { + "properties": { + "asset": { + "properties": { + "criticality": { + "type": "keyword" + } + } + }, + "changes": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "effective": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "risk": { + "properties": { + "calculated_level": { + "ignore_above": 1024, + "type": "keyword" + }, + "calculated_score": { + "type": "float" + }, + "calculated_score_norm": { + "type": "float" + }, + "static_level": { + "ignore_above": 1024, + "type": "keyword" + }, + "static_score": { + "type": "float" + }, + "static_score_norm": { + "type": "float" + } + } + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + }, + "target": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "user_agent": { + "properties": { + "device": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "original": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vulnerability": { + "properties": { + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "classification": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "enumeration": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "report_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "scanner": { + "properties": { + "vendor": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "score": { + "properties": { + "base": { + "type": "float" + }, + "environmental": { + "type": "float" + }, + "temporal": { + "type": "float" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "severity": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "settings": { + "index": { + "auto_expand_replicas": "0-1", + "hidden": "true", + "lifecycle": { + "name": ".alerts-ilm-policy", + "rollover_alias": ".alerts-security.alerts-default" + }, + "mapping": { + "ignore_malformed": "true", + "total_fields": { + "limit": "2500" + } + }, + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/alerts_page.ts b/x-pack/test/cloud_security_posture_functional/page_objects/alerts_page.ts new file mode 100644 index 0000000000000..f3a9f7b1448a8 --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/page_objects/alerts_page.ts @@ -0,0 +1,107 @@ +/* + * 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 { FtrService } from '../../functional/ftr_provider_context'; + +const ALERT_TABLE_ROW_CSS_SELECTOR = '[data-test-subj="alertsTable"] .euiDataGridRow'; +const VISUALIZATIONS_SECTION_HEADER_TEST_ID = 'securitySolutionFlyoutVisualizationsHeader'; +const GRAPH_PREVIEW_TEST_ID = 'securitySolutionFlyoutGraphPreview'; +const GRAPH_PREVIEW_LOADING_TEST_ID = 'securitySolutionFlyoutGraphPreviewLoading'; + +export class AlertsPageObject extends FtrService { + private readonly retry = this.ctx.getService('retry'); + private readonly pageObjects = this.ctx.getPageObjects(['common', 'header']); + private readonly testSubjects = this.ctx.getService('testSubjects'); + private readonly defaultTimeoutMs = this.ctx.getService('config').get('timeouts.waitFor'); + + async navigateToAlertsPage(urlQueryParams: string = ''): Promise { + await this.pageObjects.common.navigateToUrlWithBrowserHistory( + 'securitySolution', + '/alerts', + `${urlQueryParams && `?${urlQueryParams}`}`, + { + ensureCurrentUrl: false, + } + ); + await this.pageObjects.header.waitUntilLoadingHasFinished(); + } + + getAbsoluteTimerangeFilter(from: string, to: string) { + return `timerange=(global:(linkTo:!(),timerange:(from:%27${from}%27,kind:absolute,to:%27${to}%27)))`; + } + + getFlyoutFilter(alertId: string) { + return `flyout=(preview:!(),right:(id:document-details-right,params:(id:%27${alertId}%27,indexName:.internal.alerts-security.alerts-default-000001,scopeId:alerts-page)))`; + } + + /** + * Clicks the refresh button on the Alerts page and waits for it to complete + */ + async clickRefresh(): Promise { + await this.ensureOnAlertsPage(); + await this.testSubjects.click('querySubmitButton'); + + // wait for refresh to complete + await this.retry.waitFor( + 'Alerts pages refresh button to be enabled', + async (): Promise => { + const refreshButton = await this.testSubjects.find('querySubmitButton'); + + return (await refreshButton.isDisplayed()) && (await refreshButton.isEnabled()); + } + ); + } + + async ensureOnAlertsPage(): Promise { + await this.testSubjects.existOrFail('detectionsAlertsPage'); + } + + async waitForListToHaveAlerts(timeoutMs?: number): Promise { + const allEventRows = await this.testSubjects.findService.allByCssSelector( + ALERT_TABLE_ROW_CSS_SELECTOR + ); + + if (!Boolean(allEventRows.length)) { + await this.retry.waitForWithTimeout( + 'waiting for alerts to show up on alerts page', + timeoutMs ?? this.defaultTimeoutMs, + async (): Promise => { + await this.clickRefresh(); + + const allEventRowsInner = await this.testSubjects.findService.allByCssSelector( + ALERT_TABLE_ROW_CSS_SELECTOR + ); + + return Boolean(allEventRowsInner.length); + } + ); + } + } + + flyout = { + expandVisualizations: async (): Promise => { + await this.testSubjects.click(VISUALIZATIONS_SECTION_HEADER_TEST_ID); + }, + + assertGraphPreviewVisible: async () => { + return await this.testSubjects.existOrFail(GRAPH_PREVIEW_TEST_ID); + }, + + assertGraphNodesNumber: async (expected: number) => { + await this.flyout.waitGraphIsLoaded(); + const graph = await this.testSubjects.find(GRAPH_PREVIEW_TEST_ID); + await graph.scrollIntoView(); + const nodes = await graph.findAllByCssSelector('.react-flow__nodes .react-flow__node'); + expect(nodes.length).to.be(expected); + }, + + waitGraphIsLoaded: async () => { + await this.testSubjects.missingOrFail(GRAPH_PREVIEW_LOADING_TEST_ID, { timeout: 10000 }); + }, + }; +} diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/index.ts b/x-pack/test/cloud_security_posture_functional/page_objects/index.ts index 704f6310cdbb2..b7c20632e82f5 100644 --- a/x-pack/test/cloud_security_posture_functional/page_objects/index.ts +++ b/x-pack/test/cloud_security_posture_functional/page_objects/index.ts @@ -13,8 +13,10 @@ import { VulnerabilityDashboardPageProvider } from './vulnerability_dashboard_pa import { BenchmarkPagePageProvider } from './benchmark_page'; import { CspSecurityCommonProvider } from './security_common'; import { RulePagePageProvider } from './rule_page'; +import { AlertsPageObject } from './alerts_page'; export const cloudSecurityPosturePageObjects = { + alerts: AlertsPageObject, findings: FindingsPageProvider, cloudPostureDashboard: CspDashboardPageProvider, cisAddIntegration: AddCisIntegrationFormPageProvider, diff --git a/x-pack/test/cloud_security_posture_functional/pages/alerts_flyout.ts b/x-pack/test/cloud_security_posture_functional/pages/alerts_flyout.ts new file mode 100644 index 0000000000000..3095f6a663968 --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/pages/alerts_flyout.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 { waitForPluginInitialized } from '../../cloud_security_posture_api/utils'; +import type { FtrProviderContext } from '../ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const retry = getService('retry'); + const logger = getService('log'); + const supertest = getService('supertest'); + const esArchiver = getService('esArchiver'); + const pageObjects = getPageObjects(['common', 'header', 'alerts']); + const alertsPage = pageObjects.alerts; + + describe('Security Alerts Page - Graph visualization', function () { + this.tags(['cloud_security_posture_graph_viz']); + + before(async () => { + await esArchiver.load( + 'x-pack/test/cloud_security_posture_functional/es_archives/security_alerts' + ); + await esArchiver.load( + 'x-pack/test/cloud_security_posture_functional/es_archives/logs_gcp_audit' + ); + + await waitForPluginInitialized({ retry, supertest, logger }); + + // Setting the timerange to fit the data and open the flyout for a specific alert + await alertsPage.navigateToAlertsPage( + `${alertsPage.getAbsoluteTimerangeFilter( + '2024-10-13T00:00:00.000Z', + '2024-10-14T00:00:00.000Z' + )}&${alertsPage.getFlyoutFilter( + '589e086d7ceec7d4b353340578bd607e96fbac7eab9e2926f110990be15122f1' + )}` + ); + + await alertsPage.waitForListToHaveAlerts(); + + await alertsPage.flyout.expandVisualizations(); + }); + + after(async () => { + await esArchiver.unload( + 'x-pack/test/cloud_security_posture_functional/es_archives/security_alerts' + ); + await esArchiver.unload( + 'x-pack/test/cloud_security_posture_functional/es_archives/logs_gcp_audit' + ); + }); + + it('should render graph visualization', async () => { + await alertsPage.flyout.assertGraphPreviewVisible(); + await alertsPage.flyout.assertGraphNodesNumber(3); + }); + }); +} 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 1edf38dc41ec9..0114b6a8ce4dc 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/index.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/index.ts @@ -36,5 +36,6 @@ export default function ({ getPageObjects, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./vulnerabilities')); loadTestFile(require.resolve('./vulnerabilities_grouping')); loadTestFile(require.resolve('./benchmark')); + loadTestFile(require.resolve('./alerts_flyout')); }); } From 3b05b6a7a83df7ff8b929dbbb60c639cc11101d8 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Fri, 25 Oct 2024 16:33:26 +0200 Subject: [PATCH 030/135] [Synthetics] URL validation softens to allow vars usage !! (#197797) ## Summary URL validation softens to allow vars usage !! For example ` should urls: "${url}" interpolate --params '{"url": "my-url"}'` --- .../project_monitor/normalizers/common_fields.test.ts | 8 ++++++++ .../project_monitor/normalizers/common_fields.ts | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.test.ts b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.test.ts index b4dd34952c7a8..227fff690af53 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.test.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.test.ts @@ -21,6 +21,14 @@ describe('isValidUrl', () => { it('returns true for valid URL', () => { expect(isValidURL('https://elastic.co')).toBeTruthy(); }); + + it('returns skips validation vars', () => { + expect(isValidURL('${urlParam}')).toBeTruthy(); + }); + + it('returns skips validation vars with http', () => { + expect(isValidURL('http://${urlParam}')).toBeTruthy(); + }); }); describe('getUrlsField', () => { diff --git a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.ts b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.ts index 0a3aa8295a94d..c67e7decbe984 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.ts @@ -8,6 +8,7 @@ import { omit, uniqBy } from 'lodash'; import { i18n } from '@kbn/i18n'; import { isValidNamespace } from '@kbn/fleet-plugin/common'; +import { hasNoParams } from '../../formatters/formatting_utils'; import { formatLocation } from '../../../../common/utils/location_formatter'; import { BrowserFields, @@ -408,6 +409,10 @@ export const getOptionalListField = (value?: string[] | string): string[] => { * @returns `true` if `new URL` does not throw an error, `false` otherwise */ export const isValidURL = (url: string): boolean => { + if (!hasNoParams(url)) { + // this is done to avoid parsing urls with variables + return true; + } try { new URL(url); return true; From 8f0f0a4f2bdb078b8b462144956ef6502ef526ca Mon Sep 17 00:00:00 2001 From: Luke Gmys <11671118+lgestc@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:45:38 +0200 Subject: [PATCH 031/135] enable skipped timeline sourcerer tests (#196827) This PR re-enables a test skipped earlier https://github.com/elastic/kibana/issues/173854 and https://github.com/elastic/kibana/issues/183104 Flaky test run: https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7226 --- .../sourcerer/create_runtime_field.cy.ts | 18 ++++++++++-------- .../sourcerer/sourcerer_timeline.cy.ts | 3 +-- .../cypress/screens/timeline.ts | 7 +++---- .../cypress/tasks/timeline.ts | 14 ++++++++++++++ 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/create_runtime_field.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/create_runtime_field.cy.ts index a96762e530bdb..b8a7bed3c22b9 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/create_runtime_field.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/create_runtime_field.cy.ts @@ -8,7 +8,10 @@ import { login } from '../../../tasks/login'; import { visitWithTimeRange } from '../../../tasks/navigation'; import { openTimelineUsingToggle } from '../../../tasks/security_main'; -import { openTimelineFieldsBrowser, populateTimeline } from '../../../tasks/timeline'; +import { + createRuntimeFieldFromTimelne as createRuntimeFieldFromTimeline, + populateTimeline, +} from '../../../tasks/timeline'; import { hostsUrl, ALERTS_URL } from '../../../urls/navigation'; @@ -20,14 +23,13 @@ import { waitForAlertsToPopulate } from '../../../tasks/create_new_rule'; import { createField } from '../../../tasks/create_runtime_field'; import { openAlertsFieldBrowser } from '../../../tasks/alerts'; import { GET_DATA_GRID_HEADER } from '../../../screens/common/data_grid'; -import { GET_TIMELINE_HEADER } from '../../../screens/timeline'; import { deleteRuntimeField } from '../../../tasks/api_calls/sourcerer'; +import { SAVE_FIELD_BUTTON } from '../../../screens/create_runtime_field'; const alertRunTimeField = 'field.name.alert.page'; const timelineRuntimeField = 'field.name.timeline'; -// FLAKY: https://github.com/elastic/kibana/issues/183104 -describe.skip('Create DataView runtime field', { tags: ['@ess', '@serverless'] }, () => { +describe('Create DataView runtime field', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); deleteRuntimeField('security-solution-default', alertRunTimeField); @@ -48,9 +50,9 @@ describe.skip('Create DataView runtime field', { tags: ['@ess', '@serverless'] } visitWithTimeRange(hostsUrl('allHosts')); openTimelineUsingToggle(); populateTimeline(); - openTimelineFieldsBrowser(); - - createField(timelineRuntimeField); - cy.get(GET_TIMELINE_HEADER(timelineRuntimeField)).should('exist'); + createRuntimeFieldFromTimeline(timelineRuntimeField); + // NOTE: the field creation dialog should be closed now + // meaning that the field creation has been successful + cy.get(SAVE_FIELD_BUTTON).should('not.exist'); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/sourcerer_timeline.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/sourcerer_timeline.cy.ts index bb4010a6db4f6..9d2e1ac2e11a5 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/sourcerer_timeline.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/sourcerer/sourcerer_timeline.cy.ts @@ -62,8 +62,7 @@ describe('Timeline scope', { tags: ['@ess', '@serverless', '@skipInServerless'] isNotSourcererOption(`${DEFAULT_ALERTS_INDEX}-default`); }); - // FLAKY: https://github.com/elastic/kibana/issues/173854 - describe.skip('Modified badge', () => { + describe('Modified badge', () => { it('Selecting new data view does not add a modified badge', () => { openTimelineUsingToggle(); cy.get(SOURCERER.badgeModified).should(`not.exist`); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts b/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts index 96bd20dbd29dc..3398345bcd1fd 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts @@ -166,6 +166,9 @@ export const TIMELINE_EVENTS_COUNT_PREV_PAGE = export const TIMELINE_FIELDS_BUTTON = '[data-test-subj="timeline"] [data-test-subj="show-field-browser"]'; +export const TIMELINE_DISCOVER_FIELDS_BUTTON = + '[data-test-subj="timeline"] [data-test-subj="dataView-add-field_btn"]'; + export const TIMELINE_FILTER = (filter: TimelineFilter) => `[data-test-subj~="filter"][data-test-subj~="filter-enabled"][data-test-subj~="filter-key-${ filter.field @@ -298,10 +301,6 @@ export const HOVER_ACTIONS = { export const TIMELINE_FILTER_BADGE_ENABLED = '[data-test-subj~="filter-enabled"]'; -export const GET_TIMELINE_HEADER = (fieldName: string) => { - return `[data-test-subj="timeline"] [data-test-subj="header-text-${fieldName}"]`; -}; - export const ESQL_TAB = getDataTestSubjectSelector('timelineTabs-esql'); export const TIMELINE_DATE_PICKER_CONTAINER = getDataTestSubjectSelector( diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts b/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts index 9f37436d69bf6..7d66243071d9d 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts @@ -91,6 +91,7 @@ import { TIMELINE_FLYOUT, TIMELINE_FULL_SCREEN_BUTTON, QUERY_EVENT_COUNT, + TIMELINE_DISCOVER_FIELDS_BUTTON, } from '../screens/timeline'; import { REFRESH_BUTTON, TIMELINE, TIMELINES_TAB_TEMPLATE } from '../screens/timelines'; @@ -98,6 +99,7 @@ import { drag, drop, waitForTabToBeLoaded } from './common'; import { closeFieldsBrowser, filterFieldsBrowser } from './fields_browser'; import { TIMELINE_CONTEXT_MENU_BTN } from '../screens/alerts'; +import { RUNTIME_FIELD_INPUT, SAVE_FIELD_BUTTON } from '../screens/create_runtime_field'; const hostExistsQuery = 'host.name: *'; @@ -381,6 +383,18 @@ export const openTimelineFieldsBrowser = () => { cy.get(TIMELINE_FIELDS_BUTTON).first().click(); }; +export const openTimelineDiscoverAddField = () => { + cy.get(TIMELINE_DISCOVER_FIELDS_BUTTON).first().click(); +}; + +export const createRuntimeFieldFromTimelne = ( + fieldName: string +): Cypress.Chainable> => { + openTimelineDiscoverAddField(); + cy.get(RUNTIME_FIELD_INPUT).type(fieldName); + return cy.get(SAVE_FIELD_BUTTON).click(); +}; + export const openTimelineInspectButton = () => { cy.get(TIMELINE_INSPECT_BUTTON).should('not.be.disabled'); cy.get(TIMELINE_INSPECT_BUTTON).click(); From b8dabb5b81087f53e17f715ea19a17d50cc64167 Mon Sep 17 00:00:00 2001 From: jennypavlova Date: Fri, 25 Oct 2024 16:48:00 +0200 Subject: [PATCH 032/135] [ObsUx][Infra] Processes Tab: Fix failling test (#197823) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #192891 ## Summary This PR fixes the processes tab failing test. I checked locally and it passed. ✅ Flaky test runner (x50): https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7264 --- x-pack/test/functional/apps/infra/node_details.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/x-pack/test/functional/apps/infra/node_details.ts b/x-pack/test/functional/apps/infra/node_details.ts index afacc8d63c3e3..0f1de8cb9c8bf 100644 --- a/x-pack/test/functional/apps/infra/node_details.ts +++ b/x-pack/test/functional/apps/infra/node_details.ts @@ -404,8 +404,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.assetDetails.clickProcessesTab(); const processesTotalValue = await pageObjects.assetDetails.getProcessesTabContentTotalValue(); - const processValue = await processesTotalValue.getVisibleText(); - expect(processValue).to.eql('N/A'); + await retry.tryForTime(5000, async () => { + expect(await processesTotalValue.getVisibleText()).to.eql('N/A'); + }); }); }); }); @@ -510,8 +511,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should render processes tab and with Total Value summary', async () => { const processesTotalValue = await pageObjects.assetDetails.getProcessesTabContentTotalValue(); - const processValue = await processesTotalValue.getVisibleText(); - expect(processValue).to.eql('313'); + await retry.tryForTime(5000, async () => { + expect(await processesTotalValue.getVisibleText()).to.eql('313'); + }); }); it('should expand processes table row', async () => { From 7d673b84c3ecec2f6da81b57196301c6e7fe384a Mon Sep 17 00:00:00 2001 From: Irene Blanco Date: Fri, 25 Oct 2024 16:49:49 +0200 Subject: [PATCH 033/135] [Entity Inventory] Add basic telemetry (#197055) ## Summary Closes https://github.com/elastic/kibana/issues/195608. In this PR, we introduce basic telemetry tracking for the new Inventory plugin. These events will help us gain insight into how users are interacting with the Inventory feature, including the state of the views, search behaviors, and entity type filtering. **New events** - Entity Inventory Viewed - Entity Inventory Search Query Submitted - Entity Inventory Entity Type Filtered - Entity View Clicked ![Untitled-2024-07-24-1420](https://github.com/user-attachments/assets/6e85ea00-c626-4bc1-a4f8-9907674eb264) ~**New attribute added to global context**~ - ~eem_enabled~ ~It will only be populated if the Inventory plugin is accessible to users and after they access the Observability solution. If EEM is not enabled and the user enables it, the property will be updated accordingly.~ Details about not implementing `eem_enabled` can be found in [this comment](https://github.com/elastic/kibana/pull/197055#issuecomment-2432123047). --- .../.storybook/get_mock_inventory_context.tsx | 2 +- .../entities_grid/entity_name/index.tsx | 22 +++- .../public/components/entities_grid/index.tsx | 3 +- .../inventory_page_template/index.tsx | 22 +++- .../public/components/search_bar/index.tsx | 43 ++++++- .../hooks/use_is_loading_complete.test.ts | 109 ++++++++++++++++++ .../public/hooks/use_is_loading_complete.ts | 29 +++++ .../inventory/public/plugin.ts | 11 +- .../services/telemetry/telemetry_client.ts | 31 ++++- .../services/telemetry/telemetry_events.ts | 92 ++++++++++++++- .../telemetry/telemetry_service.test.ts | 98 +++++++++++++++- .../services/telemetry/telemetry_service.ts | 4 +- .../public/services/telemetry/types.ts | 42 ++++++- .../inventory/public/services/types.ts | 2 +- .../get_kql_field_names_with_fallback.test.ts | 44 +++++++ .../get_kql_field_names_with_fallback.ts | 16 +++ 16 files changed, 549 insertions(+), 21 deletions(-) create mode 100644 x-pack/plugins/observability_solution/inventory/public/hooks/use_is_loading_complete.test.ts create mode 100644 x-pack/plugins/observability_solution/inventory/public/hooks/use_is_loading_complete.ts create mode 100644 x-pack/plugins/observability_solution/inventory/public/utils/get_kql_field_names_with_fallback.test.ts create mode 100644 x-pack/plugins/observability_solution/inventory/public/utils/get_kql_field_names_with_fallback.ts diff --git a/x-pack/plugins/observability_solution/inventory/.storybook/get_mock_inventory_context.tsx b/x-pack/plugins/observability_solution/inventory/.storybook/get_mock_inventory_context.tsx index 9c2ea13cf753e..d3d28fe040198 100644 --- a/x-pack/plugins/observability_solution/inventory/.storybook/get_mock_inventory_context.tsx +++ b/x-pack/plugins/observability_solution/inventory/.storybook/get_mock_inventory_context.tsx @@ -17,7 +17,7 @@ import type { SpacesPluginStart } from '@kbn/spaces-plugin/public'; import type { HttpStart } from '@kbn/core-http-browser'; import { action } from '@storybook/addon-actions'; import type { InventoryKibanaContext } from '../public/hooks/use_kibana'; -import type { ITelemetryClient } from '../public/services/telemetry/types'; +import { ITelemetryClient } from '../public/services/telemetry/types'; export function getMockInventoryContext(): InventoryKibanaContext { const coreStart = coreMock.createStart(); diff --git a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/entity_name/index.tsx b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/entity_name/index.tsx index f3488dfddbc4e..982a616da8fda 100644 --- a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/entity_name/index.tsx +++ b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/entity_name/index.tsx @@ -25,13 +25,22 @@ interface EntityNameProps { } export function EntityName({ entity }: EntityNameProps) { - const { services } = useKibana(); + const { + services: { telemetry, share }, + } = useKibana(); const assetDetailsLocator = - services.share?.url.locators.get(ASSET_DETAILS_LOCATOR_ID); + share?.url.locators.get(ASSET_DETAILS_LOCATOR_ID); const serviceOverviewLocator = - services.share?.url.locators.get('serviceOverviewLocator'); + share?.url.locators.get('serviceOverviewLocator'); + + const handleLinkClick = useCallback(() => { + telemetry.reportEntityViewClicked({ + view_type: 'detail', + entity_type: entity['entity.type'], + }); + }, [entity, telemetry]); const getEntityRedirectUrl = useCallback(() => { const type = entity[ENTITY_TYPE]; @@ -58,7 +67,12 @@ export function EntityName({ entity }: EntityNameProps) { }, [entity, assetDetailsLocator, serviceOverviewLocator]); return ( - + // eslint-disable-next-line @elastic/eui/href-or-on-click + diff --git a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/index.tsx b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/index.tsx index 6d65669c61651..e3c0d24837f91 100644 --- a/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/index.tsx +++ b/x-pack/plugins/observability_solution/inventory/public/components/entities_grid/index.tsx @@ -84,12 +84,13 @@ export function EntitiesGrid({ } const columnEntityTableId = columnId as EntityColumnIds; + const entityType = entity[ENTITY_TYPE]; + switch (columnEntityTableId) { case 'alertsCount': return entity?.alertsCount ? : null; case ENTITY_TYPE: - const entityType = entity[columnEntityTableId]; return ( @@ -36,7 +37,7 @@ const INVENTORY_FEEDBACK_LINK = 'https://ela.st/feedback-new-inventory'; export function InventoryPageTemplate({ children }: { children: React.ReactNode }) { const { - services: { observabilityShared, inventoryAPIClient, kibanaEnvironment }, + services: { observabilityShared, inventoryAPIClient, kibanaEnvironment, telemetry }, } = useKibana(); const { PageTemplate: ObservabilityPageTemplate } = observabilityShared.navigation; @@ -62,6 +63,23 @@ export function InventoryPageTemplate({ children }: { children: React.ReactNode [inventoryAPIClient] ); + const isLoadingComplete = useIsLoadingComplete({ + loadingStates: [isEnablementLoading, hasDataLoading], + }); + + useEffect(() => { + if (isLoadingComplete) { + const viewState = isEntityManagerEnabled + ? value.hasData + ? 'populated' + : 'empty' + : 'eem_disabled'; + telemetry.reportEntityInventoryViewed({ + view_state: viewState, + }); + } + }, [isEntityManagerEnabled, value.hasData, telemetry, isLoadingComplete]); + if (isEnablementLoading || hasDataLoading) { return ( { + telemetry.reportEntityInventorySearchQuerySubmitted({ + kuery_fields: getKqlFieldsWithFallback(searchQuery?.query as string), + entity_types: searchEntityTypes || [], + action: searchIsUpdate ? 'submit' : 'refresh', + }); + }, + [telemetry] + ); + + const registerEntityTypeFilteredEvent = useCallback( + ({ filterEntityTypes, filterKuery }: { filterEntityTypes: string[]; filterKuery?: string }) => { + telemetry.reportEntityInventoryEntityTypeFiltered({ + entity_types: filterEntityTypes, + kuery_fields: filterKuery ? getKqlFieldsWithFallback(filterKuery) : [], + }); + }, + [telemetry] + ); + const handleEntityTypesChange = useCallback( (nextEntityTypes: string[]) => { searchBarContentSubject$.next({ kuery, entityTypes: nextEntityTypes, refresh: false }); + registerEntityTypeFilteredEvent({ filterEntityTypes: nextEntityTypes, filterKuery: kuery }); }, - [kuery, searchBarContentSubject$] + [kuery, registerEntityTypeFilteredEvent, searchBarContentSubject$] ); const handleQuerySubmit = useCallback>( @@ -64,8 +97,14 @@ export function SearchBar() { entityTypes, refresh: !isUpdate, }); + + registerSearchSubmittedEvent({ + searchQuery: query, + searchEntityTypes: entityTypes, + searchIsUpdate: isUpdate, + }); }, - [entityTypes, searchBarContentSubject$] + [entityTypes, registerSearchSubmittedEvent, searchBarContentSubject$] ); return ( diff --git a/x-pack/plugins/observability_solution/inventory/public/hooks/use_is_loading_complete.test.ts b/x-pack/plugins/observability_solution/inventory/public/hooks/use_is_loading_complete.test.ts new file mode 100644 index 0000000000000..61306a0b66a3b --- /dev/null +++ b/x-pack/plugins/observability_solution/inventory/public/hooks/use_is_loading_complete.test.ts @@ -0,0 +1,109 @@ +/* + * 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 { renderHook } from '@testing-library/react-hooks'; +import { useIsLoadingComplete } from './use_is_loading_complete'; + +describe('useIsLoadingComplete', () => { + describe('initialization', () => { + it('should initialize with undefined', () => { + const { result } = renderHook(() => useIsLoadingComplete({ loadingStates: [false, false] })); + expect(result.current).toBeUndefined(); + }); + + it('should handle an empty array of loadingStates', () => { + const { result } = renderHook(() => useIsLoadingComplete({ loadingStates: [] })); + expect(result.current).toBeUndefined(); + }); + + it('should handle a single loading state that is false', () => { + const { result } = renderHook(() => useIsLoadingComplete({ loadingStates: [false] })); + expect(result.current).toBeUndefined(); + }); + }); + + describe('loading states', () => { + it('should set isLoadingComplete to false when some loadingStates are true', () => { + const { result } = renderHook(() => useIsLoadingComplete({ loadingStates: [true, false] })); + expect(result.current).toBe(false); + }); + + it('should set isLoadingComplete to false when all loadingStates are true', () => { + const { result } = renderHook(() => useIsLoadingComplete({ loadingStates: [true, true] })); + expect(result.current).toBe(false); + }); + + it('should handle a single loading state that is true', () => { + const { result } = renderHook(() => useIsLoadingComplete({ loadingStates: [true] })); + expect(result.current).toBe(false); + }); + }); + + describe('loading completion', () => { + it('should set isLoadingComplete to true when all loadingStates are false after being true', () => { + const { result, rerender } = renderHook( + ({ loadingStates }) => useIsLoadingComplete({ loadingStates }), + { + initialProps: { loadingStates: [true, false] }, + } + ); + + expect(result.current).toBe(false); + + rerender({ loadingStates: [false, false] }); + + expect(result.current).toBe(true); + }); + + it('should set isLoadingComplete to true when all loadingStates are false after being mixed', () => { + const { result, rerender } = renderHook( + ({ loadingStates }) => useIsLoadingComplete({ loadingStates }), + { + initialProps: { loadingStates: [true, false] }, + } + ); + + expect(result.current).toBe(false); + + rerender({ loadingStates: [false, false] }); + + expect(result.current).toBe(true); + }); + }); + + describe('mixed states', () => { + it('should not change isLoadingComplete if loadingStates are mixed', () => { + const { result, rerender } = renderHook( + ({ loadingStates }) => useIsLoadingComplete({ loadingStates }), + { + initialProps: { loadingStates: [true, true] }, + } + ); + + expect(result.current).toBe(false); + + rerender({ loadingStates: [true, false] }); + + expect(result.current).toBe(false); + }); + + it('should not change isLoadingComplete if loadingStates change from all true to mixed', () => { + const { result, rerender } = renderHook( + ({ loadingStates }) => useIsLoadingComplete({ loadingStates }), + { + initialProps: { loadingStates: [true, true] }, + } + ); + + expect(result.current).toBe(false); + + rerender({ loadingStates: [true, false] }); + + expect(result.current).toBe(false); + }); + }); +}); diff --git a/x-pack/plugins/observability_solution/inventory/public/hooks/use_is_loading_complete.ts b/x-pack/plugins/observability_solution/inventory/public/hooks/use_is_loading_complete.ts new file mode 100644 index 0000000000000..76b863efaeceb --- /dev/null +++ b/x-pack/plugins/observability_solution/inventory/public/hooks/use_is_loading_complete.ts @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useState, useEffect } from 'react'; + +interface UseIsLoadingCompleteProps { + loadingStates: boolean[]; +} + +export const useIsLoadingComplete = ({ loadingStates }: UseIsLoadingCompleteProps) => { + const [isLoadingComplete, setIsLoadingComplete] = useState(undefined); + + useEffect(() => { + const someLoading = loadingStates.some((loading) => loading); + const allLoaded = loadingStates.every((loading) => !loading); + + if (isLoadingComplete === undefined && someLoading) { + setIsLoadingComplete(false); + } else if (isLoadingComplete === false && allLoaded) { + setIsLoadingComplete(true); + } + }, [isLoadingComplete, loadingStates]); + + return isLoadingComplete; +}; diff --git a/x-pack/plugins/observability_solution/inventory/public/plugin.ts b/x-pack/plugins/observability_solution/inventory/public/plugin.ts index b6771d2f95550..109123859d4ca 100644 --- a/x-pack/plugins/observability_solution/inventory/public/plugin.ts +++ b/x-pack/plugins/observability_solution/inventory/public/plugin.ts @@ -49,6 +49,7 @@ export class InventoryPlugin this.kibanaVersion = context.env.packageInfo.version; this.isServerlessEnv = context.env.packageInfo.buildFlavor === 'serverless'; } + setup( coreSetup: CoreSetup, pluginsSetup: InventorySetupDependencies @@ -58,6 +59,13 @@ export class InventoryPlugin 'observability:entityCentricExperience', true ); + + this.telemetry.setup({ + analytics: coreSetup.analytics, + }); + + const telemetry = this.telemetry.start(); + const getStartServices = coreSetup.getStartServices(); const hideInventory$ = from(getStartServices).pipe( @@ -105,9 +113,6 @@ export class InventoryPlugin pluginsSetup.observabilityShared.navigation.registerSections(sections$); - this.telemetry.setup({ analytics: coreSetup.analytics }); - const telemetry = this.telemetry.start(); - const isCloudEnv = !!pluginsSetup.cloud?.isCloudEnabled; const isServerlessEnv = pluginsSetup.cloud?.isServerlessEnabled || this.isServerlessEnv; diff --git a/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts b/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts index 1e36e8d6649ae..54d20ea324b11 100644 --- a/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts +++ b/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts @@ -6,7 +6,16 @@ */ import { AnalyticsServiceSetup } from '@kbn/core-analytics-browser'; -import { type ITelemetryClient, TelemetryEventTypes, type InventoryAddDataParams } from './types'; + +import { + type ITelemetryClient, + TelemetryEventTypes, + type InventoryAddDataParams, + type EntityInventoryViewedParams, + type EntityInventorySearchQuerySubmittedParams, + type EntityViewClickedParams, + type EntityInventoryEntityTypeFilteredParams, +} from './types'; export class TelemetryClient implements ITelemetryClient { constructor(private analytics: AnalyticsServiceSetup) {} @@ -14,4 +23,24 @@ export class TelemetryClient implements ITelemetryClient { public reportInventoryAddData = (params: InventoryAddDataParams) => { this.analytics.reportEvent(TelemetryEventTypes.INVENTORY_ADD_DATA_CLICKED, params); }; + + public reportEntityInventoryViewed = (params: EntityInventoryViewedParams) => { + this.analytics.reportEvent(TelemetryEventTypes.ENTITY_INVENTORY_VIEWED, params); + }; + + public reportEntityInventorySearchQuerySubmitted = ( + params: EntityInventorySearchQuerySubmittedParams + ) => { + this.analytics.reportEvent(TelemetryEventTypes.ENTITY_INVENTORY_SEARCH_QUERY_SUBMITTED, params); + }; + + public reportEntityInventoryEntityTypeFiltered = ( + params: EntityInventoryEntityTypeFilteredParams + ) => { + this.analytics.reportEvent(TelemetryEventTypes.ENTITY_INVENTORY_ENTITY_TYPE_FILTERED, params); + }; + + public reportEntityViewClicked = (params: EntityViewClickedParams) => { + this.analytics.reportEvent(TelemetryEventTypes.ENTITY_VIEW_CLICKED, params); + }; } diff --git a/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_events.ts b/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_events.ts index c1509499e694b..d61a90f7d30ab 100644 --- a/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_events.ts +++ b/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_events.ts @@ -25,4 +25,94 @@ const inventoryAddDataEventType: TelemetryEvent = { }, }; -export const inventoryTelemetryEventBasedTypes = [inventoryAddDataEventType]; +const entityInventoryViewedEventType: TelemetryEvent = { + eventType: TelemetryEventTypes.ENTITY_INVENTORY_VIEWED, + schema: { + view_state: { + type: 'keyword', + _meta: { + description: 'State of the view: empty, populated or eem_disabled.', + }, + }, + }, +}; + +const searchQuerySubmittedEventType: TelemetryEvent = { + eventType: TelemetryEventTypes.ENTITY_INVENTORY_SEARCH_QUERY_SUBMITTED, + schema: { + kuery_fields: { + type: 'array', + items: { + type: 'text', + _meta: { + description: 'Kuery fields used in the search.', + }, + }, + }, + entity_types: { + type: 'array', + items: { + type: 'keyword', + _meta: { + description: 'Entity types used in the search.', + }, + }, + }, + action: { + type: 'keyword', + _meta: { + description: 'Action performed: submit or refresh.', + }, + }, + }, +}; + +const entityInventoryEntityTypeFilteredEventType: TelemetryEvent = { + eventType: TelemetryEventTypes.ENTITY_INVENTORY_ENTITY_TYPE_FILTERED, + schema: { + entity_types: { + type: 'array', + items: { + type: 'keyword', + _meta: { + description: 'Entity types used in the filter.', + }, + }, + }, + kuery_fields: { + type: 'array', + items: { + type: 'text', + _meta: { + description: 'Kuery fields used in the filter.', + }, + }, + }, + }, +}; + +const entityViewClickedEventType: TelemetryEvent = { + eventType: TelemetryEventTypes.ENTITY_VIEW_CLICKED, + schema: { + entity_type: { + type: 'keyword', + _meta: { + description: 'Type of the entity: container, host or service.', + }, + }, + view_type: { + type: 'keyword', + _meta: { + description: 'Type of the view: detail or flyout.', + }, + }, + }, +}; + +export const inventoryTelemetryEventBasedTypes = [ + inventoryAddDataEventType, + entityInventoryViewedEventType, + searchQuerySubmittedEventType, + entityInventoryEntityTypeFilteredEventType, + entityViewClickedEventType, +]; diff --git a/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts b/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts index ffa05ffbff9a2..415cf0e7d4406 100644 --- a/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts +++ b/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts @@ -8,7 +8,13 @@ import { coreMock } from '@kbn/core/server/mocks'; import { inventoryTelemetryEventBasedTypes } from './telemetry_events'; import { TelemetryService } from './telemetry_service'; -import { TelemetryEventTypes } from './types'; +import { + type EntityInventoryViewedParams, + type EntityViewClickedParams, + type EntityInventorySearchQuerySubmittedParams, + TelemetryEventTypes, + type EntityInventoryEntityTypeFilteredParams, +} from './types'; describe('TelemetryService', () => { let service: TelemetryService; @@ -48,7 +54,15 @@ describe('TelemetryService', () => { service.setup(setupParams); const telemetry = service.start(); - expect(telemetry).toHaveProperty('reportInventoryAddData'); + const expectedProperties = [ + 'reportInventoryAddData', + 'reportEntityInventoryViewed', + 'reportEntityInventorySearchQuerySubmitted', + 'reportEntityViewClicked', + ]; + expectedProperties.forEach((property) => { + expect(telemetry).toHaveProperty(property); + }); }); }); @@ -73,4 +87,84 @@ describe('TelemetryService', () => { ); }); }); + + describe('#reportEntityInventoryViewed', () => { + it('should report entity inventory viewed with properties', async () => { + const setupParams = getSetupParams(); + service.setup(setupParams); + const telemetry = service.start(); + const params: EntityInventoryViewedParams = { + view_state: 'empty', + }; + + telemetry.reportEntityInventoryViewed(params); + + expect(setupParams.analytics.reportEvent).toHaveBeenCalledTimes(1); + expect(setupParams.analytics.reportEvent).toHaveBeenCalledWith( + TelemetryEventTypes.ENTITY_INVENTORY_VIEWED, + params + ); + }); + }); + + describe('#reportEntityInventorySearchQuerySubmitted', () => { + it('should report search query submitted with properties', async () => { + const setupParams = getSetupParams(); + service.setup(setupParams); + const telemetry = service.start(); + const params: EntityInventorySearchQuerySubmittedParams = { + kuery_fields: ['_index'], + action: 'submit', + entity_types: ['container'], + }; + + telemetry.reportEntityInventorySearchQuerySubmitted(params); + + expect(setupParams.analytics.reportEvent).toHaveBeenCalledTimes(1); + expect(setupParams.analytics.reportEvent).toHaveBeenCalledWith( + TelemetryEventTypes.ENTITY_INVENTORY_SEARCH_QUERY_SUBMITTED, + params + ); + }); + }); + + describe('#reportEntityInventoryEntityTypeFiltered', () => { + it('should report entity type filtered with properties', async () => { + const setupParams = getSetupParams(); + service.setup(setupParams); + const telemetry = service.start(); + const params: EntityInventoryEntityTypeFilteredParams = { + kuery_fields: ['_index'], + entity_types: ['container'], + }; + + telemetry.reportEntityInventoryEntityTypeFiltered(params); + + expect(setupParams.analytics.reportEvent).toHaveBeenCalledTimes(1); + expect(setupParams.analytics.reportEvent).toHaveBeenCalledWith( + TelemetryEventTypes.ENTITY_INVENTORY_ENTITY_TYPE_FILTERED, + params + ); + }); + }); + + describe('#reportEntityViewClicked', () => { + it('should report entity view clicked with properties', async () => { + const setupParams = getSetupParams(); + service.setup(setupParams); + const telemetry = service.start(); + const params: EntityViewClickedParams = { + entity_type: 'container', + view_type: 'detail', + }; + + telemetry.reportEntityViewClicked(params); + + expect(setupParams.analytics.reportEvent).toHaveBeenCalledTimes(1); + expect(setupParams.analytics.reportEvent).toHaveBeenCalledWith( + TelemetryEventTypes.ENTITY_VIEW_CLICKED, + params + ); + }); + }); }); diff --git a/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.ts b/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.ts index fa416f76b3c16..b81aff39672bb 100644 --- a/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.ts +++ b/x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.ts @@ -5,7 +5,7 @@ * 2.0. */ import type { AnalyticsServiceSetup } from '@kbn/core-analytics-browser'; -import type { TelemetryServiceSetupParams, ITelemetryClient, TelemetryEventParams } from './types'; +import type { TelemetryServiceSetupParams, TelemetryEventParams } from './types'; import { inventoryTelemetryEventBasedTypes } from './telemetry_events'; import { TelemetryClient } from './telemetry_client'; @@ -23,7 +23,7 @@ export class TelemetryService { ); } - public start(): ITelemetryClient { + public start(): TelemetryClient { if (!this.analytics) { throw new Error( 'The TelemetryService.setup() method has not been invoked, be sure to call it during the plugin setup.' diff --git a/x-pack/plugins/observability_solution/inventory/public/services/telemetry/types.ts b/x-pack/plugins/observability_solution/inventory/public/services/telemetry/types.ts index e5fdf162b750c..0e52d115d4597 100644 --- a/x-pack/plugins/observability_solution/inventory/public/services/telemetry/types.ts +++ b/x-pack/plugins/observability_solution/inventory/public/services/telemetry/types.ts @@ -6,24 +6,64 @@ */ import type { AnalyticsServiceSetup, RootSchema } from '@kbn/core/public'; +import { EntityManagerPublicPluginSetup } from '@kbn/entityManager-plugin/public'; export interface TelemetryServiceSetupParams { analytics: AnalyticsServiceSetup; } +export interface TelemetryServiceStartParams { + entityManager: EntityManagerPublicPluginSetup; +} + export interface InventoryAddDataParams { view: 'add_data_button' | 'empty_state'; journey?: 'add_data' | 'associate_existing_service_logs'; } -export type TelemetryEventParams = InventoryAddDataParams; +export interface EntityInventoryViewedParams { + view_state: 'empty' | 'populated' | 'eem_disabled'; +} + +export interface EntityInventorySearchQuerySubmittedParams { + kuery_fields: string[]; + entity_types: string[]; + action: 'submit' | 'refresh'; +} + +export interface EntityInventoryEntityTypeFilteredParams { + kuery_fields: string[]; + entity_types: string[]; +} + +export interface EntityViewClickedParams { + entity_type: string; + view_type: 'detail' | 'flyout'; +} + +export type TelemetryEventParams = + | InventoryAddDataParams + | EntityInventoryViewedParams + | EntityInventorySearchQuerySubmittedParams + | EntityInventoryEntityTypeFilteredParams + | EntityViewClickedParams; export interface ITelemetryClient { reportInventoryAddData(params: InventoryAddDataParams): void; + reportEntityInventoryViewed(params: EntityInventoryViewedParams): void; + reportEntityInventorySearchQuerySubmitted( + params: EntityInventorySearchQuerySubmittedParams + ): void; + reportEntityInventoryEntityTypeFiltered(params: EntityInventoryEntityTypeFilteredParams): void; + reportEntityViewClicked(params: EntityViewClickedParams): void; } export enum TelemetryEventTypes { INVENTORY_ADD_DATA_CLICKED = 'inventory_add_data_clicked', + ENTITY_INVENTORY_VIEWED = 'Entity Inventory Viewed', + ENTITY_INVENTORY_SEARCH_QUERY_SUBMITTED = 'Entity Inventory Search Query Submitted', + ENTITY_INVENTORY_ENTITY_TYPE_FILTERED = 'Entity Inventory Entity Type Filtered', + ENTITY_VIEW_CLICKED = 'Entity View Clicked', } export interface TelemetryEvent { diff --git a/x-pack/plugins/observability_solution/inventory/public/services/types.ts b/x-pack/plugins/observability_solution/inventory/public/services/types.ts index d0cc176e7b53f..b498a1fd49079 100644 --- a/x-pack/plugins/observability_solution/inventory/public/services/types.ts +++ b/x-pack/plugins/observability_solution/inventory/public/services/types.ts @@ -6,7 +6,7 @@ */ import type { InventoryAPIClient } from '../api'; -import type { ITelemetryClient } from './telemetry/types'; +import { ITelemetryClient } from './telemetry/types'; export interface InventoryServices { inventoryAPIClient: InventoryAPIClient; diff --git a/x-pack/plugins/observability_solution/inventory/public/utils/get_kql_field_names_with_fallback.test.ts b/x-pack/plugins/observability_solution/inventory/public/utils/get_kql_field_names_with_fallback.test.ts new file mode 100644 index 0000000000000..89305e2bb08c9 --- /dev/null +++ b/x-pack/plugins/observability_solution/inventory/public/utils/get_kql_field_names_with_fallback.test.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getKqlFieldsWithFallback } from './get_kql_field_names_with_fallback'; +import { getKqlFieldNamesFromExpression } from '@kbn/es-query'; + +jest.mock('@kbn/es-query', () => ({ + getKqlFieldNamesFromExpression: jest.fn(), +})); + +describe('getKqlFieldsWithFallback', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should return field names when getKqlFieldNamesFromExpression succeeds', () => { + const mockFieldNames = ['field1', 'field2']; + (getKqlFieldNamesFromExpression as jest.Mock).mockReturnValue(mockFieldNames); + const expectedArg = 'testKuery'; + + const result = getKqlFieldsWithFallback(expectedArg); + expect(result).toEqual(mockFieldNames); + expect(getKqlFieldNamesFromExpression).toHaveBeenCalledWith(expectedArg); + }); + + it('should return an empty array when getKqlFieldNamesFromExpression throws an error', () => { + (getKqlFieldNamesFromExpression as jest.Mock).mockImplementation(() => { + throw new Error('Test error'); + }); + const expectedArg = 'testKuery'; + + const result = getKqlFieldsWithFallback(expectedArg); + expect(result).toEqual([]); + expect(getKqlFieldNamesFromExpression).toHaveBeenCalledWith(expectedArg); + }); +}); diff --git a/x-pack/plugins/observability_solution/inventory/public/utils/get_kql_field_names_with_fallback.ts b/x-pack/plugins/observability_solution/inventory/public/utils/get_kql_field_names_with_fallback.ts new file mode 100644 index 0000000000000..029405b5fc235 --- /dev/null +++ b/x-pack/plugins/observability_solution/inventory/public/utils/get_kql_field_names_with_fallback.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. + */ + +import { getKqlFieldNamesFromExpression } from '@kbn/es-query'; + +export function getKqlFieldsWithFallback(kuery: string): string[] { + try { + return getKqlFieldNamesFromExpression(kuery); + } catch (e) { + return []; + } +} From 4d1b5997a732496467af927d08867a85455b150e Mon Sep 17 00:00:00 2001 From: Jill Guyonnet Date: Fri, 25 Oct 2024 16:01:44 +0100 Subject: [PATCH 034/135] [Fleet] Default new agentless-only integration setup technology to agentless (#197500) ## Summary Closes https://github.com/elastic/kibana/issues/193007 This change ensures that when installing agentless-only integrations in the UI, the "Setup technology" dropdown menu defaults to "Agentless". I also added a quick dev doc to capture the local setup needed to test agentless. ### How to test 1\. Add the following to `kibana.dev.yml`: ```yml # Emulate cloud xpack.cloud.id: "123456789" # Enable agentless experimental feature flag in Fleet xpack.fleet.enableExperimental: ['agentless'] # Agentless Fleet config xpack.fleet.agentless.enabled: true xpack.fleet.agentless.api.url: 'https://api.agentless.url/api/v1/ess' xpack.fleet.agentless.api.tls.certificate: './config/node.crt' xpack.fleet.agentless.api.tls.key: './config/node.key' xpack.fleet.agentless.api.tls.ca: './config/ca.crt' ``` 2\. Go to the integrations catalog, tick "Display beta integrations" and add the "Add Elastic Connectors" integration. The "Setup technology" dropdown menu should default to "Agentless". It should still be possible to select "Agent-based". ![Screenshot 2024-10-24 at 12 18 12](https://github.com/user-attachments/assets/33244e5b-4393-4204-84fe-748557453d29) 3\. Add the "Cloud Security Posture Management (CSPM)" integration. The "Setup technology" dropdown menu (under "Advanced options") should default to "Agent-based". It should still be possible to select "Agentless". ![Screenshot 2024-10-24 at 12 18 42](https://github.com/user-attachments/assets/75b41f3a-9c80-4751-a44a-e2bd0e0b4c5a) ### 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-pack/plugins/fleet/README.md | 1 + .../fleet/dev_docs/local_setup/agentless.md | 28 ++++++++ .../hooks/setup_technology.test.ts | 72 +++++++++++++++++++ .../hooks/setup_technology.ts | 20 ++++-- 4 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 x-pack/plugins/fleet/dev_docs/local_setup/agentless.md diff --git a/x-pack/plugins/fleet/README.md b/x-pack/plugins/fleet/README.md index fe61ca1d7cc51..d033e857b5ebd 100644 --- a/x-pack/plugins/fleet/README.md +++ b/x-pack/plugins/fleet/README.md @@ -32,6 +32,7 @@ In addition, it is typically needed to set up a Fleet Server and enroll Elastic - [Running a local Fleet Server and enrolling Elastic Agents](dev_docs/local_setup/enrolling_agents.md) for developing Kibana in stateful (not serverless) mode - [Developing Kibana in serverless mode](dev_docs/local_setup/developing_kibana_in_serverless.md) for developing Kibana in serverless mode - [Developing Kibana and Fleet Server simultaneously](dev_docs/local_setup/developing_kibana_and_fleet_server.md) for doing simultaneous Kibana and Fleet Server development +- [Testing agentless integrations](dev_docs/local_setup/agentless.md) ### Running Fleet locally in stateful mode diff --git a/x-pack/plugins/fleet/dev_docs/local_setup/agentless.md b/x-pack/plugins/fleet/dev_docs/local_setup/agentless.md new file mode 100644 index 0000000000000..a6f62a29a7179 --- /dev/null +++ b/x-pack/plugins/fleet/dev_docs/local_setup/agentless.md @@ -0,0 +1,28 @@ +# Testing agentless integrations + +Integrations have two possible deployment modes: +* on user-managed agents (most cases) +* on internally managed agents: these are called agentless + +## Kibana config + +Agentless integrations are available in ESS and Serverless, so in order to test or develop these in a local environment, the config should emulate either of these. + +At the time of writing, this can be achieved by adding the following to your `kibana.dev.yml`: +``` +# Emulate cloud +xpack.cloud.id: "123456789" + +# Enable agentless experimental feature flag in Fleet +xpack.fleet.enableExperimental: ['agentless'] +# Agentless Fleet config +xpack.fleet.agentless.enabled: true +xpack.fleet.agentless.api.url: 'https://api.agentless.url/api/v1/ess' +xpack.fleet.agentless.api.tls.certificate: './config/node.crt' +xpack.fleet.agentless.api.tls.key: './config/node.key' +xpack.fleet.agentless.api.tls.ca: './config/ca.crt' +``` + +## Which integrations to test with? + +At the time of writing, the Elastic Connectors integration is [agentless only](https://github.com/elastic/integrations/blob/2ebdf0cada6faed352e71a82cf71487672f27bf2/packages/elastic_connectors/manifest.yml#L35-L39) and the Cloud Security Posture Management (CSPM) integration offers both agent-based and agentless deployment modes. These are still in technical preview, so "Display beta integrations" should be checked. diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts index 38663d88e5b23..bd57576a4cafa 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts @@ -227,6 +227,74 @@ describe('useSetupTechnology', () => { expect(result.current.selectedSetupTechnology).toBe(SetupTechnology.AGENT_BASED); }); + it('should set the default selected setup technology to agent-based when creating a non agentless-only package policy', async () => { + (useConfig as MockFn).mockReturnValue({ + agentless: { + enabled: true, + api: { + url: 'https://agentless.api.url', + }, + }, + } as any); + (useStartServices as MockFn).mockReturnValue({ + cloud: { + isCloudEnabled: true, + }, + }); + + const { result } = renderHook(() => + useSetupTechnology({ + setNewAgentPolicy, + newAgentPolicy: newAgentPolicyMock, + updateAgentPolicies: updateAgentPoliciesMock, + setSelectedPolicyTab: setSelectedPolicyTabMock, + packageInfo: packageInfoMock, + packagePolicy: packagePolicyMock, + }) + ); + + expect(result.current.selectedSetupTechnology).toBe(SetupTechnology.AGENT_BASED); + }); + + it('should set the default selected setup technology to agentless when creating an agentless-only package policy', async () => { + (useConfig as MockFn).mockReturnValue({ + agentless: { + enabled: true, + api: { + url: 'https://agentless.api.url', + }, + }, + } as any); + (useStartServices as MockFn).mockReturnValue({ + cloud: { + isCloudEnabled: true, + }, + }); + const agentlessOnlyPackageInfoMock = { + policy_templates: [ + { + deployment_modes: { + default: { enabled: false }, + agentless: { enabled: true }, + }, + }, + ], + } as PackageInfo; + + const { result } = renderHook(() => + useSetupTechnology({ + setNewAgentPolicy, + newAgentPolicy: newAgentPolicyMock, + updateAgentPolicies: updateAgentPoliciesMock, + setSelectedPolicyTab: setSelectedPolicyTabMock, + packageInfo: agentlessOnlyPackageInfoMock, + packagePolicy: packagePolicyMock, + }) + ); + + expect(result.current.selectedSetupTechnology).toBe(SetupTechnology.AGENTLESS); + }); + it('should fetch agentless policy if agentless feature is enabled and isServerless is true', async () => { const { waitForNextUpdate } = renderHook(() => useSetupTechnology({ @@ -336,8 +404,12 @@ describe('useSetupTechnology', () => { }) ); + await rerender(); + expect(generateNewAgentPolicyWithDefaults).toHaveBeenCalled(); + expect(result.current.selectedSetupTechnology).toBe(SetupTechnology.AGENT_BASED); + act(() => { result.current.handleSetupTechnologyChange(SetupTechnology.AGENTLESS); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.ts b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.ts index 2a88fecc6b145..465a7241b3ad3 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { useCallback, useEffect, useRef, useState } from 'react'; +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { useConfig } from '../../../../../hooks'; import { ExperimentalFeaturesService } from '../../../../../services'; @@ -28,6 +28,7 @@ import { import { isAgentlessIntegration as isAgentlessIntegrationFn, getAgentlessAgentPolicyNameFromPackagePolicyName, + isOnlyAgentlessIntegration, } from '../../../../../../../../common/services/agentless_policy_helper'; export const useAgentless = () => { @@ -97,9 +98,13 @@ export function useSetupTechnology({ // this is a placeholder for the new agent-BASED policy that will be used when the user switches from agentless to agent-based and back const newAgentBasedPolicy = useRef(newAgentPolicy); - const [selectedSetupTechnology, setSelectedSetupTechnology] = useState( - SetupTechnology.AGENT_BASED - ); + const defaultSetupTechnology = useMemo(() => { + return isOnlyAgentlessIntegration(packageInfo) + ? SetupTechnology.AGENTLESS + : SetupTechnology.AGENT_BASED; + }, [packageInfo]); + const [selectedSetupTechnology, setSelectedSetupTechnology] = + useState(defaultSetupTechnology); const [newAgentlessPolicy, setNewAgentlessPolicy] = useState(() => { const agentless = generateNewAgentPolicyWithDefaults({ inactivity_timeout: 3600, @@ -154,6 +159,13 @@ export function useSetupTechnology({ } }, [isDefaultAgentlessPolicyEnabled]); + useEffect(() => { + if (isEditPage) { + return; + } + setSelectedSetupTechnology(defaultSetupTechnology); + }, [packageInfo, defaultSetupTechnology, isEditPage]); + const handleSetupTechnologyChange = useCallback( (setupTechnology: SetupTechnology, policyTemplateName?: string) => { if (!isAgentlessEnabled || setupTechnology === selectedSetupTechnology) { From 0ff9a8a9d9ff2bdb99562eeca29152bd0a0c4385 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Fri, 25 Oct 2024 17:06:52 +0200 Subject: [PATCH 035/135] [Synthetics] Fixes partial updates for params and params viewing (#195866) ## Summary Fixes https://github.com/elastic/kibana/issues/167781 In docs we says that only key/value pairs are required, but in actual edit, that means rest of the data was being lost on edits Allow partial updates to params edit API !! This PR makes sure prev objects is fetched and merged with new data hence allowing partial updates !! We are also allowing the ability to view value of the secret once it's saved via API !! ### Value is hidden Param value will not be visible unless user is `super_user` or `kibana_admin`, though user can assign new value. --------- Co-authored-by: Justin Kambic --- .../api/synthetics/params/edit-param.asciidoc | 6 +- .../journeys/global_parameters.journey.ts | 4 +- .../settings/components/optional_text.tsx | 20 ++++ .../global_params/add_param_flyout.tsx | 16 ++- .../settings/global_params/add_param_form.tsx | 36 ++---- .../global_params/param_value_field.tsx | 78 ++++++++++++ .../synthetics/state/global_params/api.ts | 15 ++- .../synthetics/server/routes/common.ts | 24 ++++ .../routes/settings/params/add_param.ts | 8 +- .../routes/settings/params/edit_param.ts | 70 +++++++---- .../server/routes/settings/params/params.ts | 112 +++++++++++------- .../apis/synthetics/add_edit_params.ts | 76 ++++++++++++ 12 files changed, 355 insertions(+), 110 deletions(-) create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/components/optional_text.tsx create mode 100644 x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/global_params/param_value_field.tsx diff --git a/docs/api/synthetics/params/edit-param.asciidoc b/docs/api/synthetics/params/edit-param.asciidoc index e615dd0c0bd1f..07a2568207dfe 100644 --- a/docs/api/synthetics/params/edit-param.asciidoc +++ b/docs/api/synthetics/params/edit-param.asciidoc @@ -26,13 +26,13 @@ You must have `all` privileges for the *Synthetics* feature in the *{observabili [[parameter-edit-request-body]] ==== Request body -The request body should contain the following attributes: +The request body can contain the following attributes, it can't be empty at least one attribute is required.: `key`:: -(Required, string) The key of the parameter. +(Optional, string) The key of the parameter. `value`:: -(Required, string) The updated value associated with the parameter. +(Optional, string) The updated value associated with the parameter. `description`:: (Optional, string) The updated description of the parameter. diff --git a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/global_parameters.journey.ts b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/global_parameters.journey.ts index 831f8d107f36a..b328b273836a7 100644 --- a/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/global_parameters.journey.ts +++ b/x-pack/plugins/observability_solution/synthetics/e2e/synthetics/journeys/global_parameters.journey.ts @@ -76,8 +76,8 @@ journey(`GlobalParameters`, async ({ page, params }) => { await page.click('text=Delete ParameterEdit Parameter >> :nth-match(button, 2)'); await page.click('[aria-label="Key"]'); await page.fill('[aria-label="Key"]', 'username2'); - await page.click('[aria-label="Value"]'); - await page.fill('[aria-label="Value"]', 'elastic2'); + await page.click('[aria-label="New value"]'); + await page.fill('[aria-label="New value"]', 'elastic2'); await page.click('.euiComboBox__inputWrap'); await page.fill('[aria-label="Tags"]', 'staging'); await page.press('[aria-label="Tags"]', 'Enter'); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/components/optional_text.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/components/optional_text.tsx new file mode 100644 index 0000000000000..a764cf3b27cdc --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/components/optional_text.tsx @@ -0,0 +1,20 @@ +/* + * 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 { EuiText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; + +export function OptionalText() { + return ( + + {i18n.translate('xpack.synthetics.sloEdit.optionalLabel', { + defaultMessage: 'Optional', + })} + + ); +} diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/global_params/add_param_flyout.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/global_params/add_param_flyout.tsx index 3fd17335d2ea5..70c2eb77526af 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/global_params/add_param_flyout.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/global_params/add_param_flyout.tsx @@ -22,6 +22,7 @@ import { FormProvider } from 'react-hook-form'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { i18n } from '@kbn/i18n'; import { useDispatch, useSelector } from 'react-redux'; +import { isEmpty } from 'lodash'; import { NoPermissionsTooltip } from '../../common/components/permissions'; import { addNewGlobalParamAction, @@ -80,18 +81,29 @@ export const AddParamFlyout = ({ const onSubmit = (formData: SyntheticsParams) => { const { namespaces, ...paramRequest } = formData; const shareAcrossSpaces = namespaces?.includes(ALL_SPACES_ID); + const newParamData = { + ...paramRequest, + }; + + if (isEditingItem && id) { + // omit value if it's empty + if (isEmpty(newParamData.value)) { + // @ts-ignore this is a valid check + delete newParamData.value; + } + } if (isEditingItem && id) { dispatch( editGlobalParamAction.get({ id, - paramRequest: { ...paramRequest, share_across_spaces: shareAcrossSpaces }, + paramRequest, }) ); } else { dispatch( addNewGlobalParamAction.get({ - ...paramRequest, + ...newParamData, share_across_spaces: shareAcrossSpaces, }) ); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/global_params/add_param_form.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/global_params/add_param_form.tsx index 1b219a0f6fec4..d472ec62237e9 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/global_params/add_param_form.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/global_params/add_param_form.tsx @@ -6,16 +6,11 @@ */ import React from 'react'; import { ALL_SPACES_ID } from '@kbn/security-plugin/public'; -import { - EuiCheckbox, - EuiComboBox, - EuiFieldText, - EuiForm, - EuiFormRow, - EuiTextArea, -} from '@elastic/eui'; +import { EuiCheckbox, EuiComboBox, EuiFieldText, EuiForm, EuiFormRow } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { Controller, useFormContext, useFormState } from 'react-hook-form'; +import { OptionalText } from '../components/optional_text'; +import { ParamValueField } from './param_value_field'; import { SyntheticsParams } from '../../../../../../common/runtime_types'; import { ListParamItem } from './params_list'; @@ -61,25 +56,8 @@ export const AddParamForm = ({ })} /> - - - - + + }> - + }> { + const { register } = useFormContext(); + const { errors } = useFormState(); + + if (isEditingItem) { + return ( + <> + } + > + + + + + + ); + } + + return ( + + + + ); +}; + +export const NEW_VALUE_LABEL = i18n.translate( + 'xpack.synthetics.monitorManagement.paramForm.newValue', + { + defaultMessage: 'New value', + } +); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/global_params/api.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/global_params/api.ts index ce7f9bd81ea3d..33eb4622bf6c5 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/global_params/api.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/global_params/api.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { isEmpty } from 'lodash'; import { INITIAL_REST_VERSION, SYNTHETICS_API_URLS } from '../../../../../common/constants'; import { DeleteParamsResponse, @@ -35,16 +36,22 @@ export const editGlobalParam = async ({ id, }: { id: string; - paramRequest: SyntheticsParamRequest; -}): Promise => - apiService.put( + paramRequest: Partial; +}): Promise => { + const data = paramRequest; + if (isEmpty(paramRequest.value)) { + // omit empty value + delete data.value; + } + return await apiService.put( SYNTHETICS_API_URLS.PARAMS + `/${id}`, - paramRequest, + data, SyntheticsParamsCodec, { version: INITIAL_REST_VERSION, } ); +}; export const deleteGlobalParams = async (ids: string[]): Promise => apiService.delete( diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/common.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/common.ts index 0bdc7989b8a8a..2a906f3cf6a4d 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/common.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/common.ts @@ -9,6 +9,7 @@ import { schema, TypeOf } from '@kbn/config-schema'; import { SavedObjectsFindResponse } from '@kbn/core/server'; import { isEmpty } from 'lodash'; import { escapeQuotes } from '@kbn/es-query'; +import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; import { RouteContext } from './types'; import { MonitorSortFieldSchema } from '../../common/runtime_types/monitor_management/sort_field'; import { getAllLocations } from '../synthetics_service/get_all_locations'; @@ -269,3 +270,26 @@ function parseMappingKey(key: string | undefined) { return key; } } + +export const validateRouteSpaceName = async (routeContext: RouteContext) => { + const { spaceId, server, request, response } = routeContext; + if (spaceId === DEFAULT_SPACE_ID) { + // default space is always valid + return { spaceId: DEFAULT_SPACE_ID }; + } + + try { + await server.spaces?.spacesService.getActiveSpace(request); + } catch (error) { + if (error.output?.statusCode === 404) { + return { + spaceId, + invalidResponse: response.notFound({ + body: { message: `Kibana space '${spaceId}' does not exist` }, + }), + }; + } + } + + return { invalidResponse: undefined }; +}; diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/settings/params/add_param.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/settings/params/add_param.ts index a51079f366eff..7d0cac7d7e57c 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/settings/params/add_param.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/settings/params/add_param.ts @@ -19,8 +19,12 @@ import { syntheticsParamType } from '../../../../common/types/saved_objects'; import { SYNTHETICS_API_URLS } from '../../../../common/constants'; const ParamsObjectSchema = schema.object({ - key: schema.string(), - value: schema.string(), + key: schema.string({ + minLength: 1, + }), + value: schema.string({ + minLength: 1, + }), description: schema.maybe(schema.string()), tags: schema.maybe(schema.arrayOf(schema.string())), share_across_spaces: schema.maybe(schema.boolean()), diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/settings/params/edit_param.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/settings/params/edit_param.ts index 3555963b76bf1..eb9f41696da97 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/settings/params/edit_param.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/settings/params/edit_param.ts @@ -6,8 +6,9 @@ */ import { schema, TypeOf } from '@kbn/config-schema'; -import { SavedObject } from '@kbn/core/server'; -import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; +import { SavedObject, SavedObjectsErrorHelpers } from '@kbn/core/server'; +import { isEmpty } from 'lodash'; +import { validateRouteSpaceName } from '../../common'; import { SyntheticsRestApiRouteFactory } from '../../types'; import { SyntheticsParamRequest, SyntheticsParams } from '../../../../common/runtime_types'; import { syntheticsParamType } from '../../../../common/types/saved_objects'; @@ -20,7 +21,7 @@ const RequestParamsSchema = schema.object({ type RequestParams = TypeOf; export const editSyntheticsParamsRoute: SyntheticsRestApiRouteFactory< - SyntheticsParams, + SyntheticsParams | undefined, RequestParams > = () => ({ method: 'PUT', @@ -30,46 +31,63 @@ export const editSyntheticsParamsRoute: SyntheticsRestApiRouteFactory< request: { params: RequestParamsSchema, body: schema.object({ - key: schema.string(), - value: schema.string(), + key: schema.maybe( + schema.string({ + minLength: 1, + }) + ), + value: schema.maybe( + schema.string({ + minLength: 1, + }) + ), description: schema.maybe(schema.string()), tags: schema.maybe(schema.arrayOf(schema.string())), - share_across_spaces: schema.maybe(schema.boolean()), }), }, }, - handler: async ({ savedObjectsClient, request, server, response }) => { + handler: async (routeContext) => { + const { savedObjectsClient, request, response, spaceId, server } = routeContext; + const { invalidResponse } = await validateRouteSpaceName(routeContext); + if (invalidResponse) return invalidResponse; + + const { id: paramId } = request.params; + const data = request.body as SyntheticsParamRequest; + if (isEmpty(data)) { + return response.badRequest({ body: { message: 'Request body cannot be empty' } }); + } + const encryptedSavedObjectsClient = server.encryptedSavedObjects.getClient(); + try { - const { id: _spaceId } = (await server.spaces?.spacesService.getActiveSpace(request)) ?? { - id: DEFAULT_SPACE_ID, + const existingParam = + await encryptedSavedObjectsClient.getDecryptedAsInternalUser( + syntheticsParamType, + paramId, + { namespace: spaceId } + ); + + const newParam = { + ...existingParam.attributes, + ...data, }; - const { id } = request.params; - const { share_across_spaces: _shareAcrossSpaces, ...data } = - request.body as SyntheticsParamRequest & { - id: string; - }; - const { value } = data; + // value from data since we aren't using encrypted client + const { value } = existingParam.attributes; const { id: responseId, attributes: { key, tags, description }, namespaces, - } = (await savedObjectsClient.update( + } = (await savedObjectsClient.update( syntheticsParamType, - id, - data + paramId, + newParam )) as SavedObject; return { id: responseId, key, tags, description, namespaces, value }; - } catch (error) { - if (error.output?.statusCode === 404) { - const spaceId = server.spaces?.spacesService.getSpaceId(request) ?? DEFAULT_SPACE_ID; - return response.notFound({ - body: { message: `Kibana space '${spaceId}' does not exist` }, - }); + } catch (getErr) { + if (SavedObjectsErrorHelpers.isNotFoundError(getErr)) { + return response.notFound({ body: { message: 'Param not found' } }); } - - throw error; } }, }); diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/settings/params/params.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/settings/params/params.ts index 01f2dd6465dfd..da0a2e250557a 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/settings/params/params.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/settings/params/params.ts @@ -7,7 +7,7 @@ import { SavedObject, SavedObjectsFindResult } from '@kbn/core-saved-objects-api-server'; import { schema, TypeOf } from '@kbn/config-schema'; -import { SyntheticsRestApiRouteFactory } from '../../types'; +import { RouteContext, SyntheticsRestApiRouteFactory } from '../../types'; import { syntheticsParamType } from '../../../../common/types/saved_objects'; import { SYNTHETICS_API_URLS } from '../../../../common/constants'; import { SyntheticsParams, SyntheticsParamsReadonly } from '../../../../common/runtime_types'; @@ -30,45 +30,13 @@ export const getSyntheticsParamsRoute: SyntheticsRestApiRouteFactory< params: RequestParamsSchema, }, }, - handler: async ({ savedObjectsClient, request, response, server, spaceId }) => { + handler: async (routeContext) => { + const { savedObjectsClient, request, response, spaceId } = routeContext; try { const { id: paramId } = request.params; - const encryptedSavedObjectsClient = server.encryptedSavedObjects.getClient(); - - const canSave = - ( - await server.coreStart?.capabilities.resolveCapabilities(request, { - capabilityPath: 'uptime.*', - }) - ).uptime.save ?? false; - - if (canSave) { - if (paramId) { - const savedObject = - await encryptedSavedObjectsClient.getDecryptedAsInternalUser( - syntheticsParamType, - paramId, - { namespace: spaceId } - ); - return toClientResponse(savedObject); - } - - const finder = - await encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser( - { - type: syntheticsParamType, - perPage: 1000, - namespaces: [spaceId], - } - ); - - const hits: Array> = []; - for await (const result of finder.find()) { - hits.push(...result.saved_objects); - } - - return hits.map((savedObject) => toClientResponse(savedObject)); + if (await isAnAdminUser(routeContext)) { + return getDecryptedParams(routeContext, paramId); } else { if (paramId) { const savedObject = await savedObjectsClient.get( @@ -78,11 +46,7 @@ export const getSyntheticsParamsRoute: SyntheticsRestApiRouteFactory< return toClientResponse(savedObject); } - const data = await savedObjectsClient.find({ - type: syntheticsParamType, - perPage: 10000, - }); - return data.saved_objects.map((savedObject) => toClientResponse(savedObject)); + return findAllParams(routeContext); } } catch (error) { if (error.output?.statusCode === 404) { @@ -94,6 +58,70 @@ export const getSyntheticsParamsRoute: SyntheticsRestApiRouteFactory< }, }); +const isAnAdminUser = async (routeContext: RouteContext) => { + const { request, server } = routeContext; + const user = server.coreStart.security.authc.getCurrentUser(request); + + const isSuperUser = user?.roles.includes('superuser'); + const isAdmin = user?.roles.includes('kibana_admin'); + + const canSave = + ( + await server.coreStart?.capabilities.resolveCapabilities(request, { + capabilityPath: 'uptime.*', + }) + ).uptime.save ?? false; + + return (isSuperUser || isAdmin) && canSave; +}; + +const getDecryptedParams = async ({ server, spaceId }: RouteContext, paramId?: string) => { + const encryptedSavedObjectsClient = server.encryptedSavedObjects.getClient(); + + if (paramId) { + const savedObject = + await encryptedSavedObjectsClient.getDecryptedAsInternalUser( + syntheticsParamType, + paramId, + { namespace: spaceId } + ); + return toClientResponse(savedObject); + } + const finder = + await encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser( + { + type: syntheticsParamType, + perPage: 1000, + namespaces: [spaceId], + } + ); + + const hits: Array> = []; + for await (const result of finder.find()) { + hits.push(...result.saved_objects); + } + + void finder.close(); + + return hits.map((savedObject) => toClientResponse(savedObject)); +}; + +const findAllParams = async ({ savedObjectsClient }: RouteContext) => { + const finder = savedObjectsClient.createPointInTimeFinder({ + type: syntheticsParamType, + perPage: 1000, + }); + + const hits: Array> = []; + for await (const result of finder.find()) { + hits.push(...result.saved_objects); + } + + void finder.close(); + + return hits.map((savedObject) => toClientResponse(savedObject)); +}; + const toClientResponse = ( savedObject: SavedObject ) => { diff --git a/x-pack/test/api_integration/apis/synthetics/add_edit_params.ts b/x-pack/test/api_integration/apis/synthetics/add_edit_params.ts index 4de02eb80b30c..7b27aaa621f46 100644 --- a/x-pack/test/api_integration/apis/synthetics/add_edit_params.ts +++ b/x-pack/test/api_integration/apis/synthetics/add_edit_params.ts @@ -10,6 +10,7 @@ import { pick } from 'lodash'; import { SYNTHETICS_API_URLS } from '@kbn/synthetics-plugin/common/constants'; import expect from '@kbn/expect'; import { syntheticsParamType } from '@kbn/synthetics-plugin/common/types/saved_objects'; +import { SyntheticsMonitorTestService } from './services/synthetics_monitor_test_service'; import { FtrProviderContext } from '../../ftr_provider_context'; import { PrivateLocationTestService } from './services/private_location_test_service'; @@ -21,12 +22,15 @@ export default function ({ getService }: FtrProviderContext) { describe('AddEditParams', function () { this.tags('skipCloud'); const supertestAPI = getService('supertest'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + const kServer = getService('kibanaServer'); const testParam = { key: 'test', value: 'test', }; const testPrivateLocations = new PrivateLocationTestService(getService); + const monitorTestService = new SyntheticsMonitorTestService(getService); before(async () => { await testPrivateLocations.installSyntheticsPackage(); @@ -93,6 +97,12 @@ export default function ({ getService }: FtrProviderContext) { const param = getResponse.body[0]; assertHas(param, testParam); + await supertestAPI + .put(SYNTHETICS_API_URLS.PARAMS + '/' + param.id) + .set('kbn-xsrf', 'true') + .send({}) + .expect(400); + await supertestAPI .put(SYNTHETICS_API_URLS.PARAMS + '/' + param.id) .set('kbn-xsrf', 'true') @@ -107,6 +117,55 @@ export default function ({ getService }: FtrProviderContext) { assertHas(actualUpdatedParam, expectedUpdatedParam); }); + it('handles partial editing a param', async () => { + const newParam = { + key: 'testUpdated', + value: 'testUpdated', + tags: ['a tag'], + description: 'test description', + }; + + const response = await supertestAPI + .post(SYNTHETICS_API_URLS.PARAMS) + .set('kbn-xsrf', 'true') + .send(newParam) + .expect(200); + const paramId = response.body.id; + + const getResponse = await supertestAPI + .get(SYNTHETICS_API_URLS.PARAMS + '/' + paramId) + .set('kbn-xsrf', 'true') + .expect(200); + assertHas(getResponse.body, newParam); + + await supertestAPI + .put(SYNTHETICS_API_URLS.PARAMS + '/' + paramId) + .set('kbn-xsrf', 'true') + .send({ + key: 'testUpdated', + }) + .expect(200); + + await supertestAPI + .put(SYNTHETICS_API_URLS.PARAMS + '/' + paramId) + .set('kbn-xsrf', 'true') + .send({ + key: 'testUpdatedAgain', + value: 'testUpdatedAgain', + }) + .expect(200); + + const updatedGetResponse = await supertestAPI + .get(SYNTHETICS_API_URLS.PARAMS + '/' + paramId) + .set('kbn-xsrf', 'true') + .expect(200); + assertHas(updatedGetResponse.body, { + ...newParam, + key: 'testUpdatedAgain', + value: 'testUpdatedAgain', + }); + }); + it('handles spaces', async () => { const SPACE_ID = `test-space-${uuidv4()}`; const SPACE_NAME = `test-space-name ${uuidv4()}`; @@ -277,5 +336,22 @@ export default function ({ getService }: FtrProviderContext) { expect(getResponse.body[0].namespaces).eql(['*']); assertHas(getResponse.body[0], testParam); }); + + it('should not return values for non admin user', async () => { + const { username, password } = await monitorTestService.addsNewSpace(); + const resp = await supertestWithoutAuth + .get(`${SYNTHETICS_API_URLS.PARAMS}`) + .auth(username, password) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + const params = resp.body; + expect(params.length).to.eql(6); + params.forEach((param: any) => { + expect(param.value).to.eql(undefined); + expect(param.key).to.not.empty(); + }); + }); }); } From b3b85da80d0c9a8431f6a2f2e3c1bdf1448eb1a6 Mon Sep 17 00:00:00 2001 From: Marta Bondyra <4283304+mbondyra@users.noreply.github.com> Date: Fri, 25 Oct 2024 17:17:02 +0200 Subject: [PATCH 036/135] [Discover] Fix suggestions for ES|QL charts (#197583) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/elastic/kibana/issues/197342 In this PR (https://github.com/elastic/kibana/pull/197101) I removed the legacy metric from being suggested in the suggestion panel, and replaced it with the new metric visualization. To maintain the previous behavior in Lens (suggesting a new metric in the same place as legacy metric), we made the score higher for the new metric. This positioned it higher also in the Discover ESQL suggestions. This led to an issue where one expected suggestion didn’t appear because we only display the top 6 suggestions by score and it got pushed out by metric. Additionally, I made a change here to only display the metric without bucketed columns in the suggestion panel. I don't see there's a lot of value in suggesting bucketed metric unless it's something user chooses intentionally. Should be merged to 8.x after this: https://github.com/elastic/kibana/pull/197337 --- test/functional/apps/discover/group3/_lens_vis.ts | 11 +++++------ .../public/visualizations/metric/suggestions.test.ts | 10 +++++----- .../lens/public/visualizations/metric/suggestions.ts | 4 +--- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/test/functional/apps/discover/group3/_lens_vis.ts b/test/functional/apps/discover/group3/_lens_vis.ts index db526fe978610..5e13c8bbb243c 100644 --- a/test/functional/apps/discover/group3/_lens_vis.ts +++ b/test/functional/apps/discover/group3/_lens_vis.ts @@ -110,8 +110,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return seriesType; } - // Failing: See https://github.com/elastic/kibana/issues/197342 - describe.skip('discover lens vis', function () { + describe('discover lens vis', function () { before(async () => { await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); @@ -616,8 +615,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await getCurrentVisTitle()).to.be('Pie'); await testSubjects.existOrFail('partitionVisChart'); - await discover.chooseLensSuggestion('barVerticalStacked'); - await changeVisShape('Line'); + await discover.chooseLensSuggestion('waffle'); + await changeVisShape('Treemap'); await testSubjects.existOrFail('unsavedChangesBadge'); await discover.saveUnsavedChanges(); @@ -626,8 +625,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await discover.waitUntilSearchingHasFinished(); await testSubjects.missingOrFail('unsavedChangesBadge'); - expect(await getCurrentVisTitle()).to.be('Line'); - await testSubjects.existOrFail('xyVisChart'); + expect(await getCurrentVisTitle()).to.be('Treemap'); + await testSubjects.existOrFail('partitionVisChart'); }); it('should close lens flyout on revert changes', async () => { diff --git a/x-pack/plugins/lens/public/visualizations/metric/suggestions.test.ts b/x-pack/plugins/lens/public/visualizations/metric/suggestions.test.ts index 4f1c7b46d06be..c9a97c0d170a0 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/suggestions.test.ts +++ b/x-pack/plugins/lens/public/visualizations/metric/suggestions.test.ts @@ -189,7 +189,7 @@ describe('metric suggestions', () => { breakdownByAccessor: bucketColumn.columnId, }, title: 'Metric', - hide: false, + hide: true, previewIcon: IconChartMetric, score: 0.51, }, @@ -221,7 +221,7 @@ describe('metric suggestions', () => { breakdownByAccessor: bucketColumn.columnId, }, title: 'Metric', - hide: false, + hide: true, previewIcon: IconChartMetric, score: 0.51, }, @@ -294,7 +294,7 @@ describe('metric suggestions', () => { breakdownByAccessor: bucketColumn.columnId, }, title: 'Metric', - hide: false, + hide: true, previewIcon: IconChartMetric, score: 0.52, }, @@ -326,7 +326,7 @@ describe('metric suggestions', () => { breakdownByAccessor: bucketColumn.columnId, }, title: 'Metric', - hide: false, + hide: true, previewIcon: IconChartMetric, score: 0.52, }, @@ -357,7 +357,7 @@ describe('metric suggestions', () => { breakdownByAccessor: bucketColumn.columnId, }, title: 'Metric', - hide: false, + hide: true, previewIcon: IconChartMetric, score: 0.52, }, diff --git a/x-pack/plugins/lens/public/visualizations/metric/suggestions.ts b/x-pack/plugins/lens/public/visualizations/metric/suggestions.ts index 877d2b45d66af..5d066318d734f 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/suggestions.ts +++ b/x-pack/plugins/lens/public/visualizations/metric/suggestions.ts @@ -30,8 +30,6 @@ export const getSuggestions: Visualization['getSuggest const bucketedColumns = table.columns.filter(({ operation }) => operation.isBucketed); - const hasInterval = bucketedColumns.some(({ operation }) => operation.scale === 'interval'); - const unsupportedColumns = table.columns.filter( ({ operation }) => !supportedDataTypes.has(operation.dataType) && !operation.isBucketed ); @@ -64,7 +62,7 @@ export const getSuggestions: Visualization['getSuggest title: metricColumns[0]?.operation.label || metricLabel, previewIcon: IconChartMetric, score: 0.5, - hide: hasInterval, + hide: !!bucketedColumns.length, }; const accessorMappings: Pick = From d1eb47806eb1f0650cfa9e86a24a5a0b5be2bec3 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Fri, 25 Oct 2024 09:23:23 -0600 Subject: [PATCH 037/135] [ML] Adds ES|QL visualizer menu item in Observability's ML left-nav (#197300) ## Summary Fixes: https://github.com/elastic/kibana/issues/197142 Adds ES|QL visualizer menu item in Observability's ML left-nav. ![image](https://github.com/user-attachments/assets/f705f94a-3f9c-471e-9c41-8e5020881750) ### 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) Co-authored-by: Elastic Machine --- .../observability/public/navigation_tree.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts b/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts index a36c85dbf937a..07bb33ebb5a98 100644 --- a/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts +++ b/x-pack/plugins/observability_solution/observability/public/navigation_tree.ts @@ -325,6 +325,15 @@ export function createNavTree(pluginsStart: ObservabilityPublicPluginsStart) { } ), }, + { + link: 'ml:esqlDataVisualizer', + title: i18n.translate( + 'xpack.observability.obltNav.ml.data_visualizer.esql_data_visualizer', + { + defaultMessage: 'ES|QL data visualizer', + } + ), + }, { link: 'ml:dataDrift', title: i18n.translate( From 0e919a9350e258a5adf6860c11c68ee910a4bc04 Mon Sep 17 00:00:00 2001 From: Achyut Jhunjhunwala Date: Fri, 25 Oct 2024 18:11:37 +0200 Subject: [PATCH 038/135] [Dataset Quality]Fix elastic doc test (#197835) Found a bug while backporting another PR. The elastic docs in main always refer to master, but once a release is cut, it check for specific version in the URL. hence updated the test P.S: This does not need backport to 8.x as this has already been fixed in 8.x --- .../functional/apps/dataset_quality/degraded_field_flyout.ts | 4 +--- .../observability/dataset_quality/degraded_field_flyout.ts | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/x-pack/test/functional/apps/dataset_quality/degraded_field_flyout.ts b/x-pack/test/functional/apps/dataset_quality/degraded_field_flyout.ts index 1b477644feca0..f5d695b8f165c 100644 --- a/x-pack/test/functional/apps/dataset_quality/degraded_field_flyout.ts +++ b/x-pack/test/functional/apps/dataset_quality/degraded_field_flyout.ts @@ -700,9 +700,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid const linkURL = await linkButton.getAttribute('href'); - expect(linkURL).to.be( - 'https://www.elastic.co/guide/en/elasticsearch/reference/master/mapping-settings-limit.html' - ); + expect(linkURL?.endsWith('mapping-settings-limit.html')).to.be(true); }); it('should display increase field limit as a possible mitigation for non integration', async () => { diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/degraded_field_flyout.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/degraded_field_flyout.ts index 59d58a3e83151..1fe53b2aa7ce7 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/degraded_field_flyout.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/degraded_field_flyout.ts @@ -701,9 +701,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const linkURL = await linkButton.getAttribute('href'); - expect(linkURL).to.be( - 'https://www.elastic.co/guide/en/elasticsearch/reference/master/mapping-settings-limit.html' - ); + expect(linkURL?.endsWith('mapping-settings-limit.html')).to.be(true); }); it('should display increase field limit as a possible mitigation for non integration', async () => { From 5c40627b90ba99f7410dbfbf520ebcf8170efa92 Mon Sep 17 00:00:00 2001 From: Tre Date: Fri, 25 Oct 2024 17:20:42 +0100 Subject: [PATCH 039/135] [FTR][Ownership] Assign visualize, etc (#197664) ## Summary Assign test files to small number of reviewers ### Assignment Reasons Assigned visualize due to the name Assigned functional_execution_context due to https://github.com/elastic/kibana/blob/main/x-pack/test/functional_execution_context/plugins/alerts/kibana.jsonc#L4 Assigned kubernetes_security per https://github.com/elastic/kibana/blob/main/x-pack/plugins/kubernetes_security/kibana.jsonc#L4 Assigned licensing_plugin due to https://github.com/elastic/kibana/blob/main/x-pack/plugins/licensing/kibana.jsonc#L4 Assigned rule_registry due to https://github.com/elastic/kibana/blob/main/x-pack/plugins/rule_registry/kibana.jsonc#L4-L5 Assigned usage_collection due to https://github.com/elastic/kibana/blob/main/api_docs/usage_collection.mdx#L18 - It says `Contact @elastic/kibana-core for questions regarding this plugin.` Assigned observability_onboarding_api_integration due to https://github.com/elastic/kibana/blob/main/api_docs/observability_onboarding.mdx#L18 - It says `Contact @elastic/obs-ux-logs-team for questions regarding this plugin.` Contributes to: https://github.com/elastic/kibana/issues/194817 --- .github/CODEOWNERS | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 80d9c8b64e9e6..db98dc411bc22 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1094,6 +1094,7 @@ src/plugins/discover/public/context_awareness/profile_providers/security @elasti # Visualizations /x-pack/test/accessibility/apps/group3/graph.ts @elastic/kibana-visualizations /x-pack/test/accessibility/apps/group2/lens.ts @elastic/kibana-visualizations +/x-pack/test/functional/apps/visualize @elastic/kibana-visualizations /src/plugins/visualize/ @elastic/kibana-visualizations /x-pack/test/functional/apps/lens @elastic/kibana-visualizations /x-pack/test/api_integration/apis/lens/ @elastic/kibana-visualizations @@ -1260,6 +1261,7 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test_serverless/api_integration/test_suites/observability/synthetics @elastic/obs-ux-management-team # obs-ux-logs-team +/x-pack/test/observability_onboarding_api_integration @elastic/obs-ux-logs-team /x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts @elastic/obs-ux-logs-team /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 @@ -1360,6 +1362,8 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /.eslintignore @elastic/kibana-operations # Appex QA +/x-pack/test/scalability @elastic/appex-qa +/src/dev/performance @elastic/appex-qa /x-pack/test/functional/config.*.* @elastic/appex-qa /x-pack/test/api_integration/ftr_provider_context.d.ts @elastic/appex-qa # Maybe this should be a glob? /x-pack/test/accessibility/services.ts @elastic/appex-qa @@ -1398,6 +1402,9 @@ x-pack/test/api_integration/deployment_agnostic/services/ @elastic/appex-qa x-pack/test/**/deployment_agnostic/ @elastic/appex-qa #temporarily to monitor tests migration # Core +/x-pack/test/usage_collection @elastic/kibana-core +/x-pack/test/licensing_plugin @elastic/kibana-core +/x-pack/test/functional_execution_context @elastic/kibana-core /x-pack/test/api_integration/apis/telemetry @elastic/kibana-core /x-pack/test/api_integration/apis/status @elastic/kibana-core /x-pack/test/api_integration/apis/stats @elastic/kibana-core @@ -1484,6 +1491,7 @@ x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kib #CC# /x-pack/plugins/security/ @elastic/kibana-security # Response Ops team +/x-pack/test/rule_registry @elastic/response-ops @elastic/obs-ux-management-team /x-pack/test/accessibility/apps/group3/rules_connectors.ts @elastic/response-ops /x-pack/test/functional/es_archives/cases/default @elastic/response-ops /x-pack/test_serverless/api_integration/test_suites/observability/config.ts @elastic/response-ops @@ -1915,6 +1923,7 @@ x-pack/plugins/osquery @elastic/security-defend-workflows # Cloud Security Posture x-pack/packages/kbn-cloud-security-posture @elastic/kibana-cloud-security-posture +/x-pack/test/kubernetes_security @elastic/kibana-cloud-security-posture /x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.* @elastic/kibana-cloud-security-posture /x-pack/plugins/security_solution/public/cloud_security_posture @elastic/kibana-cloud-security-posture /x-pack/test/api_integration/apis/cloud_security_posture/ @elastic/kibana-cloud-security-posture From 4d369946574bc9f07a5720dde66cfd4719795be6 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Fri, 25 Oct 2024 18:21:28 +0200 Subject: [PATCH 040/135] [React@18 failing tests] Dataset quality handles user privileges (#197830) --- .../public/hooks/use_redirect_link.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_redirect_link.ts b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_redirect_link.ts index d1e55d488ba5c..5e065e55db44e 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_redirect_link.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_redirect_link.ts @@ -47,12 +47,16 @@ export const useRedirectLink = ({ share.url.locators.get(SINGLE_DATASET_LOCATOR_ID); const isLogsExplorerAppAccessible = useObservable( - application.applications$.pipe( - map( - (apps) => - (apps.get(OBSERVABILITY_LOGS_EXPLORER_APP_ID)?.status ?? AppStatus.inaccessible) === - AppStatus.accessible - ) + useMemo( + () => + application.applications$.pipe( + map( + (apps) => + (apps.get(OBSERVABILITY_LOGS_EXPLORER_APP_ID)?.status ?? AppStatus.inaccessible) === + AppStatus.accessible + ) + ), + [application.applications$] ), false ); From f34802bc6fae7a17e2b75e22ccde3fee380a4dee Mon Sep 17 00:00:00 2001 From: Maxim Palenov Date: Fri, 25 Oct 2024 19:52:27 +0300 Subject: [PATCH 041/135] [Security Solution] Add data source editable component (#196948) **Partially addresses:** https://github.com/elastic/kibana/issues/171520 ## Summary This PR adds is built on top of https://github.com/elastic/kibana/pull/193828 and add a Data Source editable component for final edit side of Three Way Diff tab of the upgrade prebuilt rule workflow. ## Details https://github.com/elastic/kibana/issues/171520 required adding editable components for each field diffable rule field. It imposes some difficulties since it's quite problematic to reuse existing especially complex components like Data Source from Define Rule step component. This PR make little refactoring to the Define Rule step component to make it simpler and make it easier to reuse Data Source related code chunks scattered in Define Rule step component. You may notice some copy-paste chunks of Data Source editable component in the PR. At this stage it's the simplest way to proceed to avoid huge refactoring and potential new bugs. Taking into account deadlines for the task it looks like a good trade off. There is a plan to work on improvements for rules creation/editing forms later on. --- .../data_view_selector/index.test.tsx | 84 ------ .../components/data_view_selector/index.tsx | 152 ----------- .../__mocks__/use_data_views.ts | 11 + .../data_view_selector_field.test.tsx | 114 +++++++++ .../data_view_selector_field.tsx | 95 +++++++ .../data_view_selector_field/index.ts | 8 + .../translations.tsx | 9 +- .../use_data_views.ts | 45 ++++ .../step_define_rule/index.test.tsx | 100 +------- .../components/step_define_rule/index.tsx | 26 +- .../components/step_define_rule/schema.tsx | 49 +--- .../rule_creation_ui/pages/form.tsx | 2 +- .../pages/rule_creation/index.tsx | 25 +- .../pages/rule_editing/index.tsx | 24 +- .../data_view_id_validator_factory.ts | 31 +++ .../index_pattern_validator_factory.ts | 21 ++ .../rule_details/rule_definition_section.tsx | 2 +- .../final_edit/common_rule_field_edit.tsx | 4 +- .../custom_query_rule_field_edit.tsx | 20 +- .../final_edit/eql_rule_field_edit.tsx | 23 ++ .../fields/data_source/data_source_edit.tsx | 71 ++++++ .../data_source/data_source_edit_form.tsx | 104 ++++++++ .../data_source/data_source_info_text.tsx | 36 +++ .../data_source_type_selector_field.tsx | 68 +++++ .../fields/data_source/data_view_field.tsx | 18 ++ .../final_edit/fields/data_source/index.ts | 8 + .../fields/data_source/index_pattern_edit.tsx | 57 +++++ .../fields/data_source/translations.tsx | 15 ++ .../final_edit/fields/kql_query.tsx | 239 ------------------ .../final_edit/fields/kql_query/index.ts | 8 + .../fields/kql_query/kql_query_edit.tsx | 139 ++++++++++ .../fields/kql_query/kql_query_edit_form.tsx | 118 +++++++++ .../fields/rule_field_edit_component_props.ts | 22 ++ .../rule_field_edit_form_wrapper.tsx} | 69 +++-- .../three_way_diff/final_edit/final_edit.tsx | 4 +- .../final_edit/new_terms_rule_field_edit.tsx | 20 +- .../saved_query_rule_field_edit.tsx | 20 +- .../threat_match_rule_field_edit.tsx | 20 +- .../final_edit/threshold_rule_field_edit.tsx | 20 +- .../use_default_index_pattern.tsx | 16 +- .../translations/translations/fr-FR.json | 2 - .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - 43 files changed, 1115 insertions(+), 808 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector/index.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/__mocks__/use_data_views.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/data_view_selector_field.test.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/data_view_selector_field.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/index.ts rename x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/{data_view_selector => data_view_selector_field}/translations.tsx (84%) create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/use_data_views.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/data_view_id_validator_factory.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/index_pattern_validator_factory.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/eql_rule_field_edit.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit_form.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_info_text.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_type_selector_field.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_view_field.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/index.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/index_pattern_edit.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/translations.tsx delete mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/index.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit_form.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/rule_field_edit_component_props.ts rename x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/{field_form_wrapper.tsx => fields/rule_field_edit_form_wrapper.tsx} (61%) rename x-pack/plugins/security_solution/public/detection_engine/rule_management/{components/rule_details => hooks}/use_default_index_pattern.tsx (63%) diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector/index.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector/index.test.tsx deleted file mode 100644 index e37b21550852b..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector/index.test.tsx +++ /dev/null @@ -1,84 +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 React from 'react'; -import { shallow, mount } from 'enzyme'; - -import { DataViewSelector } from '.'; -import type { DataViewSelectorProps } from '.'; -import { TestProviders, useFormFieldMock } from '../../../../common/mock'; - -jest.mock('../../../../common/lib/kibana'); - -describe('data_view_selector', () => { - let mockField: DataViewSelectorProps['field']; - - beforeEach(() => { - mockField = useFormFieldMock({ - value: undefined, - }); - }); - - it('renders correctly', () => { - const Component = () => { - return ; - }; - const wrapper = shallow(); - - expect(wrapper.dive().find('[data-test-subj="pick-rule-data-source"]')).toHaveLength(1); - }); - - it('displays alerts on alerts warning when default security view selected', () => { - const wrapper = mount( - - ({ - value: 'security-solution-default', - })} - /> - - ); - - expect(wrapper.find('[data-test-subj="defaultSecurityDataViewWarning"]').exists()).toBeTruthy(); - }); - - it('does not display alerts on alerts warning when default security view is not selected', () => { - const wrapper = mount( - - ({ - value: '1234', - })} - /> - - ); - - expect(wrapper.find('[data-test-subj="defaultSecurityDataViewWarning"]').exists()).toBeFalsy(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector/index.tsx deleted file mode 100644 index 45efbfcadec8c..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector/index.tsx +++ /dev/null @@ -1,152 +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 React, { useMemo, useState, useEffect } from 'react'; - -import type { EuiComboBoxOptionOption } from '@elastic/eui'; -import { EuiCallOut, EuiComboBox, EuiFormRow, EuiSpacer } from '@elastic/eui'; - -import type { DataViewListItem } from '@kbn/data-views-plugin/common'; -import type { FieldHook } from '../../../../shared_imports'; -import { getFieldValidityAndErrorMessage } from '../../../../shared_imports'; -import * as i18n from './translations'; -import type { DefineStepRule } from '../../../../detections/pages/detection_engine/rules/types'; - -export interface DataViewSelectorProps { - kibanaDataViews: Record; - field: FieldHook; -} - -export const DataViewSelector = ({ kibanaDataViews, field }: DataViewSelectorProps) => { - let isInvalid; - let errorMessage; - let dataViewId: string | null | undefined; - - if (field != null) { - const fieldAndError = getFieldValidityAndErrorMessage(field); - isInvalid = fieldAndError.isInvalid; - errorMessage = fieldAndError.errorMessage; - dataViewId = field.value; - } - - const kibanaDataViewsDefined = useMemo( - () => kibanaDataViews != null && Object.keys(kibanaDataViews).length > 0, - [kibanaDataViews] - ); - - // Most likely case here is that a data view of an existing rule was deleted - // and can no longer be found - const selectedDataViewNotFound = useMemo( - () => - dataViewId != null && - dataViewId !== '' && - kibanaDataViewsDefined && - !Object.hasOwn(kibanaDataViews, dataViewId), - [kibanaDataViewsDefined, dataViewId, kibanaDataViews] - ); - const [selectedOption, setSelectedOption] = useState>>( - !selectedDataViewNotFound && dataViewId != null && dataViewId !== '' - ? [{ id: kibanaDataViews[dataViewId].id, label: kibanaDataViews[dataViewId].title }] - : [] - ); - - const [showDataViewAlertsOnAlertsWarning, setShowDataViewAlertsOnAlertsWarning] = useState(false); - - useEffect(() => { - if (!selectedDataViewNotFound && dataViewId) { - const dataViewsTitle = kibanaDataViews[dataViewId].title; - const dataViewsId = kibanaDataViews[dataViewId].id; - - setShowDataViewAlertsOnAlertsWarning(dataViewsId === 'security-solution-default'); - - setSelectedOption([{ id: dataViewsId, label: dataViewsTitle }]); - } else { - setSelectedOption([]); - } - }, [ - dataViewId, - field, - kibanaDataViews, - selectedDataViewNotFound, - setShowDataViewAlertsOnAlertsWarning, - ]); - - // TODO: optimize this, pass down array of data view ids - // at the same time we grab the data views in the top level form component - const dataViewOptions = useMemo(() => { - return kibanaDataViewsDefined - ? Object.values(kibanaDataViews).map((dv) => ({ - label: dv.title, - id: dv.id, - })) - : []; - }, [kibanaDataViewsDefined, kibanaDataViews]); - - const onChangeDataViews = (options: Array>) => { - const selectedDataViewOption = options; - setSelectedOption(selectedDataViewOption ?? []); - - if ( - selectedDataViewOption != null && - selectedDataViewOption.length > 0 && - selectedDataViewOption[0].id != null - ) { - const selectedDataViewId = selectedDataViewOption[0].id; - field?.setValue(selectedDataViewId); - } else { - field?.setValue(undefined); - } - }; - - return ( - <> - {selectedDataViewNotFound && dataViewId != null && ( - <> - -

{i18n.DATA_VIEW_NOT_FOUND_WARNING_DESCRIPTION(dataViewId)}

-
- - - )} - {showDataViewAlertsOnAlertsWarning && ( - <> - -

{i18n.DATA_VIEW_ALERTS_ON_ALERTS_WARNING_DESCRIPTION}

-
- - - )} - - - - - ); -}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/__mocks__/use_data_views.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/__mocks__/use_data_views.ts new file mode 100644 index 0000000000000..248729f1f46e7 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/__mocks__/use_data_views.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. + */ + +export const useDataViews = jest.fn().mockReturnValue({ + data: [], + isFetching: false, +}); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/data_view_selector_field.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/data_view_selector_field.test.tsx new file mode 100644 index 0000000000000..6cfdf060434b8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/data_view_selector_field.test.tsx @@ -0,0 +1,114 @@ +/* + * 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 { screen, render } from '@testing-library/react'; +import { TestProviders, useFormFieldMock } from '../../../../common/mock'; +import { DataViewSelectorField } from './data_view_selector_field'; +import { useDataViews } from './use_data_views'; + +jest.mock('../../../../common/lib/kibana'); +jest.mock('./use_data_views'); + +describe('data_view_selector', () => { + it('renders correctly', () => { + (useDataViews as jest.Mock).mockReturnValue({ data: [], isFetching: false }); + + render( + ({ + value: undefined, + })} + />, + { wrapper: TestProviders } + ); + + expect(screen.queryByTestId('pick-rule-data-source')).toBeInTheDocument(); + }); + + it('disables the combobox while data views are fetching', () => { + (useDataViews as jest.Mock).mockReturnValue({ data: [], isFetching: true }); + + render( + ({ + value: undefined, + })} + />, + { wrapper: TestProviders } + ); + + expect(screen.getByRole('combobox')).toBeDisabled(); + }); + + it('displays alerts on alerts warning when default security view selected', () => { + const dataViews = [ + { + id: 'security-solution-default', + title: + '-*elastic-cloud-logs-*,.alerts-security.alerts-default,apm-*-transaction*,auditbeat-*,endgame-*,filebeat-*,logs-*,packetbeat-*,traces-apm*,winlogbeat-*', + }, + { + id: '1234', + title: 'logs-*', + }, + ]; + (useDataViews as jest.Mock).mockReturnValue({ data: dataViews, isFetching: false }); + + render( + ({ + value: 'security-solution-default', + })} + />, + { wrapper: TestProviders } + ); + + expect(screen.queryByTestId('defaultSecurityDataViewWarning')).toBeInTheDocument(); + }); + + it('does not display alerts on alerts warning when default security view is not selected', () => { + const dataViews = [ + { + id: 'security-solution-default', + title: + '-*elastic-cloud-logs-*,.alerts-security.alerts-default,apm-*-transaction*,auditbeat-*,endgame-*,filebeat-*,logs-*,packetbeat-*,traces-apm*,winlogbeat-*', + }, + { + id: '1234', + title: 'logs-*', + }, + ]; + (useDataViews as jest.Mock).mockReturnValue({ data: dataViews, isFetching: false }); + + render( + ({ + value: '1234', + })} + />, + { wrapper: TestProviders } + ); + + expect(screen.queryByTestId('defaultSecurityDataViewWarning')).not.toBeInTheDocument(); + }); + + it('displays warning on missing data view', () => { + (useDataViews as jest.Mock).mockReturnValue({ data: [], isFetching: false }); + + render( + ({ + value: 'non-existent-id', + })} + />, + { wrapper: TestProviders } + ); + + expect(screen.queryByTestId('missingDataViewWarning')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/data_view_selector_field.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/data_view_selector_field.tsx new file mode 100644 index 0000000000000..aacd80ea53236 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/data_view_selector_field.tsx @@ -0,0 +1,95 @@ +/* + * 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, { useMemo, useCallback } from 'react'; +import type { EuiComboBoxOptionOption } from '@elastic/eui'; +import { EuiCallOut, EuiComboBox, EuiFormRow, EuiSpacer } from '@elastic/eui'; +import type { FieldHook } from '../../../../shared_imports'; +import { getFieldValidityAndErrorMessage } from '../../../../shared_imports'; +import { isDataViewIdValid } from '../../validators/data_view_id_validator_factory'; +import { useDataViews } from './use_data_views'; +import * as i18n from './translations'; + +const SECURITY_DEFAULT_DATA_VIEW_ID = 'security-solution-default'; + +export interface DataViewSelectorProps { + field: FieldHook; +} + +export function DataViewSelectorField({ field }: DataViewSelectorProps): JSX.Element { + const { data: dataViews, isFetching: areDataViewsFetching } = useDataViews(); + const fieldAndError = field ? getFieldValidityAndErrorMessage(field) : undefined; + const isInvalid = fieldAndError?.isInvalid; + const errorMessage = fieldAndError?.errorMessage; + const comboBoxOptions = useMemo( + () => + dataViews.map(({ id, title: label }) => ({ + id, + label, + })), + [dataViews] + ); + const selectedOption = useMemo( + () => comboBoxOptions.find(({ id }) => id === field.value), + [comboBoxOptions, field] + ); + + const handleDataViewsChange = useCallback( + (options: Array>) => field.setValue(options[0]?.id), + [field] + ); + + return ( + <> + {!areDataViewsFetching && isDataViewIdValid(field.value) && !selectedOption && ( + <> + +

{i18n.DATA_VIEW_NOT_FOUND_WARNING_DESCRIPTION(field.value)}

+
+ + + )} + {field.value === SECURITY_DEFAULT_DATA_VIEW_ID && ( + <> + +

{i18n.DATA_VIEW_ALERTS_ON_ALERTS_WARNING_DESCRIPTION}

+
+ + + )} + + + + + ); +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/index.ts new file mode 100644 index 0000000000000..5cc0e111b13de --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/index.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 * from './data_view_selector_field'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector/translations.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/translations.tsx similarity index 84% rename from x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector/translations.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/translations.tsx index eff760157e82f..717666ac0c0c1 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector/translations.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/translations.tsx @@ -31,7 +31,7 @@ export const DATA_VIEW_NOT_FOUND_WARNING_DESCRIPTION = (dataView: string) => } ); -export const DDATA_VIEW_ALERTS_ON_ALERTS_WARNING_LABEL = i18n.translate( +export const DATA_VIEW_ALERTS_ON_ALERTS_WARNING_LABEL = i18n.translate( 'xpack.securitySolution.detectionEngine.stepDefineRule.dataViewIncludesAlertsIndexLabel', { defaultMessage: 'Default Security data view', @@ -45,3 +45,10 @@ export const DATA_VIEW_ALERTS_ON_ALERTS_WARNING_DESCRIPTION = i18n.translate( 'The default Security data view includes the alerts index. This could result in redundant alerts being generated from existing alerts.', } ); + +export const DATA_VIEWS_FETCH_ERROR = i18n.translate( + 'xpack.securitySolution.detectionEngine.stepDefineRule.dataViewFetchError', + { + defaultMessage: 'Unable to retrieve available data views', + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/use_data_views.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/use_data_views.ts new file mode 100644 index 0000000000000..a68aa4f976269 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/data_view_selector_field/use_data_views.ts @@ -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 { useEffect, useState } from 'react'; +import type { DataViewListItem } from '@kbn/data-views-plugin/common'; +import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; +import { useKibana } from '../../../../common/lib/kibana'; +import * as i18n from './translations'; + +interface UseDataViewsResult { + data: DataViewListItem[]; + isFetching: boolean; +} + +/** + * Fetches known Kibana data views from the Data View Service. + */ +export function useDataViews(): UseDataViewsResult { + const { + data: { dataViews: dataViewsService }, + } = useKibana().services; + const { addError } = useAppToasts(); + + const [isFetching, setIsFetching] = useState(false); + const [dataViews, setDataViews] = useState([]); + + useEffect(() => { + setIsFetching(true); + (async () => { + try { + setDataViews(await dataViewsService.getIdsWithTitle(true)); + } catch (e) { + addError(e, { title: i18n.DATA_VIEWS_FETCH_ERROR }); + } finally { + setIsFetching(false); + } + })(); + }, [dataViewsService, addError]); + + return { data: dataViews, isFetching }; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.test.tsx index 3e7d19ad7db5f..cc8f2abda9c4e 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.test.tsx @@ -48,6 +48,8 @@ jest.mock('../ai_assistant', () => { }; }); +jest.mock('../data_view_selector_field/use_data_views'); + const mockRedirectLegacyUrl = jest.fn(); const mockGetLegacyUrlConflict = jest.fn(); jest.mock('../../../../common/lib/kibana', () => { @@ -79,104 +81,6 @@ jest.mock('../../../../common/lib/kibana', () => { }, }, data: { - dataViews: { - getIdsWithTitle: async () => - Promise.resolve([{ id: 'myfakeid', title: 'hello*,world*,refreshed*' }]), - create: async ({ title }: { title: string }) => - Promise.resolve({ - id: 'myfakeid', - matchedIndices: ['hello', 'world', 'refreshed'], - fields: [ - { - name: 'bytes', - type: 'number', - esTypes: ['long'], - aggregatable: true, - searchable: true, - count: 10, - readFromDocValues: true, - scripted: false, - isMapped: true, - }, - { - name: 'ssl', - type: 'boolean', - esTypes: ['boolean'], - aggregatable: true, - searchable: true, - count: 20, - readFromDocValues: true, - scripted: false, - isMapped: true, - }, - { - name: '@timestamp', - type: 'date', - esTypes: ['date'], - aggregatable: true, - searchable: true, - count: 30, - readFromDocValues: true, - scripted: false, - isMapped: true, - }, - ], - getIndexPattern: () => 'hello*,world*,refreshed*', - getRuntimeMappings: () => ({ - myfield: { - type: 'keyword', - }, - }), - }), - get: async (dataViewId: string, displayErrors?: boolean, refreshFields = false) => - Promise.resolve({ - id: dataViewId, - matchedIndices: refreshFields - ? ['hello', 'world', 'refreshed'] - : ['hello', 'world'], - fields: [ - { - name: 'bytes', - type: 'number', - esTypes: ['long'], - aggregatable: true, - searchable: true, - count: 10, - readFromDocValues: true, - scripted: false, - isMapped: true, - }, - { - name: 'ssl', - type: 'boolean', - esTypes: ['boolean'], - aggregatable: true, - searchable: true, - count: 20, - readFromDocValues: true, - scripted: false, - isMapped: true, - }, - { - name: '@timestamp', - type: 'date', - esTypes: ['date'], - aggregatable: true, - searchable: true, - count: 30, - readFromDocValues: true, - scripted: false, - isMapped: true, - }, - ], - getIndexPattern: () => 'hello*,world*,refreshed*', - getRuntimeMappings: () => ({ - myfield: { - type: 'keyword', - }, - }), - }), - }, search: { search: () => ({ subscribe: () => ({ diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.tsx index 6b9780b8c029b..99fb8f2ba469e 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/index.tsx @@ -11,7 +11,6 @@ import { EuiFlexGroup, EuiFlexItem, EuiFormRow, - EuiLoadingSpinner, EuiSpacer, EuiButtonGroup, EuiText, @@ -82,7 +81,7 @@ import { isSuppressionRuleInGA, } from '../../../../../common/detection_engine/utils'; import { EqlQueryBar } from '../eql_query_bar'; -import { DataViewSelector } from '../data_view_selector'; +import { DataViewSelectorField } from '../data_view_selector_field'; import { ThreatMatchInput } from '../threatmatch_input'; import { useFetchIndex } from '../../../../common/containers/source'; import { NewTermsFields } from '../new_terms_fields'; @@ -184,7 +183,6 @@ const StepDefineRuleComponent: FC = ({ isLoading, isQueryBarValid, isUpdateView = false, - kibanaDataViews, optionsSelected, queryBarSavedId, queryBarTitle, @@ -653,21 +651,6 @@ const StepDefineRuleComponent: FC = ({ [dataSourceType] ); - const DataViewSelectorMemo = useMemo(() => { - return kibanaDataViews == null || Object.keys(kibanaDataViews).length === 0 ? ( - - ) : ( - - ); - }, [kibanaDataViews]); - const DataSource = useMemo(() => { return ( @@ -714,7 +697,11 @@ const StepDefineRuleComponent: FC = ({ - {DataViewSelectorMemo} + = ({ dataSourceType, onChangeDataSource, dataViewIndexPatternToggleButtonOptions, - DataViewSelectorMemo, indexModified, handleResetIndices, ]); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/schema.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/schema.tsx index 5c8d8d89c46d0..fc8468b094fa1 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/schema.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/step_define_rule/schema.tsx @@ -44,6 +44,8 @@ import { EQL_SEQUENCE_SUPPRESSION_GROUPBY_VALIDATION_TEXT, } from './translations'; import { getQueryRequiredMessage } from './utils'; +import { dataViewIdValidatorFactory } from '../../validators/data_view_id_validator_factory'; +import { indexPatternValidatorFactory } from '../../validators/index_pattern_validator_factory'; export const schema: FormSchema = { index: { @@ -59,27 +61,18 @@ export const schema: FormSchema = { helpText: {INDEX_HELPER_TEXT}, validations: [ { - validator: ( - ...args: Parameters - ): ReturnType> | undefined => { + validator: (...args: Parameters) => { const [{ formData }] = args; - const skipValidation = + + if ( isMlRule(formData.ruleType) || isEsqlRule(formData.ruleType) || - formData.dataSourceType !== DataSourceType.IndexPatterns; - - if (skipValidation) { + formData.dataSourceType !== DataSourceType.IndexPatterns + ) { return; } - return fieldValidators.emptyField( - i18n.translate( - 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.outputIndiceNameFieldRequiredError', - { - defaultMessage: 'A minimum of one index pattern is required.', - } - ) - )(...args); + return indexPatternValidatorFactory()(...args); }, }, ], @@ -94,32 +87,14 @@ export const schema: FormSchema = { fieldsToValidateOnChange: ['dataViewId'], validations: [ { - validator: ( - ...args: Parameters - ): ReturnType> | undefined => { - const [{ path, formData }] = args; - // the dropdown defaults the dataViewId to an empty string somehow on render.. - // need to figure this out. - const notEmptyDataViewId = formData.dataViewId != null && formData.dataViewId !== ''; - - const skipValidation = - isMlRule(formData.ruleType) || - notEmptyDataViewId || - formData.dataSourceType !== DataSourceType.DataView; + validator: (...args: Parameters) => { + const [{ formData }] = args; - if (skipValidation) { + if (isMlRule(formData.ruleType) || formData.dataSourceType !== DataSourceType.DataView) { return; } - return { - path, - message: i18n.translate( - 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.dataViewSelectorFieldRequired', - { - defaultMessage: 'Please select an available Data View or Index Pattern.', - } - ), - }; + return dataViewIdValidatorFactory()(...args); }, }, ], diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/form.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/form.tsx index 90b302c3bc904..9e232e4bff2be 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/form.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/form.tsx @@ -149,7 +149,7 @@ export const useRuleIndexPattern = ({ if (dataSourceType === DataSourceType.DataView) { const fetchDataView = async () => { - if (dataViewId != null) { + if (dataViewId != null && dataViewId !== '') { const dv = await data.dataViews.get(dataViewId); setIndexPattern(dv); } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/index.tsx index 28d137ac522ae..0c6a6fb07ce5c 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_creation/index.tsx @@ -19,8 +19,6 @@ import { import React, { memo, useCallback, useRef, useState, useMemo, useEffect } from 'react'; import styled from 'styled-components'; -import type { DataViewListItem } from '@kbn/data-views-plugin/common'; - import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; import { isMlRule, @@ -123,11 +121,7 @@ const CreateRulePageComponent: React.FC = () => { useListsConfig(); const { addSuccess } = useAppToasts(); const { navigateToApp } = useKibana().services.application; - const { - application, - data: { dataViews }, - triggersActionsUi, - } = useKibana().services; + const { application, triggersActionsUi } = useKibana().services; const loading = userInfoLoading || listsConfigLoading; const [activeStep, setActiveStep] = useState(RuleStep.defineRule); const getNextStep = (step: RuleStep): RuleStep | undefined => @@ -204,7 +198,6 @@ const CreateRulePageComponent: React.FC = () => { const { mutateAsync: createRule, isLoading: isCreateRuleLoading } = useCreateRule(); const ruleType = defineStepData.ruleType; const actionMessageParams = useMemo(() => getActionMessageParams(ruleType), [ruleType]); - const [dataViewOptions, setDataViewOptions] = useState<{ [x: string]: DataViewListItem }>({}); const [isRulePreviewVisible, setIsRulePreviewVisible] = useState(true); const collapseFn = useRef<() => void | undefined>(); const [prevRuleType, setPrevRuleType] = useState(); @@ -256,20 +249,6 @@ const CreateRulePageComponent: React.FC = () => { const { starting: isStartingJobs, startMlJobs } = useStartMlJobs(); - useEffect(() => { - const fetchDV = async () => { - const dataViewsRefs = await dataViews.getIdsWithTitle(); - const dataViewIdIndexPatternMap = dataViewsRefs.reduce( - (acc, item) => ({ - ...acc, - [item.id]: item, - }), - {} - ); - setDataViewOptions(dataViewIdIndexPatternMap); - }; - fetchDV(); - }, [dataViews]); const { indexPattern, isIndexPatternLoading } = useRuleIndexPattern({ dataSourceType: defineStepData.dataSourceType, index: memoizedIndex, @@ -573,7 +552,6 @@ const CreateRulePageComponent: React.FC = () => { > { ), [ activeStep, - dataViewOptions, defineRuleNextStep, defineStepData.dataSourceType, defineStepData.groupByFields, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_editing/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_editing/index.tsx index 9151e6965bd11..1657f57ec83e8 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_editing/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/pages/rule_editing/index.tsx @@ -18,11 +18,9 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import type { FC } from 'react'; -import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import React, { memo, useCallback, useMemo, useRef, useState } from 'react'; import { useParams } from 'react-router-dom'; -import type { DataViewListItem } from '@kbn/data-views-plugin/common'; - import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; import { isEsqlRule } from '../../../../../common/detection_engine/utils'; import { RulePreview } from '../../components/rule_preview'; @@ -85,7 +83,7 @@ const EditRulePageComponent: FC<{ rule: RuleResponse }> = ({ rule }) => { ] = useUserData(); const { loading: listsConfigLoading, needsConfiguration: needsListsConfiguration } = useListsConfig(); - const { data: dataServices, application, triggersActionsUi } = useKibana().services; + const { application, triggersActionsUi } = useKibana().services; const { navigateToApp } = application; const { detailName: ruleId } = useParams<{ detailName: string }>(); @@ -94,7 +92,6 @@ const EditRulePageComponent: FC<{ rule: RuleResponse }> = ({ rule }) => { rule.immutable ? RuleStep.ruleActions : RuleStep.defineRule ); const { mutateAsync: updateRule, isLoading } = useUpdateRule(); - const [dataViewOptions, setDataViewOptions] = useState<{ [x: string]: DataViewListItem }>({}); const [isRulePreviewVisible, setIsRulePreviewVisible] = useState(true); const collapseFn = useRef<() => void | undefined>(); const [isQueryBarValid, setIsQueryBarValid] = useState(false); @@ -103,21 +100,6 @@ const EditRulePageComponent: FC<{ rule: RuleResponse }> = ({ rule }) => { const [isSaveWithErrorsModalVisible, setIsSaveWithErrorsModalVisible] = useState(false); const [nonBlockingRuleErrors, setNonBlockingRuleErrors] = useState([]); - useEffect(() => { - const fetchDataViews = async () => { - const dataViewsRefs = await dataServices.dataViews.getIdsWithTitle(); - const dataViewIdIndexPatternMap = dataViewsRefs.reduce( - (acc, item) => ({ - ...acc, - [item.id]: item, - }), - {} - ); - setDataViewOptions(dataViewIdIndexPatternMap); - }; - fetchDataViews(); - }, [dataServices.dataViews]); - const backOptions = useMemo( () => ({ path: getRuleDetailsUrl(ruleId ?? ''), @@ -241,7 +223,6 @@ const EditRulePageComponent: FC<{ rule: RuleResponse }> = ({ rule }) => { = ({ rule }) => { loading, isSavedQueryLoading, isLoading, - dataViewOptions, indicesConfig, threatIndicesConfig, savedQuery, diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/data_view_id_validator_factory.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/data_view_id_validator_factory.ts new file mode 100644 index 0000000000000..57ef5ff6e0133 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/data_view_id_validator_factory.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import type { FormData, ValidationFunc } from '../../../shared_imports'; + +export function dataViewIdValidatorFactory(): ValidationFunc { + return (...args) => { + const [{ path, value }] = args; + + return !isDataViewIdValid(value) + ? { + path, + message: i18n.translate( + 'xpack.securitySolution.ruleManagement.ruleCreation.validation.dataView.requiredError', + { + defaultMessage: 'Please select an available Data View.', + } + ), + } + : undefined; + }; +} + +export function isDataViewIdValid(dataViewId: unknown): dataViewId is string { + return typeof dataViewId === 'string' && dataViewId !== ''; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/index_pattern_validator_factory.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/index_pattern_validator_factory.ts new file mode 100644 index 0000000000000..9962d3b835b3c --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/validators/index_pattern_validator_factory.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 { i18n } from '@kbn/i18n'; +import type { ERROR_CODE } from '../../../shared_imports'; +import { fieldValidators, type FormData, type ValidationFunc } from '../../../shared_imports'; + +export function indexPatternValidatorFactory(): ValidationFunc { + return fieldValidators.emptyField( + i18n.translate( + 'xpack.securitySolution.ruleManagement.ruleCreation.validation.indexPatterns.requiredError', + { + defaultMessage: 'A minimum of one index pattern is required.', + } + ) + ); +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx index 184633d813675..623ae20fa484f 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_definition_section.tsx @@ -58,7 +58,7 @@ import { useRequiredFieldsStyles, } from './rule_definition_section.styles'; import { getQueryLanguageLabel } from './helpers'; -import { useDefaultIndexPattern } from './use_default_index_pattern'; +import { useDefaultIndexPattern } from '../../hooks/use_default_index_pattern'; interface SavedQueryNameProps { savedQueryName: string; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/common_rule_field_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/common_rule_field_edit.tsx index 0cb7ce3982868..fefd35fcfaf65 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/common_rule_field_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/common_rule_field_edit.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { FieldFormWrapper } from './field_form_wrapper'; +import { RuleFieldEditFormWrapper } from './fields/rule_field_edit_form_wrapper'; import { NameEdit, nameSchema } from './fields/name'; import type { UpgradeableCommonFields } from '../../../../model/prebuilt_rule_upgrade/fields'; interface CommonRuleFieldEditProps { @@ -16,7 +16,7 @@ interface CommonRuleFieldEditProps { export function CommonRuleFieldEdit({ fieldName }: CommonRuleFieldEditProps) { switch (fieldName) { case 'name': - return ; + return ; default: return null; // Will be replaced with `assertUnreachable(fieldName)` once all fields are implemented } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/custom_query_rule_field_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/custom_query_rule_field_edit.tsx index 3dc3cc5b87023..e71f061f140e4 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/custom_query_rule_field_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/custom_query_rule_field_edit.tsx @@ -6,14 +6,9 @@ */ import React from 'react'; -import { FieldFormWrapper } from './field_form_wrapper'; -import { - KqlQueryEdit, - kqlQuerySchema, - kqlQuerySerializer, - kqlQueryDeserializer, -} from './fields/kql_query'; import type { UpgradeableCustomQueryFields } from '../../../../model/prebuilt_rule_upgrade/fields'; +import { KqlQueryEditForm } from './fields/kql_query'; +import { DataSourceEditForm } from './fields/data_source'; interface CustomQueryRuleFieldEditProps { fieldName: UpgradeableCustomQueryFields; @@ -22,14 +17,9 @@ interface CustomQueryRuleFieldEditProps { export function CustomQueryRuleFieldEdit({ fieldName }: CustomQueryRuleFieldEditProps) { switch (fieldName) { case 'kql_query': - return ( - - ); + return ; + case 'data_source': + return ; default: return null; // Will be replaced with `assertUnreachable(fieldName)` once all fields are implemented } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/eql_rule_field_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/eql_rule_field_edit.tsx new file mode 100644 index 0000000000000..a15cc87b3324c --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/eql_rule_field_edit.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { UpgradeableEqlFields } from '../../../../model/prebuilt_rule_upgrade/fields'; +import { DataSourceEditForm } from './fields/data_source'; + +interface EqlRuleFieldEditProps { + fieldName: UpgradeableEqlFields; +} + +export function EqlRuleFieldEdit({ fieldName }: EqlRuleFieldEditProps) { + switch (fieldName) { + case 'data_source': + return ; + default: + return null; // Will be replaced with `assertUnreachable(fieldName)` once all fields are implemented + } +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit.tsx new file mode 100644 index 0000000000000..2f697288221cf --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit.tsx @@ -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 React from 'react'; +import type { PropsWithChildren } from 'react'; +import { css } from '@emotion/css'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { DataSourceType } from '../../../../../../../../../common/api/detection_engine/prebuilt_rules'; +import { UseMultiFields } from '../../../../../../../../shared_imports'; +import type { RuleFieldEditComponentProps } from '../rule_field_edit_component_props'; +import { IndexPatternField } from './index_pattern_edit'; +import { DataSourceInfoText } from './data_source_info_text'; +import { DataViewField } from './data_view_field'; +import { DataSourceTypeSelectorField } from './data_source_type_selector_field'; + +export function DataSourceEdit({ resetForm }: RuleFieldEditComponentProps): JSX.Element { + return ( + + fields={{ + type: { + path: 'type', + }, + indexPatterns: { + path: 'index_patterns', + }, + dataViewId: { + path: 'data_view_id', + }, + }} + > + {({ type, indexPatterns, dataViewId }) => ( + + + + + + + + + + + + + + + + + )} + + ); +} + +interface TabProps { + visible: boolean; +} + +const hidden = css` + display: none; +`; + +function TabContent({ visible, children }: PropsWithChildren): JSX.Element { + return ; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit_form.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit_form.tsx new file mode 100644 index 0000000000000..b1dc66ad032d1 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_edit_form.tsx @@ -0,0 +1,104 @@ +/* + * 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 { EuiText } from '@elastic/eui'; +import { indexPatternValidatorFactory } from '../../../../../../../rule_creation_ui/validators/index_pattern_validator_factory'; +import { dataViewIdValidatorFactory } from '../../../../../../../rule_creation_ui/validators/data_view_id_validator_factory'; +import type { ValidationFunc, ERROR_CODE } from '../../../../../../../../shared_imports'; +import { + type FormData, + type FormSchema, + FIELD_TYPES, +} from '../../../../../../../../shared_imports'; +import { DataSourceType } from '../../../../../../../../../common/api/detection_engine/prebuilt_rules'; +import { RuleFieldEditFormWrapper } from '../rule_field_edit_form_wrapper'; +import { DataSourceEdit } from './data_source_edit'; +import { INDEX_HELPER_TEXT } from '../../../../../../../rule_creation_ui/components/step_define_rule/translations'; + +export function DataSourceEditForm(): JSX.Element { + return ( + + ); +} + +function dataSourceDeserializer(defaultValue: FormData): FormData { + if (!defaultValue.data_source) { + throw new Error(`dataSourceDeserializer expects "data_source" field`); + } + + return defaultValue.data_source; +} + +function dataSourceSerializer(formData: FormData): FormData { + return { + data_source: formData, + }; +} + +const dataSourceSchema = { + type: { + default: DataSourceType.index_patterns, + }, + index_patterns: { + defaultValue: [], + type: FIELD_TYPES.COMBO_BOX, + label: i18n.translate( + 'xpack.securitySolution.ruleManagement.threeWayDiff.finalEdit.indexPatterns.label', + { + defaultMessage: 'Index patterns', + } + ), + helpText: {INDEX_HELPER_TEXT}, + validations: [ + { + validator: ( + ...args: Parameters + ): ReturnType> | undefined => { + const [{ formData }] = args; + + if (formData.type !== DataSourceType.index_patterns) { + return; + } + + return indexPatternValidatorFactory()(...args); + }, + }, + ], + }, + data_view_id: { + label: i18n.translate( + 'xpack.securitySolution.ruleManagement.threeWayDiff.finalEdit.dataViewSelector.name', + { + defaultMessage: 'Data view', + } + ), + validations: [ + { + validator: (...args: Parameters) => { + const [{ formData }] = args; + + if (formData.type !== DataSourceType.data_view) { + return; + } + + return dataViewIdValidatorFactory()(...args); + }, + }, + ], + }, +} as FormSchema<{ + type: string; + index_patterns: string[]; + data_view_id: string; +}>; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_info_text.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_info_text.tsx new file mode 100644 index 0000000000000..737dcf2061f29 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_info_text.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiText } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { DocLink } from '../../../../../../../../common/components/links_to_docs/doc_link'; + +export function DataSourceInfoText(): JSX.Element { + return ( + + + + + + + + ); +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_type_selector_field.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_type_selector_field.tsx new file mode 100644 index 0000000000000..f43051853a4d4 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_source_type_selector_field.tsx @@ -0,0 +1,68 @@ +/* + * 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, { useCallback, useMemo } from 'react'; +import { i18n as i18nCore } from '@kbn/i18n'; +import type { EuiButtonGroupOptionProps } from '@elastic/eui'; +import { EuiButtonGroup } from '@elastic/eui'; +import { DataSourceType } from '../../../../../../../../../common/api/detection_engine/prebuilt_rules'; +import type { FieldHook } from '../../../../../../../../shared_imports'; +import type { ResetFormFn } from '../rule_field_edit_component_props'; + +interface DataSourceTypeSelectorFieldProps { + field: FieldHook; + resetForm: ResetFormFn; +} + +export function DataSourceTypeSelectorField({ + field, + resetForm, +}: DataSourceTypeSelectorFieldProps): JSX.Element { + const dataViewIndexPatternToggleButtonOptions: EuiButtonGroupOptionProps[] = useMemo( + () => [ + { + id: DataSourceType.index_patterns, + label: i18nCore.translate( + 'xpack.securitySolution.ruleDefine.indexTypeSelect.indexPattern', + { + defaultMessage: 'Index Patterns', + } + ), + iconType: field.value === DataSourceType.index_patterns ? 'checkInCircleFilled' : 'empty', + 'data-test-subj': `rule-index-toggle-${DataSourceType.index_patterns}`, + }, + { + id: DataSourceType.data_view, + label: i18nCore.translate('xpack.securitySolution.ruleDefine.indexTypeSelect.dataView', { + defaultMessage: 'Data View', + }), + iconType: field.value === DataSourceType.data_view ? 'checkInCircleFilled' : 'empty', + 'data-test-subj': `rule-index-toggle-${DataSourceType.data_view}`, + }, + ], + [field.value] + ); + const handleDataSourceChange = useCallback( + (optionId: string) => { + field.setValue(optionId); + resetForm({ resetValues: false }); + }, + [field, resetForm] + ); + + return ( + + ); +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_view_field.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_view_field.tsx new file mode 100644 index 0000000000000..b534817596e66 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/data_view_field.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { DataViewSelectorField } from '../../../../../../../rule_creation_ui/components/data_view_selector_field'; +import type { FieldHook } from '../../../../../../../../shared_imports'; + +interface DataViewFieldProps { + field: FieldHook; +} + +export function DataViewField({ field }: DataViewFieldProps): JSX.Element { + return ; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/index.ts new file mode 100644 index 0000000000000..407874ac13143 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/index.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 * from './data_source_edit_form'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/index_pattern_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/index_pattern_edit.tsx new file mode 100644 index 0000000000000..ec9f294af7612 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/index_pattern_edit.tsx @@ -0,0 +1,57 @@ +/* + * 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, { useCallback } from 'react'; +import { isEqual } from 'lodash'; +import { css } from '@emotion/css'; +import { EuiButtonEmpty } from '@elastic/eui'; +import { useDefaultIndexPattern } from '../../../../../../hooks/use_default_index_pattern'; +import type { FieldHook } from '../../../../../../../../shared_imports'; +import { Field } from '../../../../../../../../shared_imports'; +import * as i18n from './translations'; + +interface IndexPatternFieldProps { + field: FieldHook; +} + +export function IndexPatternField({ field }: IndexPatternFieldProps): JSX.Element { + const defaultIndexPattern = useDefaultIndexPattern(); + const isIndexModified = !isEqual(field.value, defaultIndexPattern); + + const handleResetIndices = useCallback( + () => field.setValue(defaultIndexPattern), + [field, defaultIndexPattern] + ); + + return ( + } + idAria="indexPatternEdit" + data-test-subj="indexPatternEdit" + euiFieldProps={{ + fullWidth: true, + placeholder: '', + }} + labelAppend={ + isIndexModified ? ( + + {i18n.RESET_DEFAULT_INDEX} + + ) : undefined + } + /> + ); +} + +const xxsHeight = css` + height: 16px; +`; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/translations.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/translations.tsx new file mode 100644 index 0000000000000..c1aede50af35f --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/data_source/translations.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const RESET_DEFAULT_INDEX = i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.resetDefaultIndicesButton', + { + defaultMessage: 'Reset to default index patterns', + } +); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query.tsx deleted file mode 100644 index 69a00436b6992..0000000000000 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query.tsx +++ /dev/null @@ -1,239 +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 React, { useCallback } from 'react'; -import useToggle from 'react-use/lib/useToggle'; -import { css } from '@emotion/css'; -import { EuiButtonEmpty } from '@elastic/eui'; -import type { Type } from '@kbn/securitysolution-io-ts-alerting-types'; -import type { FormSchema, FormData } from '../../../../../../../shared_imports'; -import { HiddenField, UseField } from '../../../../../../../shared_imports'; -import { schema } from '../../../../../../rule_creation_ui/components/step_define_rule/schema'; -import { QueryBarDefineRule } from '../../../../../../rule_creation_ui/components/query_bar'; -import type { FieldValueQueryBar } from '../../../../../../rule_creation_ui/components/query_bar'; -import * as stepDefineRuleI18n from '../../../../../../rule_creation_ui/components/step_define_rule/translations'; -import { useRuleIndexPattern } from '../../../../../../rule_creation_ui/pages/form'; -import { - DataSourceType as DataSourceTypeSnakeCase, - KqlQueryLanguage, - KqlQueryType, - RuleQuery, - SavedQueryId, - RuleKqlQuery, -} from '../../../../../../../../common/api/detection_engine'; -import type { - DiffableRule, - DiffableRuleTypes, - InlineKqlQuery, - SavedKqlQuery, -} from '../../../../../../../../common/api/detection_engine'; -import { useDefaultIndexPattern } from '../../../use_default_index_pattern'; -import { DataSourceType } from '../../../../../../../detections/pages/detection_engine/rules/types'; -import { isFilters } from '../../../helpers'; -import type { SetRuleQuery } from '../../../../../../../detections/containers/detection_engine/rules/use_rule_from_timeline'; -import { useRuleFromTimeline } from '../../../../../../../detections/containers/detection_engine/rules/use_rule_from_timeline'; -import { useGetSavedQuery } from '../../../../../../../detections/pages/detection_engine/rules/use_get_saved_query'; - -export const kqlQuerySchema = { - ruleType: schema.ruleType, - queryBar: schema.queryBar, -} as FormSchema<{ - ruleType: DiffableRuleTypes; - queryBar: FieldValueQueryBar; -}>; - -interface KqlQueryEditProps { - finalDiffableRule: DiffableRule; - setValidity: (isValid: boolean) => void; - setFieldValue: (fieldName: string, fieldValue: unknown) => void; -} - -export function KqlQueryEdit({ - finalDiffableRule, - setValidity, - setFieldValue, -}: KqlQueryEditProps): JSX.Element { - const defaultIndexPattern = useDefaultIndexPattern(); - const indexPatternParameters = getUseRuleIndexPatternParameters( - finalDiffableRule, - defaultIndexPattern - ); - const { indexPattern, isIndexPatternLoading } = useRuleIndexPattern(indexPatternParameters); - - const [isTimelineSearchOpen, toggleIsTimelineSearchOpen] = useToggle(false); - - const handleSetRuleFromTimeline = useCallback( - ({ queryBar: timelineQueryBar }) => { - setFieldValue('queryBar', timelineQueryBar); - }, - [setFieldValue] - ); - - const { onOpenTimeline } = useRuleFromTimeline(handleSetRuleFromTimeline); - - const isSavedQueryRule = finalDiffableRule.type === 'saved_query'; - - const { savedQuery } = useGetSavedQuery({ - savedQueryId: getSavedQueryId(finalDiffableRule), - ruleType: finalDiffableRule.type, - }); - - return ( - <> - - - ), - }} - component={QueryBarDefineRule} - componentProps={{ - indexPattern, - isLoading: isIndexPatternLoading, - openTimelineSearch: isTimelineSearchOpen, - onCloseTimelineSearch: toggleIsTimelineSearchOpen, - onValidityChange: setValidity, - onOpenTimeline, - isDisabled: isSavedQueryRule, - defaultSavedQuery: savedQuery, - resetToSavedQuery: isSavedQueryRule, - }} - /> - - ); -} - -const timelineButtonClassName = css` - height: 18px; - font-size: 12px; -`; - -function ImportTimelineQueryButton({ - handleOpenTimelineSearch, -}: { - handleOpenTimelineSearch: () => void; -}) { - return ( - - {stepDefineRuleI18n.IMPORT_TIMELINE_QUERY} - - ); -} - -export function kqlQuerySerializer(formData: FormData): { - kql_query: RuleKqlQuery; -} { - const formValue = formData as { ruleType: Type; queryBar: FieldValueQueryBar }; - - if (formValue.ruleType === 'saved_query') { - const savedQueryId = SavedQueryId.parse(formValue.queryBar.saved_id); - - const savedKqlQuery: SavedKqlQuery = { - type: KqlQueryType.saved_query, - saved_query_id: savedQueryId, - }; - - return { - kql_query: savedKqlQuery, - }; - } - - const query = RuleQuery.parse(formValue.queryBar.query.query); - const language = KqlQueryLanguage.parse(formValue.queryBar.query.language); - - const inlineKqlQuery: InlineKqlQuery = { - type: KqlQueryType.inline_query, - query, - language, - filters: formValue.queryBar.filters, - }; - - return { kql_query: inlineKqlQuery }; -} - -export function kqlQueryDeserializer( - fieldValue: FormData, - finalDiffableRule: DiffableRule -): { - ruleType: Type; - queryBar: FieldValueQueryBar; -} { - const parsedFieldValue = RuleKqlQuery.parse(fieldValue); - - if (parsedFieldValue.type === KqlQueryType.inline_query) { - const returnValue = { - ruleType: finalDiffableRule.type, - queryBar: { - query: { - query: parsedFieldValue.query, - language: parsedFieldValue.language, - }, - filters: isFilters(parsedFieldValue.filters) ? parsedFieldValue.filters : [], - saved_id: null, - }, - }; - - return returnValue; - } - - const returnValue = { - ruleType: finalDiffableRule.type, - queryBar: { - query: { - query: '', - language: '', - }, - filters: [], - saved_id: parsedFieldValue.saved_query_id, - }, - }; - - return returnValue; -} - -interface UseRuleIndexPatternParameters { - dataSourceType: DataSourceType; - index: string[]; - dataViewId: string | undefined; -} - -function getUseRuleIndexPatternParameters( - finalDiffableRule: DiffableRule, - defaultIndexPattern: string[] -): UseRuleIndexPatternParameters { - if (!('data_source' in finalDiffableRule) || !finalDiffableRule.data_source) { - return { - dataSourceType: DataSourceType.IndexPatterns, - index: defaultIndexPattern, - dataViewId: undefined, - }; - } - if (finalDiffableRule.data_source.type === DataSourceTypeSnakeCase.data_view) { - return { - dataSourceType: DataSourceType.DataView, - index: [], - dataViewId: finalDiffableRule.data_source.data_view_id, - }; - } - return { - dataSourceType: DataSourceType.IndexPatterns, - index: finalDiffableRule.data_source.index_patterns, - dataViewId: undefined, - }; -} - -function getSavedQueryId(diffableRule: DiffableRule): string | undefined { - if (diffableRule.type === 'saved_query' && 'saved_query_id' in diffableRule.kql_query) { - return diffableRule.kql_query.saved_query_id; - } - - return undefined; -} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/index.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/index.ts new file mode 100644 index 0000000000000..f04cdb36c19a9 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/index.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 * from './kql_query_edit_form'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit.tsx new file mode 100644 index 0000000000000..e1e4ddb0d14e9 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit.tsx @@ -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 React, { useCallback } from 'react'; +import useToggle from 'react-use/lib/useToggle'; +import { css } from '@emotion/css'; +import { EuiButtonEmpty } from '@elastic/eui'; +import { schema } from '../../../../../../../rule_creation_ui/components/step_define_rule/schema'; +import { HiddenField, UseField } from '../../../../../../../../shared_imports'; +import { QueryBarDefineRule } from '../../../../../../../rule_creation_ui/components/query_bar'; +import * as stepDefineRuleI18n from '../../../../../../../rule_creation_ui/components/step_define_rule/translations'; +import { useRuleIndexPattern } from '../../../../../../../rule_creation_ui/pages/form'; +import { DataSourceType as DataSourceTypeSnakeCase } from '../../../../../../../../../common/api/detection_engine'; +import type { DiffableRule } from '../../../../../../../../../common/api/detection_engine'; +import { useDefaultIndexPattern } from '../../../../../../hooks/use_default_index_pattern'; +import { DataSourceType } from '../../../../../../../../detections/pages/detection_engine/rules/types'; +import type { SetRuleQuery } from '../../../../../../../../detections/containers/detection_engine/rules/use_rule_from_timeline'; +import { useRuleFromTimeline } from '../../../../../../../../detections/containers/detection_engine/rules/use_rule_from_timeline'; +import { useGetSavedQuery } from '../../../../../../../../detections/pages/detection_engine/rules/use_get_saved_query'; +import type { RuleFieldEditComponentProps } from '../rule_field_edit_component_props'; + +export function KqlQueryEdit({ + finalDiffableRule, + setFieldValue, +}: RuleFieldEditComponentProps): JSX.Element { + const defaultIndexPattern = useDefaultIndexPattern(); + const indexPatternParameters = getRuleIndexPatternParameters( + finalDiffableRule, + defaultIndexPattern + ); + const { indexPattern, isIndexPatternLoading } = useRuleIndexPattern(indexPatternParameters); + + const [isTimelineSearchOpen, toggleIsTimelineSearchOpen] = useToggle(false); + + const handleSetRuleFromTimeline = useCallback( + ({ queryBar: timelineQueryBar }) => { + setFieldValue('queryBar', timelineQueryBar); + }, + [setFieldValue] + ); + + const { onOpenTimeline } = useRuleFromTimeline(handleSetRuleFromTimeline); + + const isSavedQueryRule = finalDiffableRule.type === 'saved_query'; + + const { savedQuery } = useGetSavedQuery({ + savedQueryId: getSavedQueryId(finalDiffableRule), + ruleType: finalDiffableRule.type, + }); + + return ( + <> + + + ), + }} + component={QueryBarDefineRule} + componentProps={{ + indexPattern, + isLoading: isIndexPatternLoading, + openTimelineSearch: isTimelineSearchOpen, + onCloseTimelineSearch: toggleIsTimelineSearchOpen, + onOpenTimeline, + isDisabled: isSavedQueryRule, + defaultSavedQuery: savedQuery, + resetToSavedQuery: isSavedQueryRule, + }} + /> + + ); +} + +const timelineButtonClassName = css` + height: 18px; + font-size: 12px; +`; + +function ImportTimelineQueryButton({ + handleOpenTimelineSearch, +}: { + handleOpenTimelineSearch: () => void; +}) { + return ( + + {stepDefineRuleI18n.IMPORT_TIMELINE_QUERY} + + ); +} + +interface RuleIndexPatternParameters { + dataSourceType: DataSourceType; + index: string[]; + dataViewId: string | undefined; +} + +function getRuleIndexPatternParameters( + finalDiffableRule: DiffableRule, + defaultIndexPattern: string[] +): RuleIndexPatternParameters { + if (!('data_source' in finalDiffableRule) || !finalDiffableRule.data_source) { + return { + dataSourceType: DataSourceType.IndexPatterns, + index: defaultIndexPattern, + dataViewId: undefined, + }; + } + if (finalDiffableRule.data_source.type === DataSourceTypeSnakeCase.data_view) { + return { + dataSourceType: DataSourceType.DataView, + index: [], + dataViewId: finalDiffableRule.data_source.data_view_id, + }; + } + return { + dataSourceType: DataSourceType.IndexPatterns, + index: finalDiffableRule.data_source.index_patterns, + dataViewId: undefined, + }; +} + +function getSavedQueryId(diffableRule: DiffableRule): string | undefined { + if (diffableRule.type === 'saved_query' && 'saved_query_id' in diffableRule.kql_query) { + return diffableRule.kql_query.saved_query_id; + } + + return undefined; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit_form.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit_form.tsx new file mode 100644 index 0000000000000..b6bab6e57976c --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/kql_query/kql_query_edit_form.tsx @@ -0,0 +1,118 @@ +/* + * 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 type { Type } from '@kbn/securitysolution-io-ts-alerting-types'; +import type { FormData, FormSchema } from '../../../../../../../../shared_imports'; +import { schema } from '../../../../../../../rule_creation_ui/components/step_define_rule/schema'; +import { RuleFieldEditFormWrapper } from '../rule_field_edit_form_wrapper'; +import type { FieldValueQueryBar } from '../../../../../../../rule_creation_ui/components/query_bar'; +import { + KqlQueryLanguage, + KqlQueryType, + RuleQuery, + SavedQueryId, + RuleKqlQuery, +} from '../../../../../../../../../common/api/detection_engine'; +import type { + DiffableRule, + DiffableRuleTypes, + InlineKqlQuery, + SavedKqlQuery, +} from '../../../../../../../../../common/api/detection_engine'; +import { isFilters } from '../../../../helpers'; +import { KqlQueryEdit } from './kql_query_edit'; + +export function KqlQueryEditForm(): JSX.Element { + return ( + + ); +} + +const kqlQuerySchema = { + ruleType: schema.ruleType, + queryBar: schema.queryBar, +} as FormSchema<{ + ruleType: DiffableRuleTypes; + queryBar: FieldValueQueryBar; +}>; + +function kqlQueryDeserializer( + fieldValue: FormData, + finalDiffableRule: DiffableRule +): { + ruleType: Type; + queryBar: FieldValueQueryBar; +} { + const parsedFieldValue = RuleKqlQuery.parse(fieldValue.kql_query); + + if (parsedFieldValue.type === KqlQueryType.inline_query) { + const returnValue = { + ruleType: finalDiffableRule.type, + queryBar: { + query: { + query: parsedFieldValue.query, + language: parsedFieldValue.language, + }, + filters: isFilters(parsedFieldValue.filters) ? parsedFieldValue.filters : [], + saved_id: null, + }, + }; + + return returnValue; + } + + const returnValue = { + ruleType: finalDiffableRule.type, + queryBar: { + query: { + query: '', + language: '', + }, + filters: [], + saved_id: parsedFieldValue.saved_query_id, + }, + }; + + return returnValue; +} + +function kqlQuerySerializer(formData: FormData): { + kql_query: RuleKqlQuery; +} { + const formValue = formData as { ruleType: Type; queryBar: FieldValueQueryBar }; + + if (formValue.ruleType === 'saved_query') { + const savedQueryId = SavedQueryId.parse(formValue.queryBar.saved_id); + + const savedKqlQuery: SavedKqlQuery = { + type: KqlQueryType.saved_query, + saved_query_id: savedQueryId, + }; + + return { + kql_query: savedKqlQuery, + }; + } + + const query = RuleQuery.parse(formValue.queryBar.query.query); + const language = KqlQueryLanguage.parse(formValue.queryBar.query.language); + + const inlineKqlQuery: InlineKqlQuery = { + type: KqlQueryType.inline_query, + query, + language, + filters: formValue.queryBar.filters, + }; + + return { kql_query: inlineKqlQuery }; +} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/rule_field_edit_component_props.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/rule_field_edit_component_props.ts new file mode 100644 index 0000000000000..46ba6efdd847b --- /dev/null +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/rule_field_edit_component_props.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FormData } from '../../../../../../../shared_imports'; +import type { DiffableRule } from '../../../../../../../../common/api/detection_engine'; + +export interface RuleFieldEditComponentProps { + finalDiffableRule: DiffableRule; + setFieldValue: SetFieldValueFn; + resetForm: ResetFormFn; +} + +type SetFieldValueFn = (fieldName: string, fieldValue: unknown) => void; + +export type ResetFormFn = (options?: { + resetValues?: boolean; + defaultValue?: Partial | undefined; +}) => void; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/field_form_wrapper.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/rule_field_edit_form_wrapper.tsx similarity index 61% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/field_form_wrapper.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/rule_field_edit_form_wrapper.tsx index b4a53ee7aea0a..26a2574489b16 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/field_form_wrapper.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/fields/rule_field_edit_form_wrapper.tsx @@ -5,28 +5,30 @@ * 2.0. */ -import React, { useCallback, useState } from 'react'; +import React, { useCallback, useEffect } from 'react'; import { EuiButtonEmpty, EuiFlexGroup } from '@elastic/eui'; -import { useForm, Form } from '../../../../../../shared_imports'; -import type { FormSchema, FormData } from '../../../../../../shared_imports'; +import { useForm, Form } from '../../../../../../../shared_imports'; +import type { FormSchema, FormData } from '../../../../../../../shared_imports'; import type { DiffableAllFields, DiffableRule, -} from '../../../../../../../common/api/detection_engine'; -import { useFinalSideContext } from '../final_side/final_side_context'; -import { useDiffableRuleContext } from '../diffable_rule_context'; -import * as i18n from '../translations'; +} from '../../../../../../../../common/api/detection_engine'; +import { useFinalSideContext } from '../../final_side/final_side_context'; +import { useDiffableRuleContext } from '../../diffable_rule_context'; +import * as i18n from '../../translations'; +import type { RuleFieldEditComponentProps } from './rule_field_edit_component_props'; -type FieldComponent = React.ComponentType<{ - finalDiffableRule: DiffableRule; - setValidity: (isValid: boolean) => void; - setFieldValue: (fieldName: string, fieldValue: unknown) => void; -}>; +type RuleFieldEditComponent = React.ComponentType; -interface FieldFormWrapperProps { - component: FieldComponent; - fieldFormSchema: FormSchema; - deserializer?: (fieldValue: FormData, finalDiffableRule: DiffableRule) => FormData; +export type FieldDeserializerFn = ( + defaultRuleFieldValue: FormData, + finalDiffableRule: DiffableRule +) => FormData; + +interface RuleFieldEditFormWrapperProps { + component: RuleFieldEditComponent; + ruleFieldFormSchema: FormSchema; + deserializer?: FieldDeserializerFn; serializer?: (formData: FormData) => FormData; } @@ -35,30 +37,23 @@ interface FieldFormWrapperProps { * * @param {Object} props - Component props. * @param {React.ComponentType} props.component - Field component to be wrapped. - * @param {FormSchema} props.fieldFormSchema - Configuration schema for the field. + * @param {FormSchema} props.ruleFieldFormSchema - Configuration schema for the field. * @param {Function} props.deserializer - Deserializer prepares initial form data. It converts field value from a DiffableRule format to a format used by the form. * @param {Function} props.serializer - Serializer prepares form data for submission. It converts form data back to a DiffableRule format. */ -export function FieldFormWrapper({ +export function RuleFieldEditFormWrapper({ component: FieldComponent, - fieldFormSchema, + ruleFieldFormSchema, deserializer, serializer, -}: FieldFormWrapperProps) { +}: RuleFieldEditFormWrapperProps) { const { fieldName, setReadOnlyMode } = useFinalSideContext(); const { finalDiffableRule, setRuleFieldResolvedValue } = useDiffableRuleContext(); const deserialize = useCallback( - (defaultValue: FormData): FormData => { - if (!deserializer) { - return defaultValue; - } - - const rule = finalDiffableRule as Record; - const fieldValue = rule[fieldName] as FormData; - return deserializer(fieldValue, finalDiffableRule); - }, - [deserializer, fieldName, finalDiffableRule] + (defaultValue: FormData): FormData => + deserializer ? deserializer(defaultValue, finalDiffableRule) : defaultValue, + [deserializer, finalDiffableRule] ); const handleSubmit = useCallback( @@ -78,16 +73,18 @@ export function FieldFormWrapper({ ); const { form } = useForm({ - schema: fieldFormSchema, + schema: ruleFieldFormSchema, defaultValue: getDefaultValue(fieldName, finalDiffableRule), deserializer: deserialize, serializer, onSubmit: handleSubmit, }); - const [validity, setValidity] = useState(undefined); - - const isValid = validity === undefined ? form.isValid : validity; + // form.isValid has `undefined` value until all fields are dirty. + // Run the validation upfront to visualize form validity state. + useEffect(() => { + form.validate(); + }, [form]); return ( <> @@ -95,15 +92,15 @@ export function FieldFormWrapper({ {i18n.CANCEL_BUTTON_LABEL} - + {i18n.SAVE_BUTTON_LABEL}
diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/final_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/final_edit.tsx index 698d138208d70..5c32c8edc7924 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/final_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/final_edit.tsx @@ -20,9 +20,11 @@ import type { UpgradeableThreatMatchFields, UpgradeableThresholdFields, UpgradeableNewTermsFields, + UpgradeableEqlFields, } from '../../../../model/prebuilt_rule_upgrade/fields'; import { isCommonFieldName } from '../../../../model/prebuilt_rule_upgrade/fields'; import { useFinalSideContext } from '../final_side/final_side_context'; +import { EqlRuleFieldEdit } from './eql_rule_field_edit'; export function FinalEdit() { const { finalDiffableRule } = useDiffableRuleContext(); @@ -40,7 +42,7 @@ export function FinalEdit() { case 'saved_query': return ; case 'eql': - return {'Rule type not yet implemented'}; + return ; case 'esql': return {'Rule type not yet implemented'}; case 'threat_match': diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/new_terms_rule_field_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/new_terms_rule_field_edit.tsx index 183200aef1c43..e5d01b3cfff7d 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/new_terms_rule_field_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/new_terms_rule_field_edit.tsx @@ -6,14 +6,9 @@ */ import React from 'react'; -import { FieldFormWrapper } from './field_form_wrapper'; -import { - KqlQueryEdit, - kqlQuerySchema, - kqlQuerySerializer, - kqlQueryDeserializer, -} from './fields/kql_query'; import type { UpgradeableNewTermsFields } from '../../../../model/prebuilt_rule_upgrade/fields'; +import { KqlQueryEditForm } from './fields/kql_query'; +import { DataSourceEditForm } from './fields/data_source'; interface NewTermsRuleFieldEditProps { fieldName: UpgradeableNewTermsFields; @@ -22,14 +17,9 @@ interface NewTermsRuleFieldEditProps { export function NewTermsRuleFieldEdit({ fieldName }: NewTermsRuleFieldEditProps) { switch (fieldName) { case 'kql_query': - return ( - - ); + return ; + case 'data_source': + return ; default: return null; // Will be replaced with `assertUnreachable(fieldName)` once all fields are implemented } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/saved_query_rule_field_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/saved_query_rule_field_edit.tsx index fa573e6339e9f..851b8f6c95fb5 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/saved_query_rule_field_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/saved_query_rule_field_edit.tsx @@ -6,14 +6,9 @@ */ import React from 'react'; -import { FieldFormWrapper } from './field_form_wrapper'; -import { - KqlQueryEdit, - kqlQuerySchema, - kqlQuerySerializer, - kqlQueryDeserializer, -} from './fields/kql_query'; import type { UpgradeableSavedQueryFields } from '../../../../model/prebuilt_rule_upgrade/fields'; +import { KqlQueryEditForm } from './fields/kql_query'; +import { DataSourceEditForm } from './fields/data_source'; interface SavedQueryRuleFieldEditProps { fieldName: UpgradeableSavedQueryFields; @@ -22,14 +17,9 @@ interface SavedQueryRuleFieldEditProps { export function SavedQueryRuleFieldEdit({ fieldName }: SavedQueryRuleFieldEditProps) { switch (fieldName) { case 'kql_query': - return ( - - ); + return ; + case 'data_source': + return ; default: return null; // Will be replaced with `assertUnreachable(fieldName)` once all fields are implemented } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/threat_match_rule_field_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/threat_match_rule_field_edit.tsx index 5f2adbb113fd5..6a92f7372563e 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/threat_match_rule_field_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/threat_match_rule_field_edit.tsx @@ -6,14 +6,9 @@ */ import React from 'react'; -import { FieldFormWrapper } from './field_form_wrapper'; -import { - KqlQueryEdit, - kqlQuerySchema, - kqlQuerySerializer, - kqlQueryDeserializer, -} from './fields/kql_query'; import type { UpgradeableThreatMatchFields } from '../../../../model/prebuilt_rule_upgrade/fields'; +import { KqlQueryEditForm } from './fields/kql_query'; +import { DataSourceEditForm } from './fields/data_source'; interface ThreatMatchRuleFieldEditProps { fieldName: UpgradeableThreatMatchFields; @@ -22,14 +17,9 @@ interface ThreatMatchRuleFieldEditProps { export function ThreatMatchRuleFieldEdit({ fieldName }: ThreatMatchRuleFieldEditProps) { switch (fieldName) { case 'kql_query': - return ( - - ); + return ; + case 'data_source': + return ; default: return null; // Will be replaced with `assertUnreachable(fieldName)` once all fields are implemented } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/threshold_rule_field_edit.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/threshold_rule_field_edit.tsx index 4975ca49205e7..d1fc2372d7a16 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/threshold_rule_field_edit.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_edit/threshold_rule_field_edit.tsx @@ -6,14 +6,9 @@ */ import React from 'react'; -import { FieldFormWrapper } from './field_form_wrapper'; -import { - KqlQueryEdit, - kqlQuerySchema, - kqlQuerySerializer, - kqlQueryDeserializer, -} from './fields/kql_query'; import type { UpgradeableThresholdFields } from '../../../../model/prebuilt_rule_upgrade/fields'; +import { KqlQueryEditForm } from './fields/kql_query'; +import { DataSourceEditForm } from './fields/data_source'; interface ThresholdRuleFieldEditProps { fieldName: UpgradeableThresholdFields; @@ -22,14 +17,9 @@ interface ThresholdRuleFieldEditProps { export function ThresholdRuleFieldEdit({ fieldName }: ThresholdRuleFieldEditProps) { switch (fieldName) { case 'kql_query': - return ( - - ); + return ; + case 'data_source': + return ; default: return null; // Will be replaced with `assertUnreachable(fieldName)` once all fields are implemented } diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/use_default_index_pattern.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/hooks/use_default_index_pattern.tsx similarity index 63% rename from x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/use_default_index_pattern.tsx rename to x-pack/plugins/security_solution/public/detection_engine/rule_management/hooks/use_default_index_pattern.tsx index 3482df562bac0..b5ca86c6f1f57 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/use_default_index_pattern.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/hooks/use_default_index_pattern.tsx @@ -5,23 +5,21 @@ * 2.0. */ -import { useKibana } from '../../../../common/lib/kibana/kibana_react'; -import { DEFAULT_INDEX_KEY, DEFAULT_INDEX_PATTERN } from '../../../../../common/constants'; -import { useIsExperimentalFeatureEnabled } from '../../../../common/hooks/use_experimental_features'; +import { useKibana } from '../../../common/lib/kibana/kibana_react'; +import { DEFAULT_INDEX_KEY, DEFAULT_INDEX_PATTERN } from '../../../../common/constants'; +import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; /** * Gets the default index pattern for cases when rule has neither index patterns or data view. * First checks the config value. If it's not present falls back to the hardcoded default value. */ -export function useDefaultIndexPattern() { +export function useDefaultIndexPattern(): string[] { const { services } = useKibana(); const isPrebuiltRulesCustomizationEnabled = useIsExperimentalFeatureEnabled( 'prebuiltRulesCustomizationEnabled' ); - if (isPrebuiltRulesCustomizationEnabled) { - return services.settings.client.get(DEFAULT_INDEX_KEY, DEFAULT_INDEX_PATTERN); - } - - return []; + return isPrebuiltRulesCustomizationEnabled + ? services.settings.client.get(DEFAULT_INDEX_KEY, DEFAULT_INDEX_PATTERN) + : []; } diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index ba2bbe3363512..accc5951d75e0 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -35992,7 +35992,6 @@ "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.customQueryFieldRequiredError": "Une requête personnalisée est requise.", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.customThreatQueryFieldRequiredEmptyError": "Toutes les correspondances requièrent un champ et un champ d'index des menaces.", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.customThreatQueryFieldRequiredError": "Au moins une correspondance d'indicateur est requise.", - "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.dataViewSelectorFieldRequired": "Veuillez sélectionner une vue des données ou un modèle d'index disponible.", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.EqlQueryBarLabel": "Requête EQL", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.eqlQueryFieldRequiredError": "Une requête EQL est requise.", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.eqlSequenceSuppressionDisableText": "La suppression n'est pas prise en charge pour les requêtes de séquence EQL.", @@ -36036,7 +36035,6 @@ "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.newTermsField.placeholderText": "Sélectionner un champ", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.newTermsFieldsLabel": "Champs", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.newTermsFieldsMin": "Au moins un champ est requis.", - "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.outputIndiceNameFieldRequiredError": "Au minimum un modèle d'indexation est requis.", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.referencesUrlInvalidError": "Le format de l’URL n’est pas valide.", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.resetDefaultIndicesButton": "Réinitialiser sur les modèles d'indexation par défaut", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.rulePreviewTitle": "Aperçu de la règle", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index d930949694495..9d7c444494b6f 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -35736,7 +35736,6 @@ "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.customQueryFieldRequiredError": "カスタムクエリが必要です。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.customThreatQueryFieldRequiredEmptyError": "すべての一致には、フィールドと脅威インデックスフィールドの両方が必要です。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.customThreatQueryFieldRequiredError": "1 つ以上のインジケーター一致が必要です。", - "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.dataViewSelectorFieldRequired": "使用可能なデータビューまたはインデックスパターンを選択してください。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.EqlQueryBarLabel": "EQL クエリ", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.eqlQueryFieldRequiredError": "EQLクエリは必須です。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.eqlSequenceSuppressionDisableText": "EQLシーケンスクエリでは抑制はサポートされていません。", @@ -35780,7 +35779,6 @@ "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.newTermsField.placeholderText": "フィールドを選択", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.newTermsFieldsLabel": "フィールド", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.newTermsFieldsMin": "1つ以上のフィールドが必要です。", - "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.outputIndiceNameFieldRequiredError": "インデックスパターンが最低1つ必要です。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.referencesUrlInvalidError": "URLの形式が無効です", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.resetDefaultIndicesButton": "デフォルトインデックスパターンにリセット", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.rulePreviewTitle": "ルールプレビュー", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index bdff2381e6fa9..7c6e7b3e81487 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -35780,7 +35780,6 @@ "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.customQueryFieldRequiredError": "需要定制查询。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.customThreatQueryFieldRequiredEmptyError": "所有匹配项都需要字段和威胁索引字段。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.customThreatQueryFieldRequiredError": "至少需要一个指标匹配。", - "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.dataViewSelectorFieldRequired": "请选择可用的数据视图或索引模式。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.EqlQueryBarLabel": "EQL 查询", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.eqlQueryFieldRequiredError": "EQL 查询必填。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.eqlSequenceSuppressionDisableText": "EQL 序列查询不支持阻止。", @@ -35824,7 +35823,6 @@ "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.newTermsField.placeholderText": "选择字段", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.newTermsFieldsLabel": "字段", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.newTermsFieldsMin": "至少需要一个字段。", - "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.outputIndiceNameFieldRequiredError": "至少需要一种索引模式。", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.referencesUrlInvalidError": "URL 的格式无效", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.resetDefaultIndicesButton": "重置为默认索引模式", "xpack.securitySolution.detectionEngine.createRule.stepDefineRule.rulePreviewTitle": "规则预览", From 1147462c14584b5c6e12f3b05b8eebf974c1022c Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Fri, 25 Oct 2024 11:54:35 -0500 Subject: [PATCH 042/135] search: move getting started to footer (#197849) ## Summary Moved the `Getting Started` link to the footer ![image](https://github.com/user-attachments/assets/4d388fba-c6a4-4a72-b9f1-5ea839e435fe) --- .../serverless_search/public/navigation_tree.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/serverless_search/public/navigation_tree.ts b/x-pack/plugins/serverless_search/public/navigation_tree.ts index 3906eb8b2b864..b0f5a4658e7d2 100644 --- a/x-pack/plugins/serverless_search/public/navigation_tree.ts +++ b/x-pack/plugins/serverless_search/public/navigation_tree.ts @@ -130,18 +130,19 @@ export const navigationTree = (): NavigationTreeDefinition => ({ spaceBefore: 'm', children: [{ link: 'maps' }], }, - { - id: 'gettingStarted', - title: i18n.translate('xpack.serverlessSearch.nav.gettingStarted', { - defaultMessage: 'Getting Started', - }), - link: 'serverlessElasticsearch', - spaceBefore: 'm', - }, ], }, ], footer: [ + { + id: 'gettingStarted', + type: 'navItem', + title: i18n.translate('xpack.serverlessSearch.nav.gettingStarted', { + defaultMessage: 'Getting Started', + }), + link: 'serverlessElasticsearch', + icon: 'launch', + }, { type: 'navGroup', id: 'project_settings_project_nav', From 02fab7248d5b4e537030252df81bef55d04d0595 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Fri, 25 Oct 2024 10:13:57 -0700 Subject: [PATCH 043/135] [OpenAPI][DOCS] Add descriptions, examples, responses for role APIs (#195527) Co-authored-by: Elena Shostak <165678770+elena-shostak@users.noreply.github.com> --- docs/api/role-management.asciidoc | 18 +- docs/api/role-management/delete.asciidoc | 26 -- docs/api/role-management/get-all.asciidoc | 80 ---- docs/api/role-management/get.asciidoc | 106 ----- docs/api/role-management/put-bulk.asciidoc | 377 ------------------ docs/api/role-management/put.asciidoc | 238 ----------- .../architecture/security/rbac.asciidoc | 2 +- docs/management/watcher-ui/index.asciidoc | 5 +- docs/redirects.asciidoc | 26 +- docs/setup/configuring-reporting.asciidoc | 5 +- docs/user/introduction.asciidoc | 4 +- docs/user/security/api-keys/index.asciidoc | 2 +- .../authorization/kibana-privileges.asciidoc | 19 +- docs/user/security/index.asciidoc | 4 +- oas_docs/bundle.json | 76 +++- oas_docs/bundle.serverless.json | 76 +++- oas_docs/examples/create_role_request1.yaml | 23 ++ oas_docs/examples/create_role_request2.yaml | 16 + oas_docs/examples/create_role_request3.yaml | 14 + oas_docs/examples/create_role_request4.yaml | 34 ++ oas_docs/examples/get_role_response1.yaml | 41 ++ oas_docs/examples/get_roles_response1.yaml | 39 ++ oas_docs/output/kibana.serverless.yaml | 230 ++++++++++- oas_docs/output/kibana.yaml | 230 ++++++++++- oas_docs/overlays/kibana.overlays.yaml | 37 +- .../src/authorization/role_schema.ts | 147 ++++++- .../routes/authorization/roles/delete.ts | 5 + .../server/routes/authorization/roles/get.ts | 23 +- .../routes/authorization/roles/get_all.ts | 16 +- .../authorization/roles/model/put_payload.ts | 19 +- .../server/routes/authorization/roles/post.ts | 5 + .../server/routes/authorization/roles/put.ts | 22 +- 32 files changed, 1045 insertions(+), 920 deletions(-) delete mode 100644 docs/api/role-management/delete.asciidoc delete mode 100644 docs/api/role-management/get-all.asciidoc delete mode 100644 docs/api/role-management/get.asciidoc delete mode 100644 docs/api/role-management/put-bulk.asciidoc delete mode 100644 docs/api/role-management/put.asciidoc create mode 100644 oas_docs/examples/create_role_request1.yaml create mode 100644 oas_docs/examples/create_role_request2.yaml create mode 100644 oas_docs/examples/create_role_request3.yaml create mode 100644 oas_docs/examples/create_role_request4.yaml create mode 100644 oas_docs/examples/get_role_response1.yaml create mode 100644 oas_docs/examples/get_roles_response1.yaml diff --git a/docs/api/role-management.asciidoc b/docs/api/role-management.asciidoc index 7fbded3e57dd3..837e63bff74f0 100644 --- a/docs/api/role-management.asciidoc +++ b/docs/api/role-management.asciidoc @@ -1,4 +1,3 @@ -[role="xpack"] [[role-management-api]] == {kib} role management APIs @@ -6,19 +5,4 @@ Manage the roles that grant <>. WARNING: Do not use the {ref}/security-api.html#security-role-apis[{es} role management APIs] to manage {kib} roles. -The following {kib} role management APIs are available: - -* <> to create a new {kib} role, or update the attributes of an existing role -* <> to create a new {kib} roles, or update the attributes of existing roles - -* <> to retrieve all {kib} roles - -* <> to retrieve a specific role - -* <> to delete a {kib} role - -include::role-management/put.asciidoc[] -include::role-management/get.asciidoc[] -include::role-management/get-all.asciidoc[] -include::role-management/delete.asciidoc[] -include::role-management/put-bulk.asciidoc[] +For the latest API details, refer to {api-kibana}/group/endpoint-roles[role APIs]. diff --git a/docs/api/role-management/delete.asciidoc b/docs/api/role-management/delete.asciidoc deleted file mode 100644 index 530e1e252ef8f..0000000000000 --- a/docs/api/role-management/delete.asciidoc +++ /dev/null @@ -1,26 +0,0 @@ -[[role-management-api-delete]] -=== Delete role API -++++ -Delete role -++++ - -experimental[] Delete a {kib} role. - -[[role-management-api-delete-prereqs]] -==== Prerequisite - -To use the delete role API, you must have the `manage_security` cluster privilege. - -[[role-management-api-delete-request-body]] -==== Request - -`DELETE :/api/security/role/my_admin_role` - -[[role-management-api-delete-response-codes]] -==== Response codes - -`204`:: - Indicates a successful call. - -`404`:: - Indicates an unsuccessful call. diff --git a/docs/api/role-management/get-all.asciidoc b/docs/api/role-management/get-all.asciidoc deleted file mode 100644 index 56c8b2c78859b..0000000000000 --- a/docs/api/role-management/get-all.asciidoc +++ /dev/null @@ -1,80 +0,0 @@ -[[role-management-api-get]] -=== Get all {kib} roles API -++++ -Get all roles -++++ - -experimental[] Retrieve all {kib} roles. - -[[role-management-api-get-prereqs]] -==== Prerequisite - -To use the get role API, you must have the `manage_security` cluster privilege. - -[[role-management-api-retrieve-all-request-body]] -==== Request - -`GET :/api/security/role` - -[[role-management-api-retrieve-all-response-codes]] -==== Response code - -`200`:: - Indicates a successful call. - -[[role-management-api-retrieve-all-example]] -==== Example - -The API returns the following: - -[source,sh] --------------------------------------------------- -[ - { - "name": "my_kibana_role", - "description": "My kibana role description", - "metadata" : { - "version" : 1 - }, - "transient_metadata": { - "enabled": true - }, - "elasticsearch": { - "indices": [ ], - "cluster": [ ], - "run_as": [ ] - }, - "kibana": [{ - "base": [ - "all" - ], - "feature": {}, - "spaces": [ - "*" - ] - }] - }, - { - "name": "my_admin_role", - "description": "My admin role description", - "metadata" : { - "version" : 1 - }, - "transient_metadata": { - "enabled": true - }, - "elasticsearch": { - "cluster" : [ "all" ], - "indices" : [ { - "names" : [ "index1", "index2" ], - "privileges" : [ "all" ], - "field_security" : { - "grant" : [ "title", "body" ] - }, - "query" : "{\"match\": {\"title\": \"foo\"}}" - } ], - }, - "kibana": [ ] - } -] --------------------------------------------------- diff --git a/docs/api/role-management/get.asciidoc b/docs/api/role-management/get.asciidoc deleted file mode 100644 index 95f944a56e150..0000000000000 --- a/docs/api/role-management/get.asciidoc +++ /dev/null @@ -1,106 +0,0 @@ -[[role-management-specific-api-get]] -=== Get specific role API -++++ -Get specific role -++++ - -experimental[] Retrieve a specific role. - -[[role-management-specific-api-get-prereqs]] -==== Prerequisite - -To use the get specific role API, you must have the `manage_security` cluster privilege. - -[[role-management-specific-api-retrieve-all-request-body]] -===== Request - -`GET :/api/security/role/my_restricted_kibana_role` - -[[role-management-specific-api-retrieve-all-response-codes]] -==== Response code - -`200`:: - Indicates a successful call. - -[[role-management-specific-api-retrieve-all-example]] -===== Example - -The API returns the following: - -[source,sh] --------------------------------------------------- -{ - "name": "my_restricted_kibana_role", - "description": "My restricted kibana role description", - "metadata" : { - "version" : 1 - }, - "transient_metadata": { - "enabled": true - }, - "elasticsearch": { - "cluster": [ ], - "indices": [ ], - "run_as": [ ] - }, - "kibana": [ - { - "base": [ - "read" - ], - "feature": {}, - "spaces": [ - "marketing" - ] - }, - { - "base": [], - "feature": { - "discover": [ - "all" - ], - "visualize": [ - "all" - ], - "dashboard": [ - "all" - ], - "dev_tools": [ - "read" - ], - "advancedSettings": [ - "read" - ], - "indexPatterns": [ - "read" - ], - "graph": [ - "all" - ], - "apm": [ - "read" - ], - "maps": [ - "read" - ], - "canvas": [ - "read" - ], - "infrastructure": [ - "all" - ], - "logs": [ - "all" - ], - "uptime": [ - "all" - ] - }, - "spaces": [ - "sales", - "default" - ] - } - ] -} --------------------------------------------------- diff --git a/docs/api/role-management/put-bulk.asciidoc b/docs/api/role-management/put-bulk.asciidoc deleted file mode 100644 index a11de47167e05..0000000000000 --- a/docs/api/role-management/put-bulk.asciidoc +++ /dev/null @@ -1,377 +0,0 @@ -[[role-management-api-put-bulk]] -=== Bulk create or update roles API -++++ -Bulk create or update roles API -++++ - -preview::["This functionality is in technical preview, and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features."] - -experimental[] Create new {kib} roles, or update the attributes of an existing roles. {kib} roles are stored in the -{es} native realm. - -[[role-management-api-put-bulk-request]] -==== Request - -`POST :/api/security/roles` - -[[role-management-api-put-bulk-prereqs]] -==== Prerequisite - -To use the bulk create or update roles API, you must have the `manage_security` cluster privilege. - -[role="child_attributes"] -[[role-management-api-bulk-response-body]] -==== Request body - -`roles`:: - (object) Object that specifies the roles to add as a role name to role map. -`` (required):: (string) The role name. -`description`:: - (Optional, string) Description for the role. - -`metadata`:: - (Optional, object) In the `metadata` object, keys that begin with `_` are reserved for system usage. - -`elasticsearch`:: - (Optional, object) {es} cluster and index privileges. Valid keys include - `cluster`, `indices`, `remote_indices`, `remote_cluster`, and `run_as`. For more information, see - {ref}/defining-roles.html[Defining roles]. - -`kibana`:: - (list) Objects that specify the <> for the role. -+ -.Properties of `kibana` -[%collapsible%open] -===== -`base` ::: - (Optional, list) A base privilege. When specified, the base must be `["all"]` or `["read"]`. - When the `base` privilege is specified, you are unable to use the `feature` section. - "all" grants read/write access to all {kib} features for the specified spaces. - "read" grants read-only access to all {kib} features for the specified spaces. - -`feature` ::: - (object) Contains privileges for specific features. - When the `feature` privileges are specified, you are unable to use the `base` section. - To retrieve a list of available features, use the <>. - -`spaces` ::: - (list) The spaces to apply the privileges to. - To grant access to all spaces, set to `["*"]`, or omit the value. -===== - -[[role-management-api-bulk-put-response-codes]] -==== Response code - -`200`:: - Indicates a successful call. - -==== Examples - -Grant access to various features in all spaces: - -[source,sh] --------------------------------------------------- -$ curl -X POST api/security/roles -{ - "roles": { - "my_kibana_role_1": { - "description": "my_kibana_role_1_description", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": [], - "indices": [] - }, - "kibana": [ - { - "base": [], - "feature": { - "discover": ["all"], - "visualize": ["all"], - "dashboard": ["all"], - "dev_tools": ["read"], - "advancedSettings": ["read"], - "indexPatterns": ["read"], - "graph": ["all"], - "apm": ["read"], - "maps": ["read"], - "canvas": ["read"], - "infrastructure": ["all"], - "logs": ["all"], - "uptime": ["all"] - }, - "spaces": ["*"] - } - ] - }, - "my_kibana_role_2": { - "description": "my_kibana_role_2_description", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": [], - "indices": [] - }, - "kibana": [ - { - "base": [], - "feature": { - "discover": ["all"], - "visualize": ["all"], - "dashboard": ["all"], - "dev_tools": ["read"], - "logs": ["all"], - "uptime": ["all"] - }, - "spaces": ["*"] - } - ] - } - } -} --------------------------------------------------- -// KIBANA - -Grant dashboard-only access to only the Marketing space for `my_kibana_role_1` and dashboard-only access to only Sales space for `my_kibana_role_2`: - -[source,sh] --------------------------------------------------- -$ curl -X POST api/security/roles -{ - "roles": { - "my_kibana_role_1": { - "description": "Grants dashboard-only access to only the Marketing space.", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": [], - "indices": [] - }, - "kibana": [ - { - "base": [], - "feature": { - "dashboard": ["read"] - }, - "spaces": ["marketing"] - } - ] - }, - "my_kibana_role_2": { - "description": "Grants dashboard-only access to only the Sales space.", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": [], - "indices": [] - }, - "kibana": [ - { - "base": [], - "feature": { - "dashboard": ["read"] - }, - "spaces": ["sales"] - } - ] - } - } -} - --------------------------------------------------- -// KIBANA - -Grant full access to all features in the Default space for `my_kibana_role_1` and `my_kibana_role_2`: - -[source,sh] --------------------------------------------------- -$ curl -X POST api/security/roles -{ - "roles": { - "my_kibana_role_1": { - "description": "Grants full access to all features in the Default space.", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": [], - "indices": [] - }, - "kibana": [ - { - "base": ["all"], - "feature": {}, - "spaces": ["default"] - } - ] - }, - "my_kibana_role_2": { - "description": "Grants full access to all features in the Default space.", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": [], - "indices": [] - }, - "kibana": [ - { - "base": ["all"], - "feature": {}, - "spaces": ["default"] - } - ] - } - } -} - --------------------------------------------------- -// KIBANA - -Grant different access to different spaces: - -[source,sh] --------------------------------------------------- -$ curl -X POST api/security/roles -{ - "roles": { - "my_kibana_role_1": { - "description": "Grants full access to discover and dashboard features in the default space. Grants read access in the marketing, and sales spaces.", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": [], - "indices": [] - }, - "kibana": [ - { - "base": [], - "feature": { - "discover": ["all"], - "dashboard": ["all"] - }, - "spaces": ["default"] - }, - { - "base": ["read"], - "spaces": ["marketing", "sales"] - } - ] - }, - "my_kibana_role_2": { - "description": "Grants full access to discover and dashboard features in the default space. Grants read access in the marketing space.", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": [], - "indices": [] - }, - "kibana": [ - { - "base": [], - "feature": { - "discover": ["all"], - "dashboard": ["all"] - }, - "spaces": ["default"] - }, - { - "base": ["read"], - "spaces": ["marketing"] - } - ] - } - } -} - --------------------------------------------------- -// KIBANA - -Grant access to {kib} and {es}: - -[source,sh] --------------------------------------------------- -$ curl -X POST api/security/roles -{ - "roles": { - "my_kibana_role_1": { - "description": "Grants all cluster privileges and full access to index1 and index2. Grants full access to remote_index1 and remote_index2, and the monitor_enrich cluster privilege on remote_cluster1. Grants all Kibana privileges in the default space.", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": ["all"], - "indices": [ - { - "names": ["index1", "index2"], - "privileges": ["all"] - } - ], - "remote_indices": [ - { - "clusters": ["remote_cluster1"], - "names": ["remote_index1", "remote_index2"], - "privileges": ["all"] - } - ], - "remote_cluster": [ - { - "clusters": ["remote_cluster1"], - "privileges": ["monitor_enrich"] - } - ] - }, - "kibana": [ - { - "base": ["all"], - "feature": {}, - "spaces": ["default"] - } - ] - }, - "my_kibana_role_2": { - "description": "Grants all cluster privileges and full access to index1. Grants full access to remote_index1, and the monitor_enrich cluster privilege on remote_cluster1. Grants all Kibana privileges in the default space.", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": ["all"], - "indices": [ - { - "names": ["index1"], - "privileges": ["all"] - } - ], - "remote_indices": [ - { - "clusters": ["remote_cluster1"], - "names": ["remote_index1"], - "privileges": ["all"] - } - ], - "remote_cluster": [ - { - "clusters": ["remote_cluster1"], - "privileges": ["monitor_enrich"] - } - ] - }, - "kibana": [ - { - "base": ["all"], - "feature": {}, - "spaces": ["default"] - } - ] - } - } -} - --------------------------------------------------- -// KIBANA diff --git a/docs/api/role-management/put.asciidoc b/docs/api/role-management/put.asciidoc deleted file mode 100644 index d68f3928a4063..0000000000000 --- a/docs/api/role-management/put.asciidoc +++ /dev/null @@ -1,238 +0,0 @@ -[[role-management-api-put]] -=== Create or update role API -++++ -Create or update role -++++ - -experimental[] Create a new {kib} role, or update the attributes of an existing role. {kib} roles are stored in the -{es} native realm. - -[[role-management-api-put-request]] -==== Request - -`PUT :/api/security/role/my_kibana_role` - -[[role-management-api-put-prereqs]] -==== Prerequisite - -To use the create or update role API, you must have the `manage_security` cluster privilege. - -[role="child_attributes"] -[[role-management-api-response-body]] -==== Request body - -`description`:: - (Optional, string) Description for the role. - -`metadata`:: - (Optional, object) In the `metadata` object, keys that begin with `_` are reserved for system usage. - -`elasticsearch`:: - (Optional, object) {es} cluster and index privileges. Valid keys include - `cluster`, `indices`, `remote_indices`, `remote_cluster`, and `run_as`. For more information, see - {ref}/defining-roles.html[Defining roles]. - -`kibana`:: - (list) Objects that specify the <> for the role. -+ -.Properties of `kibana` -[%collapsible%open] -===== -`base` ::: - (Optional, list) A base privilege. When specified, the base must be `["all"]` or `["read"]`. - When the `base` privilege is specified, you are unable to use the `feature` section. - "all" grants read/write access to all {kib} features for the specified spaces. - "read" grants read-only access to all {kib} features for the specified spaces. - -`feature` ::: - (object) Contains privileges for specific features. - When the `feature` privileges are specified, you are unable to use the `base` section. - To retrieve a list of available features, use the <>. - -`spaces` ::: - (list) The spaces to apply the privileges to. - To grant access to all spaces, set to `["*"]`, or omit the value. -===== - -[[role-management-api-put-query-params]] -==== Query parameters - -`createOnly`:: - (Optional, boolean) When `true`, will prevent overwriting the role if it already exists. - -[[role-management-api-put-response-codes]] -==== Response code - -`204`:: - Indicates a successful call. - -`409`:: - When `createOnly` is true, indicates a conflict with an existing role. - -==== Examples - -Grant access to various features in all spaces: - -[source,sh] --------------------------------------------------- -$ curl -X PUT api/security/role/my_kibana_role -{ - "description": "my_kibana_role_description", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": [ ], - "indices": [ ] - }, - "kibana": [ - { - "base": [ ], - "feature": { - "discover": [ "all" ], - "visualize": [ "all" ], - "dashboard": [ "all" ], - "dev_tools": [ "read" ], - "advancedSettings": [ "read" ], - "indexPatterns": [ "read" ], - "graph": [ "all" ], - "apm": [ "read" ], - "maps": [ "read" ], - "canvas": [ "read" ], - "infrastructure": [ "all" ], - "logs": [ "all" ], - "uptime": [ "all" ] - }, - "spaces": [ "*" ] - } - ] -} --------------------------------------------------- -// KIBANA - -Grant dashboard-only access to only the Marketing space: - -[source,sh] --------------------------------------------------- -$ curl -X PUT api/security/role/my_kibana_role -{ - "description": "Grants dashboard-only access to only the Marketing space.", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": [ ], - "indices": [ ] - }, - "kibana": [ - { - "base": [ ], - "feature": { - "dashboard": [ "read" ] - }, - "spaces": [ "marketing" ] - } - ] -} --------------------------------------------------- -// KIBANA - -Grant full access to all features in the Default space: - -[source,sh] --------------------------------------------------- -$ curl -X PUT api/security/role/my_kibana_role -{ - "description": "Grants full access to all features in the Default space.", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": [ ], - "indices": [ ] - }, - "kibana": [ - { - "base": [ "all" ], - "feature": { }, - "spaces": [ "default" ] - } - ] -} --------------------------------------------------- -// KIBANA - -Grant different access to different spaces: - -[source,sh] --------------------------------------------------- -$ curl -X PUT api/security/role/my_kibana_role -{ - "description": "Grants full access to discover and dashboard features in the default space. Grants read access in the marketing, and sales spaces.", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": [ ], - "indices": [ ] - }, - "kibana": [ - { - "base": [ ], - "feature": { - "discover": [ "all" ], - "dashboard": [ "all" ] - }, - "spaces": [ "default" ] - }, - { - "base": [ "read"] , - "spaces": [ "marketing", "sales" ] - } - ] -} --------------------------------------------------- -// KIBANA - -Grant access to {kib} and {es}: - -[source,sh] --------------------------------------------------- -$ curl -X PUT api/security/role/my_kibana_role -{ - "description": "Grants all cluster privileges and full access to index1 and index2. Grants full access to remote_index1 and remote_index2, and the monitor_enrich cluster privilege on remote_cluster1. Grants all Kibana privileges in the default space.", - "metadata": { - "version": 1 - }, - "elasticsearch": { - "cluster": [ "all" ], - "indices": [ - { - "names": [ "index1", "index2" ], - "privileges": [ "all" ] - } - ], - "remote_indices": [ - { - "clusters": [ "remote_cluster1" ], - "names": [ "remote_index1", "remote_index2" ], - "privileges": [ "all" ] - } - ], - "remote_cluster": [ - { - "clusters": [ "remote_cluster1" ], - "privileges": [ "monitor_enrich" ] - } - ] - }, - "kibana": [ - { - "base": [ "all" ], - "feature": { }, - "spaces": [ "default" ] - } - ] -} --------------------------------------------------- -// KIBANA diff --git a/docs/developer/architecture/security/rbac.asciidoc b/docs/developer/architecture/security/rbac.asciidoc index bf75ec1715de0..11896da243f2d 100644 --- a/docs/developer/architecture/security/rbac.asciidoc +++ b/docs/developer/architecture/security/rbac.asciidoc @@ -77,7 +77,7 @@ The application is created by concatenating the prefix of `kibana-` with the val } ---------------------------------- -Roles that grant <> should be managed using the <> or the *Management -> Security -> Roles* page, not directly using the {es} {ref}/security-api.html#security-role-apis[role management API]. This role can then be assigned to users using the {es} +Roles that grant <> should be managed using the {api-kibana}/group/endpoint-roles[role APIs] or the *Management -> Security -> Roles* page, not directly using the {es} {ref}/security-api.html#security-role-apis[role management API]. This role can then be assigned to users using the {es} {ref}/security-api.html#security-user-apis[user management APIs]. [[development-rbac-authorization]] diff --git a/docs/management/watcher-ui/index.asciidoc b/docs/management/watcher-ui/index.asciidoc index 96ad0d3acc287..2e941cb86ca0b 100644 --- a/docs/management/watcher-ui/index.asciidoc +++ b/docs/management/watcher-ui/index.asciidoc @@ -39,9 +39,8 @@ and either of these Watcher roles: * `watcher_admin`. You can perform all Watcher actions, including create and edit watches. * `watcher_user`. You can view watches, but not create or edit them. -To manage roles, open the main menu, then click *Stack Management > Roles*, or use the -<>. Watches are shared between -all users with the same role. +To manage roles, open the main menu, then click *Stack Management > Roles*, or use the {api-kibana}/group/endpoint-roles[role APIs]. +Watches are shared between all users with the same role. NOTE: If you are creating a threshold watch, you must also have the `view_index_metadata` index privilege. See {ref}/index-mgmt.html[Index management] for detailed information. diff --git a/docs/redirects.asciidoc b/docs/redirects.asciidoc index 1fa61881eca92..84cf809c66667 100644 --- a/docs/redirects.asciidoc +++ b/docs/redirects.asciidoc @@ -1196,4 +1196,28 @@ Refer to {api-kibana}/group/endpoint-spaces[spaces APIs]. [role="exclude",id="spaces-api-update-objects-spaces"] == Update saved objects spaces API -Refer to {api-kibana}/group/endpoint-spaces[spaces APIs]. \ No newline at end of file +Refer to {api-kibana}/group/endpoint-spaces[spaces APIs]. +[role="exclude",id="role-management-api-delete] +== Delete role API + +Refer to {api-kibana}/group/endpoint-roles[role APIs]. + +[role="exclude",id="role-management-api-get"] +== Get all {kib} roles API + +Refer to {api-kibana}/group/endpoint-roles[role APIs]. + +[role="exclude",id="role-management-specific-api-get"] +== Get specific role API + +Refer to {api-kibana}/group/endpoint-roles[role APIs]. + +[role="exclude",id="role-management-api-put-bulk"] +== Bulk create or update roles API + +Refer to {api-kibana}/group/endpoint-roles[role APIs]. + +[role="exclude",id="role-management-api-put"] +== Create or update role API + +Refer to {api-kibana}/group/endpoint-roles[role APIs]. diff --git a/docs/setup/configuring-reporting.asciidoc b/docs/setup/configuring-reporting.asciidoc index a1b2f7e9af583..4213cf38b6398 100644 --- a/docs/setup/configuring-reporting.asciidoc +++ b/docs/setup/configuring-reporting.asciidoc @@ -99,9 +99,10 @@ Granting the privilege to generate reports also grants the user the privilege to [float] [[reporting-roles-user-api]] ==== Grant access with the role API -With <> enabled in Reporting, you can also use the {ref}/security-api-put-role.html[role API] to grant access to the {report-features}, using *All* privileges, or sub-feature privileges. +With <> enabled in Reporting, you can also use the {api-kibana}/group/endpoint-roles[role APIs] to grant access to the {report-features}, using *All* privileges, or sub-feature privileges. + +NOTE: This API request needs to be run against the <>. -NOTE: This link:https://www.elastic.co/guide/en/kibana/current/role-management-api-put.html[API request] needs to be executed against the link:https://www.elastic.co/guide/en/kibana/current/api.html[Kibana API endpoint]. [source, sh] --------------------------------------------------------------- PUT :/api/security/role/custom_reporting_user diff --git a/docs/user/introduction.asciidoc b/docs/user/introduction.asciidoc index f3281b9bed175..48c9dfd91c9c6 100644 --- a/docs/user/introduction.asciidoc +++ b/docs/user/introduction.asciidoc @@ -193,8 +193,8 @@ or even give users their very own private space. For example, power users might have privileges to create and edit visualizations and dashboards, while analysts or executives might have *Dashboard* and *Canvas* with read-only privileges. -{kib}’s role management interface allows you to describe these various access -levels, or you can automate role creation via our <>. +The {kib} role management interface allows you to describe these various access +levels, or you can automate role creation by using {api-kibana}/group/endpoint-roles[role APIs]. [role="screenshot"] image::spaces/images/spaces-roles.png[{kib privileges}] diff --git a/docs/user/security/api-keys/index.asciidoc b/docs/user/security/api-keys/index.asciidoc index 5b3dd206b5408..2f9a0d337e3b9 100644 --- a/docs/user/security/api-keys/index.asciidoc +++ b/docs/user/security/api-keys/index.asciidoc @@ -28,7 +28,7 @@ image:images/api-keys.png["API Keys UI"] * To create or update a *cross-cluster API key*, you must have the `manage_security` privilege and an Enterprise license. * To have a read-only view on the API keys, you must have access to the page and the `read_security` cluster privilege. -To manage roles, open the main menu, then click *Stack Management > Security > Roles*, or use the <>. +To manage roles, open the main menu, then click *Stack Management > Security > Roles*, or use the {api-kibana}/group/endpoint-roles[role APIs]. [float] [[create-api-key]] diff --git a/docs/user/security/authorization/kibana-privileges.asciidoc b/docs/user/security/authorization/kibana-privileges.asciidoc index 581210bb9d393..6c9a94a354fb3 100644 --- a/docs/user/security/authorization/kibana-privileges.asciidoc +++ b/docs/user/security/authorization/kibana-privileges.asciidoc @@ -1,22 +1,21 @@ -[role="xpack"] [[kibana-privileges]] -=== {kib} privileges += {kib} privileges {kib} privileges grant users access to features within {kib}. Roles have privileges to determine whether users have write or read access. -==== Base privileges +== Base privileges Assigning a base privilege grants access to all {kib} features, such as *Discover*, *Dashboard*, *Visualize Library*, and *Canvas*. [[kibana-privileges-all]] `all`:: Grants full read-write access. `read`:: Grants read-only access. -===== Assigning base privileges +=== Assigning base privileges From the role management screen: [role="screenshot"] image::security/images/assign-base-privilege.png[Assign base privilege] -From the <>: +Using the {api-kibana}/group/endpoint-roles[role APIs]: [source,js] -------------------------------------------------- PUT /api/security/role/my_kibana_role @@ -37,23 +36,23 @@ PUT /api/security/role/my_kibana_role [[kibana-feature-privileges]] -==== Feature privileges +== Feature privileges Assigning a feature privilege grants access to a specific feature. `all`:: Grants full read-write access. `read`:: Grants read-only access. -===== Sub-feature privileges +=== Sub-feature privileges Some features allow for finer access control than the `all` and `read` privileges. -This additional level of control is a https://www.elastic.co/subscriptions[subscription feature]. +This additional level of control is a {subscriptions}[subscription feature]. -===== Assigning feature privileges +=== Assigning feature privileges From the role management screen: [role="screenshot"] image::security/images/assign-subfeature-privilege.png[Assign feature privilege] -From the <>: +Using the {api-kibana}/group/endpoint-roles[role APIs]: [source,js] -------------------------------------------------- PUT /api/security/role/my_kibana_role diff --git a/docs/user/security/index.asciidoc b/docs/user/security/index.asciidoc index 906aee3d76d5a..44d7c41391c35 100644 --- a/docs/user/security/index.asciidoc +++ b/docs/user/security/index.asciidoc @@ -30,7 +30,7 @@ authentication and built-in users, see === Roles To manage roles, open the main menu, then click *Stack Management > Roles*, or use -the <>. For more information on configuring roles for {kib}, see <>. +the {api-kibana}/group/endpoint-roles[role APIs]. For more information on configuring roles for {kib}, see <>. For a more holistic overview of configuring roles for the entire stack, see {ref}/authorization.html[User authorization]. @@ -43,7 +43,7 @@ cause Kibana's authorization to behave unexpectedly. ============================================================================ include::authorization/index.asciidoc[] -include::authorization/kibana-privileges.asciidoc[] +include::authorization/kibana-privileges.asciidoc[leveloffset=+2] include::api-keys/index.asciidoc[] include::role-mappings/index.asciidoc[] include::fips-140-2.asciidoc[] diff --git a/oas_docs/bundle.json b/oas_docs/bundle.json index 6bca9024e77ea..d2550d7cca7f2 100644 --- a/oas_docs/bundle.json +++ b/oas_docs/bundle.json @@ -41354,6 +41354,7 @@ } }, { + "description": "If `true` and the response contains any privileges that are associated with deprecated features, they are omitted in favor of details about the appropriate replacement feature privileges.", "in": "query", "name": "replaceDeprecatedPrivileges", "required": false, @@ -41362,7 +41363,11 @@ } } ], - "responses": {}, + "responses": { + "200": { + "description": "Indicates a successful call." + } + }, "summary": "Get all roles", "tags": [ "roles" @@ -41405,7 +41410,11 @@ } } ], - "responses": {}, + "responses": { + "204": { + "description": "Indicates a successful call." + } + }, "summary": "Delete a role", "tags": [ "roles" @@ -41427,6 +41436,7 @@ } }, { + "description": "The role name.", "in": "path", "name": "name", "required": true, @@ -41436,6 +41446,7 @@ } }, { + "description": "If `true` and the response contains any privileges that are associated with deprecated features, they are omitted in favor of details about the appropriate replacement feature privileges.", "in": "query", "name": "replaceDeprecatedPrivileges", "required": false, @@ -41444,13 +41455,18 @@ } } ], - "responses": {}, + "responses": { + "200": { + "description": "Indicates a successful call." + } + }, "summary": "Get a role", "tags": [ "roles" ] }, "put": { + "description": "Create a new Kibana role or update the attributes of an existing role. Kibana roles are stored in the Elasticsearch native realm.", "operationId": "%2Fapi%2Fsecurity%2Frole%2F%7Bname%7D#2", "parameters": [ { @@ -41476,6 +41492,7 @@ } }, { + "description": "The role name.", "in": "path", "name": "name", "required": true, @@ -41486,6 +41503,7 @@ } }, { + "description": "When true, a role is not overwritten if it already exists.", "in": "query", "name": "createOnly", "required": false, @@ -41502,6 +41520,7 @@ "additionalProperties": false, "properties": { "description": { + "description": "A description for the role.", "maxLength": 2048, "type": "string" }, @@ -41510,6 +41529,7 @@ "properties": { "cluster": { "items": { + "description": "Cluster privileges that define the cluster level actions that users can perform.", "type": "string" }, "type": "array" @@ -41519,11 +41539,13 @@ "additionalProperties": false, "properties": { "allow_restricted_indices": { + "description": "Restricted indices are a special category of indices that are used internally to store configuration data and should not be directly accessed. Only internal system roles should normally grant privileges over the restricted indices. Toggling this flag is very strongly discouraged because it could effectively grant unrestricted operations on critical data, making the entire system unstable or leaking sensitive information. If for administrative purposes you need to create a role with privileges covering restricted indices, however, you can set this property to true. In that case, the names field covers the restricted indices too.", "type": "boolean" }, "field_security": { "additionalProperties": { "items": { + "description": "The document fields that the role members have read access to.", "type": "string" }, "type": "array" @@ -41532,6 +41554,7 @@ }, "names": { "items": { + "description": "The data streams, indices, and aliases to which the permissions in this entry apply. It supports wildcards (*).", "type": "string" }, "minItems": 1, @@ -41539,12 +41562,14 @@ }, "privileges": { "items": { + "description": "The index level privileges that the role members have for the data streams and indices.", "type": "string" }, "minItems": 1, "type": "array" }, "query": { + "description": "A search query that defines the documents the role members have read access to. A document within the specified data streams and indices must match this query in order for it to be accessible by the role members.", "type": "string" } }, @@ -41562,6 +41587,7 @@ "properties": { "clusters": { "items": { + "description": "A list of remote cluster aliases. It supports literal strings as well as wildcards and regular expressions.", "type": "string" }, "minItems": 1, @@ -41569,6 +41595,7 @@ }, "privileges": { "items": { + "description": "The cluster level privileges for the remote cluster. The allowed values are a subset of the cluster privileges.", "type": "string" }, "minItems": 1, @@ -41588,10 +41615,12 @@ "additionalProperties": false, "properties": { "allow_restricted_indices": { + "description": "Restricted indices are a special category of indices that are used internally to store configuration data and should not be directly accessed. Only internal system roles should normally grant privileges over the restricted indices. Toggling this flag is very strongly discouraged because it could effectively grant unrestricted operations on critical data, making the entire system unstable or leaking sensitive information. If for administrative purposes you need to create a role with privileges covering restricted indices, however, you can set this property to true. In that case, the names field will cover the restricted indices too.", "type": "boolean" }, "clusters": { "items": { + "description": "A list of remote cluster aliases. It supports literal strings as well as wildcards and regular expressions.", "type": "string" }, "minItems": 1, @@ -41600,6 +41629,7 @@ "field_security": { "additionalProperties": { "items": { + "description": "The document fields that the role members have read access to.", "type": "string" }, "type": "array" @@ -41608,6 +41638,7 @@ }, "names": { "items": { + "description": "A list of remote aliases, data streams, or indices to which the permissions apply. It supports wildcards (*).", "type": "string" }, "minItems": 1, @@ -41615,12 +41646,14 @@ }, "privileges": { "items": { + "description": "The index level privileges that role members have for the specified indices.", "type": "string" }, "minItems": 1, "type": "array" }, "query": { + "description": "A search query that defines the documents the role members have read access to. A document within the specified data streams and indices must match this query in order for it to be accessible by the role members. ", "type": "string" } }, @@ -41635,6 +41668,7 @@ }, "run_as": { "items": { + "description": "A user name that the role member can impersonate.", "type": "string" }, "type": "array" @@ -41669,12 +41703,14 @@ "oneOf": [ { "items": { + "description": "A base privilege that grants applies to all spaces.", "type": "string" }, "type": "array" }, { "items": { + "description": "A base privilege that applies to specific spaces.", "type": "string" }, "type": "array" @@ -41684,6 +41720,7 @@ "feature": { "additionalProperties": { "items": { + "description": "The privileges that the role member has for the feature.", "type": "string" }, "type": "array" @@ -41705,6 +41742,7 @@ }, { "items": { + "description": "A space that the privilege applies to.", "type": "string" }, "type": "array" @@ -41735,7 +41773,11 @@ } } }, - "responses": {}, + "responses": { + "204": { + "description": "Indicates a successful call." + } + }, "summary": "Create or update a role", "tags": [ "roles" @@ -41780,6 +41822,7 @@ "additionalProperties": false, "properties": { "description": { + "description": "A description for the role.", "maxLength": 2048, "type": "string" }, @@ -41788,6 +41831,7 @@ "properties": { "cluster": { "items": { + "description": "Cluster privileges that define the cluster level actions that users can perform.", "type": "string" }, "type": "array" @@ -41797,11 +41841,13 @@ "additionalProperties": false, "properties": { "allow_restricted_indices": { + "description": "Restricted indices are a special category of indices that are used internally to store configuration data and should not be directly accessed. Only internal system roles should normally grant privileges over the restricted indices. Toggling this flag is very strongly discouraged because it could effectively grant unrestricted operations on critical data, making the entire system unstable or leaking sensitive information. If for administrative purposes you need to create a role with privileges covering restricted indices, however, you can set this property to true. In that case, the names field covers the restricted indices too.", "type": "boolean" }, "field_security": { "additionalProperties": { "items": { + "description": "The document fields that the role members have read access to.", "type": "string" }, "type": "array" @@ -41810,6 +41856,7 @@ }, "names": { "items": { + "description": "The data streams, indices, and aliases to which the permissions in this entry apply. It supports wildcards (*).", "type": "string" }, "minItems": 1, @@ -41817,12 +41864,14 @@ }, "privileges": { "items": { + "description": "The index level privileges that the role members have for the data streams and indices.", "type": "string" }, "minItems": 1, "type": "array" }, "query": { + "description": "A search query that defines the documents the role members have read access to. A document within the specified data streams and indices must match this query in order for it to be accessible by the role members.", "type": "string" } }, @@ -41840,6 +41889,7 @@ "properties": { "clusters": { "items": { + "description": "A list of remote cluster aliases. It supports literal strings as well as wildcards and regular expressions.", "type": "string" }, "minItems": 1, @@ -41847,6 +41897,7 @@ }, "privileges": { "items": { + "description": "The cluster level privileges for the remote cluster. The allowed values are a subset of the cluster privileges.", "type": "string" }, "minItems": 1, @@ -41866,10 +41917,12 @@ "additionalProperties": false, "properties": { "allow_restricted_indices": { + "description": "Restricted indices are a special category of indices that are used internally to store configuration data and should not be directly accessed. Only internal system roles should normally grant privileges over the restricted indices. Toggling this flag is very strongly discouraged because it could effectively grant unrestricted operations on critical data, making the entire system unstable or leaking sensitive information. If for administrative purposes you need to create a role with privileges covering restricted indices, however, you can set this property to true. In that case, the names field will cover the restricted indices too.", "type": "boolean" }, "clusters": { "items": { + "description": "A list of remote cluster aliases. It supports literal strings as well as wildcards and regular expressions.", "type": "string" }, "minItems": 1, @@ -41878,6 +41931,7 @@ "field_security": { "additionalProperties": { "items": { + "description": "The document fields that the role members have read access to.", "type": "string" }, "type": "array" @@ -41886,6 +41940,7 @@ }, "names": { "items": { + "description": "A list of remote aliases, data streams, or indices to which the permissions apply. It supports wildcards (*).", "type": "string" }, "minItems": 1, @@ -41893,12 +41948,14 @@ }, "privileges": { "items": { + "description": "The index level privileges that role members have for the specified indices.", "type": "string" }, "minItems": 1, "type": "array" }, "query": { + "description": "A search query that defines the documents the role members have read access to. A document within the specified data streams and indices must match this query in order for it to be accessible by the role members. ", "type": "string" } }, @@ -41913,6 +41970,7 @@ }, "run_as": { "items": { + "description": "A user name that the role member can impersonate.", "type": "string" }, "type": "array" @@ -41947,12 +42005,14 @@ "oneOf": [ { "items": { + "description": "A base privilege that grants applies to all spaces.", "type": "string" }, "type": "array" }, { "items": { + "description": "A base privilege that applies to specific spaces.", "type": "string" }, "type": "array" @@ -41962,6 +42022,7 @@ "feature": { "additionalProperties": { "items": { + "description": "The privileges that the role member has for the feature.", "type": "string" }, "type": "array" @@ -41983,6 +42044,7 @@ }, { "items": { + "description": "A space that the privilege applies to.", "type": "string" }, "type": "array" @@ -42021,7 +42083,11 @@ } } }, - "responses": {}, + "responses": { + "200": { + "description": "Indicates a successful call." + } + }, "summary": "Create or update roles", "tags": [ "roles" diff --git a/oas_docs/bundle.serverless.json b/oas_docs/bundle.serverless.json index a8d428d5404fc..d415d769c175b 100644 --- a/oas_docs/bundle.serverless.json +++ b/oas_docs/bundle.serverless.json @@ -41354,6 +41354,7 @@ } }, { + "description": "If `true` and the response contains any privileges that are associated with deprecated features, they are omitted in favor of details about the appropriate replacement feature privileges.", "in": "query", "name": "replaceDeprecatedPrivileges", "required": false, @@ -41362,7 +41363,11 @@ } } ], - "responses": {}, + "responses": { + "200": { + "description": "Indicates a successful call." + } + }, "summary": "Get all roles", "tags": [ "roles" @@ -41405,7 +41410,11 @@ } } ], - "responses": {}, + "responses": { + "204": { + "description": "Indicates a successful call." + } + }, "summary": "Delete a role", "tags": [ "roles" @@ -41427,6 +41436,7 @@ } }, { + "description": "The role name.", "in": "path", "name": "name", "required": true, @@ -41436,6 +41446,7 @@ } }, { + "description": "If `true` and the response contains any privileges that are associated with deprecated features, they are omitted in favor of details about the appropriate replacement feature privileges.", "in": "query", "name": "replaceDeprecatedPrivileges", "required": false, @@ -41444,13 +41455,18 @@ } } ], - "responses": {}, + "responses": { + "200": { + "description": "Indicates a successful call." + } + }, "summary": "Get a role", "tags": [ "roles" ] }, "put": { + "description": "Create a new Kibana role or update the attributes of an existing role. Kibana roles are stored in the Elasticsearch native realm.", "operationId": "%2Fapi%2Fsecurity%2Frole%2F%7Bname%7D#2", "parameters": [ { @@ -41476,6 +41492,7 @@ } }, { + "description": "The role name.", "in": "path", "name": "name", "required": true, @@ -41486,6 +41503,7 @@ } }, { + "description": "When true, a role is not overwritten if it already exists.", "in": "query", "name": "createOnly", "required": false, @@ -41502,6 +41520,7 @@ "additionalProperties": false, "properties": { "description": { + "description": "A description for the role.", "maxLength": 2048, "type": "string" }, @@ -41510,6 +41529,7 @@ "properties": { "cluster": { "items": { + "description": "Cluster privileges that define the cluster level actions that users can perform.", "type": "string" }, "type": "array" @@ -41519,11 +41539,13 @@ "additionalProperties": false, "properties": { "allow_restricted_indices": { + "description": "Restricted indices are a special category of indices that are used internally to store configuration data and should not be directly accessed. Only internal system roles should normally grant privileges over the restricted indices. Toggling this flag is very strongly discouraged because it could effectively grant unrestricted operations on critical data, making the entire system unstable or leaking sensitive information. If for administrative purposes you need to create a role with privileges covering restricted indices, however, you can set this property to true. In that case, the names field covers the restricted indices too.", "type": "boolean" }, "field_security": { "additionalProperties": { "items": { + "description": "The document fields that the role members have read access to.", "type": "string" }, "type": "array" @@ -41532,6 +41554,7 @@ }, "names": { "items": { + "description": "The data streams, indices, and aliases to which the permissions in this entry apply. It supports wildcards (*).", "type": "string" }, "minItems": 1, @@ -41539,12 +41562,14 @@ }, "privileges": { "items": { + "description": "The index level privileges that the role members have for the data streams and indices.", "type": "string" }, "minItems": 1, "type": "array" }, "query": { + "description": "A search query that defines the documents the role members have read access to. A document within the specified data streams and indices must match this query in order for it to be accessible by the role members.", "type": "string" } }, @@ -41562,6 +41587,7 @@ "properties": { "clusters": { "items": { + "description": "A list of remote cluster aliases. It supports literal strings as well as wildcards and regular expressions.", "type": "string" }, "minItems": 1, @@ -41569,6 +41595,7 @@ }, "privileges": { "items": { + "description": "The cluster level privileges for the remote cluster. The allowed values are a subset of the cluster privileges.", "type": "string" }, "minItems": 1, @@ -41588,10 +41615,12 @@ "additionalProperties": false, "properties": { "allow_restricted_indices": { + "description": "Restricted indices are a special category of indices that are used internally to store configuration data and should not be directly accessed. Only internal system roles should normally grant privileges over the restricted indices. Toggling this flag is very strongly discouraged because it could effectively grant unrestricted operations on critical data, making the entire system unstable or leaking sensitive information. If for administrative purposes you need to create a role with privileges covering restricted indices, however, you can set this property to true. In that case, the names field will cover the restricted indices too.", "type": "boolean" }, "clusters": { "items": { + "description": "A list of remote cluster aliases. It supports literal strings as well as wildcards and regular expressions.", "type": "string" }, "minItems": 1, @@ -41600,6 +41629,7 @@ "field_security": { "additionalProperties": { "items": { + "description": "The document fields that the role members have read access to.", "type": "string" }, "type": "array" @@ -41608,6 +41638,7 @@ }, "names": { "items": { + "description": "A list of remote aliases, data streams, or indices to which the permissions apply. It supports wildcards (*).", "type": "string" }, "minItems": 1, @@ -41615,12 +41646,14 @@ }, "privileges": { "items": { + "description": "The index level privileges that role members have for the specified indices.", "type": "string" }, "minItems": 1, "type": "array" }, "query": { + "description": "A search query that defines the documents the role members have read access to. A document within the specified data streams and indices must match this query in order for it to be accessible by the role members. ", "type": "string" } }, @@ -41635,6 +41668,7 @@ }, "run_as": { "items": { + "description": "A user name that the role member can impersonate.", "type": "string" }, "type": "array" @@ -41669,12 +41703,14 @@ "oneOf": [ { "items": { + "description": "A base privilege that grants applies to all spaces.", "type": "string" }, "type": "array" }, { "items": { + "description": "A base privilege that applies to specific spaces.", "type": "string" }, "type": "array" @@ -41684,6 +41720,7 @@ "feature": { "additionalProperties": { "items": { + "description": "The privileges that the role member has for the feature.", "type": "string" }, "type": "array" @@ -41705,6 +41742,7 @@ }, { "items": { + "description": "A space that the privilege applies to.", "type": "string" }, "type": "array" @@ -41735,7 +41773,11 @@ } } }, - "responses": {}, + "responses": { + "204": { + "description": "Indicates a successful call." + } + }, "summary": "Create or update a role", "tags": [ "roles" @@ -41780,6 +41822,7 @@ "additionalProperties": false, "properties": { "description": { + "description": "A description for the role.", "maxLength": 2048, "type": "string" }, @@ -41788,6 +41831,7 @@ "properties": { "cluster": { "items": { + "description": "Cluster privileges that define the cluster level actions that users can perform.", "type": "string" }, "type": "array" @@ -41797,11 +41841,13 @@ "additionalProperties": false, "properties": { "allow_restricted_indices": { + "description": "Restricted indices are a special category of indices that are used internally to store configuration data and should not be directly accessed. Only internal system roles should normally grant privileges over the restricted indices. Toggling this flag is very strongly discouraged because it could effectively grant unrestricted operations on critical data, making the entire system unstable or leaking sensitive information. If for administrative purposes you need to create a role with privileges covering restricted indices, however, you can set this property to true. In that case, the names field covers the restricted indices too.", "type": "boolean" }, "field_security": { "additionalProperties": { "items": { + "description": "The document fields that the role members have read access to.", "type": "string" }, "type": "array" @@ -41810,6 +41856,7 @@ }, "names": { "items": { + "description": "The data streams, indices, and aliases to which the permissions in this entry apply. It supports wildcards (*).", "type": "string" }, "minItems": 1, @@ -41817,12 +41864,14 @@ }, "privileges": { "items": { + "description": "The index level privileges that the role members have for the data streams and indices.", "type": "string" }, "minItems": 1, "type": "array" }, "query": { + "description": "A search query that defines the documents the role members have read access to. A document within the specified data streams and indices must match this query in order for it to be accessible by the role members.", "type": "string" } }, @@ -41840,6 +41889,7 @@ "properties": { "clusters": { "items": { + "description": "A list of remote cluster aliases. It supports literal strings as well as wildcards and regular expressions.", "type": "string" }, "minItems": 1, @@ -41847,6 +41897,7 @@ }, "privileges": { "items": { + "description": "The cluster level privileges for the remote cluster. The allowed values are a subset of the cluster privileges.", "type": "string" }, "minItems": 1, @@ -41866,10 +41917,12 @@ "additionalProperties": false, "properties": { "allow_restricted_indices": { + "description": "Restricted indices are a special category of indices that are used internally to store configuration data and should not be directly accessed. Only internal system roles should normally grant privileges over the restricted indices. Toggling this flag is very strongly discouraged because it could effectively grant unrestricted operations on critical data, making the entire system unstable or leaking sensitive information. If for administrative purposes you need to create a role with privileges covering restricted indices, however, you can set this property to true. In that case, the names field will cover the restricted indices too.", "type": "boolean" }, "clusters": { "items": { + "description": "A list of remote cluster aliases. It supports literal strings as well as wildcards and regular expressions.", "type": "string" }, "minItems": 1, @@ -41878,6 +41931,7 @@ "field_security": { "additionalProperties": { "items": { + "description": "The document fields that the role members have read access to.", "type": "string" }, "type": "array" @@ -41886,6 +41940,7 @@ }, "names": { "items": { + "description": "A list of remote aliases, data streams, or indices to which the permissions apply. It supports wildcards (*).", "type": "string" }, "minItems": 1, @@ -41893,12 +41948,14 @@ }, "privileges": { "items": { + "description": "The index level privileges that role members have for the specified indices.", "type": "string" }, "minItems": 1, "type": "array" }, "query": { + "description": "A search query that defines the documents the role members have read access to. A document within the specified data streams and indices must match this query in order for it to be accessible by the role members. ", "type": "string" } }, @@ -41913,6 +41970,7 @@ }, "run_as": { "items": { + "description": "A user name that the role member can impersonate.", "type": "string" }, "type": "array" @@ -41947,12 +42005,14 @@ "oneOf": [ { "items": { + "description": "A base privilege that grants applies to all spaces.", "type": "string" }, "type": "array" }, { "items": { + "description": "A base privilege that applies to specific spaces.", "type": "string" }, "type": "array" @@ -41962,6 +42022,7 @@ "feature": { "additionalProperties": { "items": { + "description": "The privileges that the role member has for the feature.", "type": "string" }, "type": "array" @@ -41983,6 +42044,7 @@ }, { "items": { + "description": "A space that the privilege applies to.", "type": "string" }, "type": "array" @@ -42021,7 +42083,11 @@ } } }, - "responses": {}, + "responses": { + "200": { + "description": "Indicates a successful call." + } + }, "summary": "Create or update roles", "tags": [ "roles" diff --git a/oas_docs/examples/create_role_request1.yaml b/oas_docs/examples/create_role_request1.yaml new file mode 100644 index 0000000000000..1d041005f30de --- /dev/null +++ b/oas_docs/examples/create_role_request1.yaml @@ -0,0 +1,23 @@ +summary: Feature privileges in multiple spaces +description: Grant access to various features in some spaces. +value: + description: Grant full access to discover and dashboard features in the default space. Grant read access in the marketing, and sales spaces. + metadata: + version: 1 + elasticsearch: + cluster: [] + indices: [] + kibana: + - base: [] + feature: + discover: + - all + dashboard: + - all + spaces: + - default + - base: + - read + spaces: + - marketing + - sales diff --git a/oas_docs/examples/create_role_request2.yaml b/oas_docs/examples/create_role_request2.yaml new file mode 100644 index 0000000000000..d36d7e2330f3c --- /dev/null +++ b/oas_docs/examples/create_role_request2.yaml @@ -0,0 +1,16 @@ +summary: Dashboard privileges in a space +description: Grant access to dashboard features in a Marketing space. +value: + description: Grant dashboard access in the Marketing space. + metadata: + version: 1 + elasticsearch: + cluster: [] + indices: [] + kibana: + - base: [] + feature: + dashboard: + - read + spaces: + - marketing \ No newline at end of file diff --git a/oas_docs/examples/create_role_request3.yaml b/oas_docs/examples/create_role_request3.yaml new file mode 100644 index 0000000000000..55b4cb0834b9f --- /dev/null +++ b/oas_docs/examples/create_role_request3.yaml @@ -0,0 +1,14 @@ +summary: Feature privileges in a space +description: Grant full access to all features in the default space. +value: + metadata: + version: 1 + elasticsearch: + cluster: [] + indices: [] + kibana: + - base: + - all + feature: { } + spaces: + - default \ No newline at end of file diff --git a/oas_docs/examples/create_role_request4.yaml b/oas_docs/examples/create_role_request4.yaml new file mode 100644 index 0000000000000..f2332e2e934dc --- /dev/null +++ b/oas_docs/examples/create_role_request4.yaml @@ -0,0 +1,34 @@ +summary: Elasticsearch and Kibana feature privileges +description: Grant Elasticsearch and Kibana feature privileges. +value: + description: Grant all cluster privileges and full access to index1 and index2. Grant full access to remote_index1 and remote_index2, and the monitor_enrich cluster privilege on remote_cluster1. Grant all Kibana privileges in the default space. + metadata: + version: 1 + elasticsearch: + cluster: + - all + indices: + - names: + - index1 + - index2 + privileges: + - all + remote_indices: + - clusters: + - remote_cluster1 + names: + - remote_index1 + - remote_index2 + privileges: + - all + remote_cluster: + - clusters: + - remote_cluster1 + privileges: + - monitor_enrich + kibana: + - base: + - all + feature: { } + spaces: + - default \ No newline at end of file diff --git a/oas_docs/examples/get_role_response1.yaml b/oas_docs/examples/get_role_response1.yaml new file mode 100644 index 0000000000000..5e44481afa8ce --- /dev/null +++ b/oas_docs/examples/get_role_response1.yaml @@ -0,0 +1,41 @@ +summary: Get role details +value: + name: my_kibana_role + description: Grants all cluster privileges and full access to index1 and index2. Grants full access to remote_index1 and remote_index2, and the monitor_enrich cluster privilege on remote_cluster1. Grants all Kibana privileges in the default space. + metadata: + version: 1 + transient_metadata: + enabled: true + elasticsearch: + cluster: + - all + remote_cluster: + - privileges: + - monitor_enrich + clusters: + - remote_cluster1 + indices: + - names: + - index1 + - index2 + privileges: + - all + allow_restricted_indices: false + remote_indices: + - names: + - remote_index1 + - remote_index2 + privileges: + - all + allow_restricted_indices: false + clusters: + - remote_cluster1 + run_as: [] + kibana: + - base: + - all + feature: {} + spaces: + - default + _transform_error: [] + _unrecognized_applications: [] diff --git a/oas_docs/examples/get_roles_response1.yaml b/oas_docs/examples/get_roles_response1.yaml new file mode 100644 index 0000000000000..9c3a45163ace1 --- /dev/null +++ b/oas_docs/examples/get_roles_response1.yaml @@ -0,0 +1,39 @@ +summary: Get all role details +value: + - name: my_kibana_role + description: My kibana role description + metadata: + version: 1 + transient_metadata: + enabled: true + elasticsearch: + indices: [] + cluster: [] + run_as: [] + kibana: + - base: + - all + feature: {} + spaces: + - "*" + - name: my_admin_role + description: My admin role description + metadata: + version: 1 + transient_metadata: + enabled: true + elasticsearch: + cluster: + - all + indices: + - names: + - index1 + - index2 + privileges: + - all + field_security: + grant: + - title + - body + query: '{\"match\": {\"title\": \"foo\"}}' + kibana: [] \ No newline at end of file diff --git a/oas_docs/output/kibana.serverless.yaml b/oas_docs/output/kibana.serverless.yaml index 05f614ede3df7..78c228171175b 100644 --- a/oas_docs/output/kibana.serverless.yaml +++ b/oas_docs/output/kibana.serverless.yaml @@ -36792,12 +36792,18 @@ paths: enum: - '2023-10-31' type: string - - in: query + - description: >- + If `true` and the response contains any privileges that are + associated with deprecated features, they are omitted in favor of + details about the appropriate replacement feature privileges. + in: query name: replaceDeprecatedPrivileges required: false schema: type: boolean - responses: {} + responses: + '200': + description: Indicates a successful call. summary: Get all roles tags: - roles @@ -36826,7 +36832,9 @@ paths: schema: minLength: 1 type: string - responses: {} + responses: + '204': + description: Indicates a successful call. summary: Delete a role tags: - roles @@ -36841,22 +36849,32 @@ paths: enum: - '2023-10-31' type: string - - in: path + - description: The role name. + in: path name: name required: true schema: minLength: 1 type: string - - in: query + - description: >- + If `true` and the response contains any privileges that are + associated with deprecated features, they are omitted in favor of + details about the appropriate replacement feature privileges. + in: query name: replaceDeprecatedPrivileges required: false schema: type: boolean - responses: {} + responses: + '200': + description: Indicates a successful call. summary: Get a role tags: - roles put: + description: >- + Create a new Kibana role or update the attributes of an existing role. + Kibana roles are stored in the Elasticsearch native realm. operationId: '%2Fapi%2Fsecurity%2Frole%2F%7Bname%7D#2' parameters: - description: The version of the API to use @@ -36874,14 +36892,16 @@ paths: schema: example: 'true' type: string - - in: path + - description: The role name. + in: path name: name required: true schema: maxLength: 1024 minLength: 1 type: string - - in: query + - description: When true, a role is not overwritten if it already exists. + in: query name: createOnly required: false schema: @@ -36895,6 +36915,7 @@ paths: type: object properties: description: + description: A description for the role. maxLength: 2048 type: string elasticsearch: @@ -36903,6 +36924,9 @@ paths: properties: cluster: items: + description: >- + Cluster privileges that define the cluster level + actions that users can perform. type: string type: array indices: @@ -36911,24 +36935,55 @@ paths: type: object properties: allow_restricted_indices: + description: >- + Restricted indices are a special category of + indices that are used internally to store + configuration data and should not be directly + accessed. Only internal system roles should + normally grant privileges over the restricted + indices. Toggling this flag is very strongly + discouraged because it could effectively grant + unrestricted operations on critical data, making + the entire system unstable or leaking sensitive + information. If for administrative purposes you + need to create a role with privileges covering + restricted indices, however, you can set this + property to true. In that case, the names field + covers the restricted indices too. type: boolean field_security: additionalProperties: items: + description: >- + The document fields that the role members have + read access to. type: string type: array type: object names: items: + description: >- + The data streams, indices, and aliases to which + the permissions in this entry apply. It supports + wildcards (*). type: string minItems: 1 type: array privileges: items: + description: >- + The index level privileges that the role members + have for the data streams and indices. type: string minItems: 1 type: array query: + description: >- + A search query that defines the documents the role + members have read access to. A document within the + specified data streams and indices must match this + query in order for it to be accessible by the role + members. type: string required: - names @@ -36941,11 +36996,19 @@ paths: properties: clusters: items: + description: >- + A list of remote cluster aliases. It supports + literal strings as well as wildcards and regular + expressions. type: string minItems: 1 type: array privileges: items: + description: >- + The cluster level privileges for the remote + cluster. The allowed values are a subset of the + cluster privileges. type: string minItems: 1 type: array @@ -36959,29 +37022,64 @@ paths: type: object properties: allow_restricted_indices: + description: >- + Restricted indices are a special category of + indices that are used internally to store + configuration data and should not be directly + accessed. Only internal system roles should + normally grant privileges over the restricted + indices. Toggling this flag is very strongly + discouraged because it could effectively grant + unrestricted operations on critical data, making + the entire system unstable or leaking sensitive + information. If for administrative purposes you + need to create a role with privileges covering + restricted indices, however, you can set this + property to true. In that case, the names field + will cover the restricted indices too. type: boolean clusters: items: + description: >- + A list of remote cluster aliases. It supports + literal strings as well as wildcards and regular + expressions. type: string minItems: 1 type: array field_security: additionalProperties: items: + description: >- + The document fields that the role members have + read access to. type: string type: array type: object names: items: + description: >- + A list of remote aliases, data streams, or + indices to which the permissions apply. It + supports wildcards (*). type: string minItems: 1 type: array privileges: items: + description: >- + The index level privileges that role members + have for the specified indices. type: string minItems: 1 type: array query: + description: >- + A search query that defines the documents the role + members have read access to. A document within the + specified data streams and indices must match this + query in order for it to be accessible by the role + members. type: string required: - clusters @@ -36990,6 +37088,7 @@ paths: type: array run_as: items: + description: A user name that the role member can impersonate. type: string type: array kibana: @@ -37008,14 +37107,23 @@ paths: nullable: true oneOf: - items: + description: >- + A base privilege that grants applies to all + spaces. type: string type: array - items: + description: >- + A base privilege that applies to specific + spaces. type: string type: array feature: additionalProperties: items: + description: >- + The privileges that the role member has for the + feature. type: string type: array type: object @@ -37029,6 +37137,7 @@ paths: minItems: 1 type: array - items: + description: A space that the privilege applies to. type: string type: array default: @@ -37041,7 +37150,9 @@ paths: type: object required: - elasticsearch - responses: {} + responses: + '204': + description: Indicates a successful call. summary: Create or update a role tags: - roles @@ -37077,6 +37188,7 @@ paths: type: object properties: description: + description: A description for the role. maxLength: 2048 type: string elasticsearch: @@ -37085,6 +37197,9 @@ paths: properties: cluster: items: + description: >- + Cluster privileges that define the cluster level + actions that users can perform. type: string type: array indices: @@ -37093,24 +37208,58 @@ paths: type: object properties: allow_restricted_indices: + description: >- + Restricted indices are a special category of + indices that are used internally to store + configuration data and should not be + directly accessed. Only internal system + roles should normally grant privileges over + the restricted indices. Toggling this flag + is very strongly discouraged because it + could effectively grant unrestricted + operations on critical data, making the + entire system unstable or leaking sensitive + information. If for administrative purposes + you need to create a role with privileges + covering restricted indices, however, you + can set this property to true. In that case, + the names field covers the restricted + indices too. type: boolean field_security: additionalProperties: items: + description: >- + The document fields that the role + members have read access to. type: string type: array type: object names: items: + description: >- + The data streams, indices, and aliases to + which the permissions in this entry apply. + It supports wildcards (*). type: string minItems: 1 type: array privileges: items: + description: >- + The index level privileges that the role + members have for the data streams and + indices. type: string minItems: 1 type: array query: + description: >- + A search query that defines the documents + the role members have read access to. A + document within the specified data streams + and indices must match this query in order + for it to be accessible by the role members. type: string required: - names @@ -37123,11 +37272,19 @@ paths: properties: clusters: items: + description: >- + A list of remote cluster aliases. It + supports literal strings as well as + wildcards and regular expressions. type: string minItems: 1 type: array privileges: items: + description: >- + The cluster level privileges for the + remote cluster. The allowed values are a + subset of the cluster privileges. type: string minItems: 1 type: array @@ -37141,29 +37298,67 @@ paths: type: object properties: allow_restricted_indices: + description: >- + Restricted indices are a special category of + indices that are used internally to store + configuration data and should not be + directly accessed. Only internal system + roles should normally grant privileges over + the restricted indices. Toggling this flag + is very strongly discouraged because it + could effectively grant unrestricted + operations on critical data, making the + entire system unstable or leaking sensitive + information. If for administrative purposes + you need to create a role with privileges + covering restricted indices, however, you + can set this property to true. In that case, + the names field will cover the restricted + indices too. type: boolean clusters: items: + description: >- + A list of remote cluster aliases. It + supports literal strings as well as + wildcards and regular expressions. type: string minItems: 1 type: array field_security: additionalProperties: items: + description: >- + The document fields that the role + members have read access to. type: string type: array type: object names: items: + description: >- + A list of remote aliases, data streams, or + indices to which the permissions apply. It + supports wildcards (*). type: string minItems: 1 type: array privileges: items: + description: >- + The index level privileges that role + members have for the specified indices. type: string minItems: 1 type: array query: + description: >- + A search query that defines the documents + the role members have read access to. A + document within the specified data streams + and indices must match this query in order + for it to be accessible by the role + members. type: string required: - clusters @@ -37172,6 +37367,9 @@ paths: type: array run_as: items: + description: >- + A user name that the role member can + impersonate. type: string type: array kibana: @@ -37190,14 +37388,23 @@ paths: nullable: true oneOf: - items: + description: >- + A base privilege that grants applies to + all spaces. type: string type: array - items: + description: >- + A base privilege that applies to specific + spaces. type: string type: array feature: additionalProperties: items: + description: >- + The privileges that the role member has for + the feature. type: string type: array type: object @@ -37211,6 +37418,7 @@ paths: minItems: 1 type: array - items: + description: A space that the privilege applies to. type: string type: array default: @@ -37226,7 +37434,9 @@ paths: type: object required: - roles - responses: {} + responses: + '200': + description: Indicates a successful call. summary: Create or update roles tags: - roles diff --git a/oas_docs/output/kibana.yaml b/oas_docs/output/kibana.yaml index 044914ccc5758..e7d8b9240cf1f 100644 --- a/oas_docs/output/kibana.yaml +++ b/oas_docs/output/kibana.yaml @@ -40886,12 +40886,18 @@ paths: enum: - '2023-10-31' type: string - - in: query + - description: >- + If `true` and the response contains any privileges that are + associated with deprecated features, they are omitted in favor of + details about the appropriate replacement feature privileges. + in: query name: replaceDeprecatedPrivileges required: false schema: type: boolean - responses: {} + responses: + '200': + description: Indicates a successful call. summary: Get all roles tags: - roles @@ -40920,7 +40926,9 @@ paths: schema: minLength: 1 type: string - responses: {} + responses: + '204': + description: Indicates a successful call. summary: Delete a role tags: - roles @@ -40935,22 +40943,32 @@ paths: enum: - '2023-10-31' type: string - - in: path + - description: The role name. + in: path name: name required: true schema: minLength: 1 type: string - - in: query + - description: >- + If `true` and the response contains any privileges that are + associated with deprecated features, they are omitted in favor of + details about the appropriate replacement feature privileges. + in: query name: replaceDeprecatedPrivileges required: false schema: type: boolean - responses: {} + responses: + '200': + description: Indicates a successful call. summary: Get a role tags: - roles put: + description: >- + Create a new Kibana role or update the attributes of an existing role. + Kibana roles are stored in the Elasticsearch native realm. operationId: '%2Fapi%2Fsecurity%2Frole%2F%7Bname%7D#2' parameters: - description: The version of the API to use @@ -40968,14 +40986,16 @@ paths: schema: example: 'true' type: string - - in: path + - description: The role name. + in: path name: name required: true schema: maxLength: 1024 minLength: 1 type: string - - in: query + - description: When true, a role is not overwritten if it already exists. + in: query name: createOnly required: false schema: @@ -40989,6 +41009,7 @@ paths: type: object properties: description: + description: A description for the role. maxLength: 2048 type: string elasticsearch: @@ -40997,6 +41018,9 @@ paths: properties: cluster: items: + description: >- + Cluster privileges that define the cluster level + actions that users can perform. type: string type: array indices: @@ -41005,24 +41029,55 @@ paths: type: object properties: allow_restricted_indices: + description: >- + Restricted indices are a special category of + indices that are used internally to store + configuration data and should not be directly + accessed. Only internal system roles should + normally grant privileges over the restricted + indices. Toggling this flag is very strongly + discouraged because it could effectively grant + unrestricted operations on critical data, making + the entire system unstable or leaking sensitive + information. If for administrative purposes you + need to create a role with privileges covering + restricted indices, however, you can set this + property to true. In that case, the names field + covers the restricted indices too. type: boolean field_security: additionalProperties: items: + description: >- + The document fields that the role members have + read access to. type: string type: array type: object names: items: + description: >- + The data streams, indices, and aliases to which + the permissions in this entry apply. It supports + wildcards (*). type: string minItems: 1 type: array privileges: items: + description: >- + The index level privileges that the role members + have for the data streams and indices. type: string minItems: 1 type: array query: + description: >- + A search query that defines the documents the role + members have read access to. A document within the + specified data streams and indices must match this + query in order for it to be accessible by the role + members. type: string required: - names @@ -41035,11 +41090,19 @@ paths: properties: clusters: items: + description: >- + A list of remote cluster aliases. It supports + literal strings as well as wildcards and regular + expressions. type: string minItems: 1 type: array privileges: items: + description: >- + The cluster level privileges for the remote + cluster. The allowed values are a subset of the + cluster privileges. type: string minItems: 1 type: array @@ -41053,29 +41116,64 @@ paths: type: object properties: allow_restricted_indices: + description: >- + Restricted indices are a special category of + indices that are used internally to store + configuration data and should not be directly + accessed. Only internal system roles should + normally grant privileges over the restricted + indices. Toggling this flag is very strongly + discouraged because it could effectively grant + unrestricted operations on critical data, making + the entire system unstable or leaking sensitive + information. If for administrative purposes you + need to create a role with privileges covering + restricted indices, however, you can set this + property to true. In that case, the names field + will cover the restricted indices too. type: boolean clusters: items: + description: >- + A list of remote cluster aliases. It supports + literal strings as well as wildcards and regular + expressions. type: string minItems: 1 type: array field_security: additionalProperties: items: + description: >- + The document fields that the role members have + read access to. type: string type: array type: object names: items: + description: >- + A list of remote aliases, data streams, or + indices to which the permissions apply. It + supports wildcards (*). type: string minItems: 1 type: array privileges: items: + description: >- + The index level privileges that role members + have for the specified indices. type: string minItems: 1 type: array query: + description: >- + A search query that defines the documents the role + members have read access to. A document within the + specified data streams and indices must match this + query in order for it to be accessible by the role + members. type: string required: - clusters @@ -41084,6 +41182,7 @@ paths: type: array run_as: items: + description: A user name that the role member can impersonate. type: string type: array kibana: @@ -41102,14 +41201,23 @@ paths: nullable: true oneOf: - items: + description: >- + A base privilege that grants applies to all + spaces. type: string type: array - items: + description: >- + A base privilege that applies to specific + spaces. type: string type: array feature: additionalProperties: items: + description: >- + The privileges that the role member has for the + feature. type: string type: array type: object @@ -41123,6 +41231,7 @@ paths: minItems: 1 type: array - items: + description: A space that the privilege applies to. type: string type: array default: @@ -41135,7 +41244,9 @@ paths: type: object required: - elasticsearch - responses: {} + responses: + '204': + description: Indicates a successful call. summary: Create or update a role tags: - roles @@ -41171,6 +41282,7 @@ paths: type: object properties: description: + description: A description for the role. maxLength: 2048 type: string elasticsearch: @@ -41179,6 +41291,9 @@ paths: properties: cluster: items: + description: >- + Cluster privileges that define the cluster level + actions that users can perform. type: string type: array indices: @@ -41187,24 +41302,58 @@ paths: type: object properties: allow_restricted_indices: + description: >- + Restricted indices are a special category of + indices that are used internally to store + configuration data and should not be + directly accessed. Only internal system + roles should normally grant privileges over + the restricted indices. Toggling this flag + is very strongly discouraged because it + could effectively grant unrestricted + operations on critical data, making the + entire system unstable or leaking sensitive + information. If for administrative purposes + you need to create a role with privileges + covering restricted indices, however, you + can set this property to true. In that case, + the names field covers the restricted + indices too. type: boolean field_security: additionalProperties: items: + description: >- + The document fields that the role + members have read access to. type: string type: array type: object names: items: + description: >- + The data streams, indices, and aliases to + which the permissions in this entry apply. + It supports wildcards (*). type: string minItems: 1 type: array privileges: items: + description: >- + The index level privileges that the role + members have for the data streams and + indices. type: string minItems: 1 type: array query: + description: >- + A search query that defines the documents + the role members have read access to. A + document within the specified data streams + and indices must match this query in order + for it to be accessible by the role members. type: string required: - names @@ -41217,11 +41366,19 @@ paths: properties: clusters: items: + description: >- + A list of remote cluster aliases. It + supports literal strings as well as + wildcards and regular expressions. type: string minItems: 1 type: array privileges: items: + description: >- + The cluster level privileges for the + remote cluster. The allowed values are a + subset of the cluster privileges. type: string minItems: 1 type: array @@ -41235,29 +41392,67 @@ paths: type: object properties: allow_restricted_indices: + description: >- + Restricted indices are a special category of + indices that are used internally to store + configuration data and should not be + directly accessed. Only internal system + roles should normally grant privileges over + the restricted indices. Toggling this flag + is very strongly discouraged because it + could effectively grant unrestricted + operations on critical data, making the + entire system unstable or leaking sensitive + information. If for administrative purposes + you need to create a role with privileges + covering restricted indices, however, you + can set this property to true. In that case, + the names field will cover the restricted + indices too. type: boolean clusters: items: + description: >- + A list of remote cluster aliases. It + supports literal strings as well as + wildcards and regular expressions. type: string minItems: 1 type: array field_security: additionalProperties: items: + description: >- + The document fields that the role + members have read access to. type: string type: array type: object names: items: + description: >- + A list of remote aliases, data streams, or + indices to which the permissions apply. It + supports wildcards (*). type: string minItems: 1 type: array privileges: items: + description: >- + The index level privileges that role + members have for the specified indices. type: string minItems: 1 type: array query: + description: >- + A search query that defines the documents + the role members have read access to. A + document within the specified data streams + and indices must match this query in order + for it to be accessible by the role + members. type: string required: - clusters @@ -41266,6 +41461,9 @@ paths: type: array run_as: items: + description: >- + A user name that the role member can + impersonate. type: string type: array kibana: @@ -41284,14 +41482,23 @@ paths: nullable: true oneOf: - items: + description: >- + A base privilege that grants applies to + all spaces. type: string type: array - items: + description: >- + A base privilege that applies to specific + spaces. type: string type: array feature: additionalProperties: items: + description: >- + The privileges that the role member has for + the feature. type: string type: array type: object @@ -41305,6 +41512,7 @@ paths: minItems: 1 type: array - items: + description: A space that the privilege applies to. type: string type: array default: @@ -41320,7 +41528,9 @@ paths: type: object required: - roles - responses: {} + responses: + '200': + description: Indicates a successful call. summary: Create or update roles tags: - roles diff --git a/oas_docs/overlays/kibana.overlays.yaml b/oas_docs/overlays/kibana.overlays.yaml index 4a21c029ef80a..ed41f56088bf8 100644 --- a/oas_docs/overlays/kibana.overlays.yaml +++ b/oas_docs/overlays/kibana.overlays.yaml @@ -164,4 +164,39 @@ actions: application/json; Elastic-Api-Version=2023-10-31: examples: updateObjectSpacesResponseExample1: - $ref: "../examples/update_saved_objects_spaces_response1.yaml" \ No newline at end of file + $ref: "../examples/update_saved_objects_spaces_response1.yaml" + - target: "$.paths['/api/security/role/{name}']['put']" + description: "Add examples to create role API" + update: + requestBody: + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + createRoleRequest1: + $ref: "../examples/create_role_request1.yaml" + createRoleRequest2: + $ref: "../examples/create_role_request2.yaml" + createRoleRequest3: + $ref: "../examples/create_role_request3.yaml" + createRoleRequest4: + $ref: "../examples/create_role_request4.yaml" + - target: "$.paths['/api/security/role/{name}']['get']" + description: "Add example to get role API" + update: + responses: + 200: + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + getRoleResponse1: + $ref: '../examples/get_role_response1.yaml' + - target: "$.paths['/api/security/role']['get']" + description: "Add example to get roles API" + update: + responses: + 200: + content: + application/json; Elastic-Api-Version=2023-10-31: + examples: + getRolesResponse1: + $ref: '../examples/get_roles_response1.yaml' diff --git a/x-pack/packages/security/plugin_types_server/src/authorization/role_schema.ts b/x-pack/packages/security/plugin_types_server/src/authorization/role_schema.ts index 3d673fa25dc5f..6a10b3a4ee2ad 100644 --- a/x-pack/packages/security/plugin_types_server/src/authorization/role_schema.ts +++ b/x-pack/packages/security/plugin_types_server/src/authorization/role_schema.ts @@ -20,8 +20,16 @@ export const elasticsearchRoleSchema = schema.object({ * An optional list of cluster privileges. These privileges define the cluster level actions that * users with this role are able to execute */ - cluster: schema.maybe(schema.arrayOf(schema.string())), - + cluster: schema.maybe( + schema.arrayOf( + schema.string({ + meta: { + description: + 'Cluster privileges that define the cluster level actions that users can perform.', + }, + }) + ) + ), /** * An optional list of remote cluster privileges. These privileges define the remote cluster level actions that * users with this role are able to execute @@ -29,8 +37,24 @@ export const elasticsearchRoleSchema = schema.object({ remote_cluster: schema.maybe( schema.arrayOf( schema.object({ - privileges: schema.arrayOf(schema.string(), { minSize: 1 }), - clusters: schema.arrayOf(schema.string(), { minSize: 1 }), + privileges: schema.arrayOf( + schema.string({ + meta: { + description: + 'The cluster level privileges for the remote cluster. The allowed values are a subset of the cluster privileges.', + }, + }), + { minSize: 1 } + ), + clusters: schema.arrayOf( + schema.string({ + meta: { + description: + 'A list of remote cluster aliases. It supports literal strings as well as wildcards and regular expressions.', + }, + }), + { minSize: 1 } + ), }) ) ), @@ -45,7 +69,15 @@ export const elasticsearchRoleSchema = schema.object({ * Required list of indices (or index name patterns) to which the permissions in this * entry apply. */ - names: schema.arrayOf(schema.string(), { minSize: 1 }), + names: schema.arrayOf( + schema.string({ + meta: { + description: + 'The data streams, indices, and aliases to which the permissions in this entry apply. It supports wildcards (*).', + }, + }), + { minSize: 1 } + ), /** * An optional set of the document fields that the owners of the role have read access to. @@ -53,7 +85,13 @@ export const elasticsearchRoleSchema = schema.object({ field_security: schema.maybe( schema.recordOf( schema.oneOf([schema.literal('grant'), schema.literal('except')]), - schema.arrayOf(schema.string()) + schema.arrayOf( + schema.string({ + meta: { + description: 'The document fields that the role members have read access to.', + }, + }) + ) ) ), @@ -61,20 +99,42 @@ export const elasticsearchRoleSchema = schema.object({ * Required list of the index level privileges that the owners of the role have on the * specified indices. */ - privileges: schema.arrayOf(schema.string(), { minSize: 1 }), + privileges: schema.arrayOf( + schema.string({ + meta: { + description: + 'The index level privileges that the role members have for the data streams and indices.', + }, + }), + { minSize: 1 } + ), /** * An optional search query that defines the documents the owners of the role have read access * to. A document within the specified indices must match this query in order for it to be * accessible by the owners of the role. */ - query: schema.maybe(schema.string()), + query: schema.maybe( + schema.string({ + meta: { + description: + 'A search query that defines the documents the role members have read access to. A document within the specified data streams and indices must match this query in order for it to be accessible by the role members.', + }, + }) + ), /** * An optional flag used to indicate if index pattern wildcards or regexps should cover * restricted indices. */ - allow_restricted_indices: schema.maybe(schema.boolean()), + allow_restricted_indices: schema.maybe( + schema.boolean({ + meta: { + description: + 'Restricted indices are a special category of indices that are used internally to store configuration data and should not be directly accessed. Only internal system roles should normally grant privileges over the restricted indices. Toggling this flag is very strongly discouraged because it could effectively grant unrestricted operations on critical data, making the entire system unstable or leaking sensitive information. If for administrative purposes you need to create a role with privileges covering restricted indices, however, you can set this property to true. In that case, the names field covers the restricted indices too.', + }, + }) + ), }) ) ), @@ -88,13 +148,29 @@ export const elasticsearchRoleSchema = schema.object({ /** * Required list of remote clusters to which the permissions in this entry apply. */ - clusters: schema.arrayOf(schema.string(), { minSize: 1 }), + clusters: schema.arrayOf( + schema.string({ + meta: { + description: + 'A list of remote cluster aliases. It supports literal strings as well as wildcards and regular expressions.', + }, + }), + { minSize: 1 } + ), /** * Required list of remote indices (or index name patterns) to which the permissions in this * entry apply. */ - names: schema.arrayOf(schema.string(), { minSize: 1 }), + names: schema.arrayOf( + schema.string({ + meta: { + description: + 'A list of remote aliases, data streams, or indices to which the permissions apply. It supports wildcards (*).', + }, + }), + { minSize: 1 } + ), /** * An optional set of the document fields that the owners of the role have read access to. @@ -102,7 +178,13 @@ export const elasticsearchRoleSchema = schema.object({ field_security: schema.maybe( schema.recordOf( schema.oneOf([schema.literal('grant'), schema.literal('except')]), - schema.arrayOf(schema.string()) + schema.arrayOf( + schema.string({ + meta: { + description: 'The document fields that the role members have read access to.', + }, + }) + ) ) ), @@ -110,20 +192,42 @@ export const elasticsearchRoleSchema = schema.object({ * Required list of the index level privileges that the owners of the role have on the * specified indices. */ - privileges: schema.arrayOf(schema.string(), { minSize: 1 }), + privileges: schema.arrayOf( + schema.string({ + meta: { + description: + 'The index level privileges that role members have for the specified indices.', + }, + }), + { minSize: 1 } + ), /** * An optional search query that defines the documents the owners of the role have read access * to. A document within the specified indices must match this query in order for it to be * accessible by the owners of the role. */ - query: schema.maybe(schema.string()), + query: schema.maybe( + schema.string({ + meta: { + description: + 'A search query that defines the documents the role members have read access to. A document within the specified data streams and indices must match this query in order for it to be accessible by the role members. ', + }, + }) + ), /** * An optional flag used to indicate if index pattern wildcards or regexps should cover * restricted indices. */ - allow_restricted_indices: schema.maybe(schema.boolean()), + allow_restricted_indices: schema.maybe( + schema.boolean({ + meta: { + description: + 'Restricted indices are a special category of indices that are used internally to store configuration data and should not be directly accessed. Only internal system roles should normally grant privileges over the restricted indices. Toggling this flag is very strongly discouraged because it could effectively grant unrestricted operations on critical data, making the entire system unstable or leaking sensitive information. If for administrative purposes you need to create a role with privileges covering restricted indices, however, you can set this property to true. In that case, the names field will cover the restricted indices too.', + }, + }) + ), }) ) ), @@ -131,7 +235,13 @@ export const elasticsearchRoleSchema = schema.object({ /** * An optional list of users that the owners of this role can impersonate. */ - run_as: schema.maybe(schema.arrayOf(schema.string())), + run_as: schema.maybe( + schema.arrayOf( + schema.string({ + meta: { description: 'A user name that the role member can impersonate.' }, + }) + ) + ), }); const allSpacesSchema = schema.arrayOf(schema.literal(GLOBAL_RESOURCE), { @@ -147,6 +257,7 @@ const spacesSchema = schema.oneOf( allSpacesSchema, schema.arrayOf( schema.string({ + meta: { description: 'A space that the privilege applies to.' }, validate(value) { if (!/^[a-z0-9_-]+$/.test(value)) { return `must be lower case, a-z, 0-9, '_', and '-' are allowed`; @@ -188,6 +299,7 @@ export const getKibanaRoleSchema = ( allSpacesSchema, schema.arrayOf( schema.string({ + meta: { description: 'A base privilege that grants applies to all spaces.' }, validate(value) { const globalPrivileges = getBasePrivilegeNames().global; if (!globalPrivileges.some((privilege) => privilege === value)) { @@ -198,6 +310,7 @@ export const getKibanaRoleSchema = ( ), schema.arrayOf( schema.string({ + meta: { description: 'A base privilege that applies to specific spaces.' }, validate(value) { const spacePrivileges = getBasePrivilegeNames().space; if (!spacePrivileges.some((privilege) => privilege === value)) { @@ -218,6 +331,7 @@ export const getKibanaRoleSchema = ( feature: schema.maybe( schema.recordOf( schema.string({ + meta: { description: 'The name of a feature.' }, validate(value) { if (!FEATURE_NAME_VALUE_REGEX.test(value)) { return `only a-z, A-Z, 0-9, '_', and '-' are allowed`; @@ -226,6 +340,7 @@ export const getKibanaRoleSchema = ( }), schema.arrayOf( schema.string({ + meta: { description: 'The privileges that the role member has for the feature.' }, validate(value) { if (!FEATURE_NAME_VALUE_REGEX.test(value)) { return `only a-z, A-Z, 0-9, '_', and '-' are allowed`; diff --git a/x-pack/plugins/security/server/routes/authorization/roles/delete.ts b/x-pack/plugins/security/server/routes/authorization/roles/delete.ts index fe7c97b32d27b..07f314da4232b 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/delete.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/delete.ts @@ -29,6 +29,11 @@ export function defineDeleteRolesRoutes({ router }: RouteDefinitionParams) { request: { params: schema.object({ name: schema.string({ minLength: 1 }) }), }, + response: { + 204: { + description: 'Indicates a successful call.', + }, + }, }, }, createLicensedRouteHandler(async (context, request, response) => { diff --git a/x-pack/plugins/security/server/routes/authorization/roles/get.ts b/x-pack/plugins/security/server/routes/authorization/roles/get.ts index 760feb4d94950..031da53092b09 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/get.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/get.ts @@ -34,11 +34,30 @@ export function defineGetRolesRoutes({ version: API_VERSIONS.roles.public.v1, validate: { request: { - params: schema.object({ name: schema.string({ minLength: 1 }) }), + params: schema.object({ + name: schema.string({ + minLength: 1, + meta: { description: 'The role name.' }, + }), + }), query: schema.maybe( - schema.object({ replaceDeprecatedPrivileges: schema.maybe(schema.boolean()) }) + schema.object({ + replaceDeprecatedPrivileges: schema.maybe( + schema.boolean({ + meta: { + description: + 'If `true` and the response contains any privileges that are associated with deprecated features, they are omitted in favor of details about the appropriate replacement feature privileges.', + }, + }) + ), + }) ), }, + response: { + 200: { + description: 'Indicates a successful call.', + }, + }, }, }, createLicensedRouteHandler(async (context, request, response) => { diff --git a/x-pack/plugins/security/server/routes/authorization/roles/get_all.ts b/x-pack/plugins/security/server/routes/authorization/roles/get_all.ts index 81164e0d38c59..5979922cd64e4 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/get_all.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/get_all.ts @@ -36,9 +36,23 @@ export function defineGetAllRolesRoutes({ validate: { request: { query: schema.maybe( - schema.object({ replaceDeprecatedPrivileges: schema.maybe(schema.boolean()) }) + schema.object({ + replaceDeprecatedPrivileges: schema.maybe( + schema.boolean({ + meta: { + description: + 'If `true` and the response contains any privileges that are associated with deprecated features, they are omitted in favor of details about the appropriate replacement feature privileges.', + }, + }) + ), + }) ), }, + response: { + 200: { + description: 'Indicates a successful call.', + }, + }, }, }, createLicensedRouteHandler(async (context, request, response) => { diff --git a/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.ts b/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.ts index 52c8178a651a7..4022098b9fd56 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.ts @@ -53,13 +53,28 @@ export function getPutPayloadSchema( /** * Optional text to describe the Role */ - description: schema.maybe(schema.string({ maxLength: 2048 })), + description: schema.maybe( + schema.string({ + maxLength: 2048, + meta: { description: 'A description for the role.' }, + }) + ), /** * An optional meta-data dictionary. Within the metadata, keys that begin with _ are reserved * for system usage. */ - metadata: schema.maybe(schema.recordOf(schema.string(), schema.any())), + metadata: schema.maybe( + schema.recordOf( + schema.string({ + meta: { + description: + 'A metadata dictionary. Keys that begin with `_` are reserved for system usage.', + }, + }), + schema.any() + ) + ), /** * Elasticsearch specific portion of the role definition. diff --git a/x-pack/plugins/security/server/routes/authorization/roles/post.ts b/x-pack/plugins/security/server/routes/authorization/roles/post.ts index 0fe918ee5cc3e..949553e960c9b 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/post.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/post.ts @@ -62,6 +62,11 @@ export function defineBulkCreateOrUpdateRolesRoutes({ }; }), }, + response: { + 200: { + description: 'Indicates a successful call.', + }, + }, }, }, createLicensedRouteHandler(async (context, request, response) => { diff --git a/x-pack/plugins/security/server/routes/authorization/roles/put.ts b/x-pack/plugins/security/server/routes/authorization/roles/put.ts index 16e2ab819e781..268c84ff7420e 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/put.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/put.ts @@ -26,6 +26,8 @@ export function definePutRolesRoutes({ path: '/api/security/role/{name}', access: 'public', summary: `Create or update a role`, + description: + 'Create a new Kibana role or update the attributes of an existing role. Kibana roles are stored in the Elasticsearch native realm.', options: { tags: ['oas-tag:roles'], }, @@ -35,8 +37,19 @@ export function definePutRolesRoutes({ version: API_VERSIONS.roles.public.v1, validate: { request: { - params: schema.object({ name: schema.string({ minLength: 1, maxLength: 1024 }) }), - query: schema.object({ createOnly: schema.boolean({ defaultValue: false }) }), + params: schema.object({ + name: schema.string({ + minLength: 1, + maxLength: 1024, + meta: { description: 'The role name.' }, + }), + }), + query: schema.object({ + createOnly: schema.boolean({ + defaultValue: false, + meta: { description: 'When true, a role is not overwritten if it already exists.' }, + }), + }), body: getPutPayloadSchema(() => { const privileges = authz.privileges.get(); return { @@ -45,6 +58,11 @@ export function definePutRolesRoutes({ }; }), }, + response: { + 204: { + description: 'Indicates a successful call.', + }, + }, }, }, createLicensedRouteHandler(async (context, request, response) => { From 5bd8ff528c37aa77e099d8ecc224a1f7468412b5 Mon Sep 17 00:00:00 2001 From: Jatin Kathuria Date: Fri, 25 Oct 2024 19:14:49 +0200 Subject: [PATCH 044/135] [Security Solution] Unskips Timeline Cypress tests (#195721) ## Summary Fixes below Flaky tests issues : - [x] https://github.com/elastic/kibana/issues/180688 - [x] https://github.com/elastic/kibana/issues/176945 - [x] https://github.com/elastic/kibana/issues/175180 - [x] https://github.com/elastic/kibana/issues/181466 - [x] https://github.com/elastic/kibana/issues/182021 - [x] https://github.com/elastic/kibana/issues/183085 - [x] https://github.com/elastic/kibana/issues/175180 --------- Co-authored-by: Michael Olorunnisola --- .../alerts/event_rendered_view.cy.ts | 12 ++-- .../investigations/timelines/creation.cy.ts | 37 +---------- .../timelines/data_providers.cy.ts | 26 +++----- .../discover_timeline_state_integration.cy.ts | 13 ++-- .../timelines/esql/esql_state.cy.ts | 38 +++++++---- .../timelines/esql/search_filter.cy.ts | 17 +++-- .../e2e/investigations/timelines/export.cy.ts | 8 ++- .../timelines/flyout_button.cy.ts | 17 +---- .../timelines/row_renderers.cy.ts | 24 +++++-- .../timelines/timelines_table.cy.ts | 5 +- .../cypress/screens/alerts.ts | 8 +++ .../cypress/screens/discover.ts | 8 ++- .../cypress/screens/timeline.ts | 21 ++++-- .../cypress/tasks/discover.ts | 13 +++- .../cypress/tasks/timeline.ts | 65 +++++++++++-------- 15 files changed, 164 insertions(+), 148 deletions(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/event_rendered_view.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/event_rendered_view.cy.ts index e1e7e07a3df15..e028b751c0bf5 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/event_rendered_view.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/event_rendered_view.cy.ts @@ -12,12 +12,12 @@ import { EVENT_SUMMARY_COLUMN, ALERT_RENDERER_HOST_NAME, SHOW_TOP_N_HEADER, + HOVER_ACTIONS, } from '../../../screens/alerts'; import { DATA_GRID_COLUMN_ORDER_BTN, DATA_GRID_FIELD_SORT_BTN, } from '../../../screens/common/data_grid'; -import { HOVER_ACTIONS } from '../../../screens/timeline'; import { showHoverActionsEventRenderedView, switchAlertTableToEventRenderedView, @@ -43,12 +43,12 @@ describe(`Event Rendered View`, { tags: ['@ess', '@serverless'] }, () => { waitForAlerts(); }); - it('Event Summary Column', () => { + it('should show Event Summary column correctly', () => { cy.get(EVENT_SUMMARY_COLUMN).should('be.visible'); cy.get(EVENT_SUMMARY_ALERT_RENDERER_CONTENT).should('be.visible'); }); - it('Hover Action TopN in event summary column', () => { + it('should show TopN in Event Summary column', () => { showHoverActionsEventRenderedView(ALERT_RENDERER_HOST_NAME); cy.get(HOVER_ACTIONS.SHOW_TOP).trigger('click'); cy.get(TOP_N_ALERT_HISTOGRAM).should('be.visible'); @@ -64,15 +64,15 @@ describe(`Event Rendered View`, { tags: ['@ess', '@serverless'] }, () => { * This test main checks if Alert Table controls are rendered properly. * * */ - it('Field Browser is not visible', () => { + it('should not show Field Browser', () => { cy.get(FIELDS_BROWSER_BTN).should('not.exist'); }); - it('Sorting control is not visible', () => { + it('should now show Sorting Control', () => { cy.get(DATA_GRID_FIELD_SORT_BTN).should('not.exist'); }); - it('Column Order button is not visible', () => { + it('should not show column order control', () => { cy.get(DATA_GRID_COLUMN_ORDER_BTN).should('not.exist'); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts index 05957e885d9ea..ffc1fc187142b 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/creation.cy.ts @@ -9,10 +9,8 @@ import { ROLES } from '@kbn/security-solution-plugin/common/test'; import { getTimeline } from '../../../objects/timeline'; import { - LOCKED_ICON, // NOTES_TEXT, - PIN_EVENT, - TIMELINE_FILTER, + TIMELINE_FLYOUT_WRAPPER, TIMELINE_QUERY, TIMELINE_PANEL, @@ -30,7 +28,6 @@ import { visit, visitWithTimeRange } from '../../../tasks/navigation'; import { openTimelineUsingToggle } from '../../../tasks/security_main'; import { selectCustomTemplates } from '../../../tasks/templates'; import { - addFilter, addNameAndDescriptionToTimeline, // addNotesToTimeline, clickingOnCreateTimelineFormTemplateBtn, @@ -38,9 +35,6 @@ import { createNewTimeline, executeTimelineKQL, expandEventAction, - goToQueryTab, - pinFirstEvent, - populateTimeline, addNameToTimelineAndSave, addNameToTimelineAndSaveAsNew, } from '../../../tasks/timeline'; @@ -50,8 +44,7 @@ import { OVERVIEW_URL, TIMELINE_TEMPLATES_URL, TIMELINES_URL } from '../../../ur const mockTimeline = getTimeline(); -// FLAKY: https://github.com/elastic/kibana/issues/180688 -describe.skip('Timelines', { tags: ['@ess', '@serverless'] }, (): void => { +describe('Timelines', { tags: ['@ess', '@serverless'] }, (): void => { beforeEach(() => { deleteTimelines(); }); @@ -92,32 +85,6 @@ describe.skip('Timelines', { tags: ['@ess', '@serverless'] }, (): void => { ); }); - it('should create a timeline by clicking untitled timeline from bottom bar', () => { - login(); - visitWithTimeRange(OVERVIEW_URL); - openTimelineUsingToggle(); - addNameAndDescriptionToTimeline(mockTimeline); - populateTimeline(); - goToQueryTab(); - - addFilter(mockTimeline.filter); - cy.get(TIMELINE_FILTER(mockTimeline.filter)).should('exist'); - - pinFirstEvent(); - cy.get(PIN_EVENT) - .should('have.attr', 'aria-label') - .and('match', /Unpin the event in row 2/); - - cy.get(LOCKED_ICON).should('be.visible'); - - // TODO: fix this - // While typing the note, cypress encounters this -> Error: ResizeObserver loop completed with undelivered notifications. - // addNotesToTimeline(mockTimeline.notes); - // cy.get(TIMELINE_TAB_CONTENT_GRAPHS_NOTES) - // .find(NOTES_TEXT) - // .should('have.text', mockTimeline.notes); - }); - it('should show the different timeline states', () => { login(); visitWithTimeRange(TIMELINES_URL); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/data_providers.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/data_providers.cy.ts index 609dd0081f87e..c6ec496744a52 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/data_providers.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/data_providers.cy.ts @@ -9,8 +9,8 @@ import { TIMELINE_DROPPED_DATA_PROVIDERS, TIMELINE_DATA_PROVIDERS_ACTION_MENU, TIMELINE_FLYOUT_HEADER, - GET_TIMELINE_GRID_CELL, TIMELINE_DATA_PROVIDERS_CONTAINER, + GET_TIMELINE_GRID_CELL_VALUE, } from '../../../screens/timeline'; import { waitForAllHostsToBeLoaded } from '../../../tasks/hosts/all_hosts'; @@ -19,7 +19,6 @@ import { login } from '../../../tasks/login'; import { visitWithTimeRange } from '../../../tasks/navigation'; import { addDataProvider, - updateDataProviderbyDraggingField, addNameAndDescriptionToTimeline, populateTimeline, createTimelineFromBottomBar, @@ -28,12 +27,13 @@ import { } from '../../../tasks/timeline'; import { getTimeline } from '../../../objects/timeline'; import { hostsUrl } from '../../../urls/navigation'; +import { LOADING_INDICATOR } from '../../../screens/security_header'; -// FLAKY: https://github.com/elastic/kibana/issues/176945 const mockTimeline = getTimeline(); -describe.skip('Timeline data providers', { tags: ['@ess', '@serverless'] }, () => { +describe('Timeline data providers', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); + cy.intercept('PATCH', '/api/timeline').as('updateTimeline'); visitWithTimeRange(hostsUrl('allHosts')); waitForAllHostsToBeLoaded(); createTimelineFromBottomBar(); @@ -53,28 +53,20 @@ describe.skip('Timeline data providers', { tags: ['@ess', '@serverless'] }, () = cy.get(TIMELINE_DATA_PROVIDERS_ACTION_MENU).should('exist'); }); - it('should persist timeline when data provider is updated by dragging a field from data grid', () => { - updateDataProviderbyDraggingField('host.name', 0); - saveTimeline(); - cy.reload(); - cy.get(`${GET_TIMELINE_GRID_CELL('host.name')}`) - .first() - .then((hostname) => { - cy.get(TIMELINE_DATA_PROVIDERS_CONTAINER).contains(`host.name: "${hostname.text()}"`); - }); - }); - it('should persist timeline when a field is added by hover action "Add To Timeline" in data provider ', () => { addDataProvider({ field: 'host.name', operator: 'exists' }); saveTimeline(); + cy.wait('@updateTimeline'); + cy.get(LOADING_INDICATOR).should('not.exist'); updateDataProviderByFieldHoverAction('host.name', 0); saveTimeline(); + cy.wait('@updateTimeline'); cy.reload(); - cy.get(`${GET_TIMELINE_GRID_CELL('host.name')}`) + cy.get(`${GET_TIMELINE_GRID_CELL_VALUE('host.name')}`) .first() .then((hostname) => { cy.get(TIMELINE_DATA_PROVIDERS_CONTAINER).should((dataProviderContainer) => { - expect(dataProviderContainer).to.contain(`host.name: "${hostname.text()}"`); + expect(dataProviderContainer).to.contain(`host.name: "${hostname.text().trim()}"`); }); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/discover_timeline_state_integration.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/discover_timeline_state_integration.cy.ts index 8e45d23d35433..c15f42e0e218e 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/discover_timeline_state_integration.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/discover_timeline_state_integration.cy.ts @@ -18,6 +18,7 @@ import { import { addDiscoverEsqlQuery, addFieldToTable, + assertFieldsAreLoaded, verifyDiscoverEsqlQuery, } from '../../../../tasks/discover'; import { @@ -69,8 +70,7 @@ const handleIntercepts = () => { }); }; -// Failing: See https://github.com/elastic/kibana/issues/180755 -describe.skip( +describe( 'Discover Timeline State Integration', { tags: ['@ess', '@skipInServerless'], @@ -81,6 +81,7 @@ describe.skip( visitWithTimeRange(ALERTS_URL); createTimelineFromBottomBar(); goToEsqlTab(); + addDiscoverEsqlQuery(esqlQuery); updateDateRangeInLocalDatePickers(DISCOVER_CONTAINER, INITIAL_START_DATE, INITIAL_END_DATE); handleIntercepts(); }); @@ -90,17 +91,14 @@ describe.skip( addNameToTimelineAndSave('Timerange timeline'); createNewTimeline(); goToEsqlTab(); - cy.get(GET_LOCAL_SHOW_DATES_BUTTON(DISCOVER_CONTAINER)).should( - 'contain.text', - `Last 15 minutes` - ); + cy.get(GET_LOCAL_SHOW_DATES_BUTTON(DISCOVER_CONTAINER)).should('be.disabled'); // default state }); it('should save/restore esql tab dataview/timerange/filter/query/columns when saving/resoring timeline', () => { const timelineSuffix = Date.now(); const timelineName = `DataView timeline-${timelineSuffix}`; const column1 = 'event.category'; const column2 = 'ecs.version'; - addDiscoverEsqlQuery(esqlQuery); + assertFieldsAreLoaded(); addFieldToTable(column1); addFieldToTable(column2); @@ -132,6 +130,7 @@ describe.skip( const column1 = 'event.category'; const column2 = 'ecs.version'; addDiscoverEsqlQuery(esqlQuery); + assertFieldsAreLoaded(); addFieldToTable(column1); addFieldToTable(column2); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/esql_state.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/esql_state.cy.ts index b8db1dacd03e1..0676d3d5dbfb8 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/esql_state.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/esql_state.cy.ts @@ -25,7 +25,7 @@ import { goToEsqlTab, openActiveTimeline, addNameAndDescriptionToTimeline, - saveTimeline, + addNameToTimelineAndSave, } from '../../../../tasks/timeline'; import { ALERTS_URL } from '../../../../urls/navigation'; import { getTimeline } from '../../../../objects/timeline'; @@ -35,7 +35,25 @@ const INITIAL_START_DATE = 'Jan 18, 2021 @ 20:33:29.186'; const INITIAL_END_DATE = 'Jan 19, 2024 @ 20:33:29.186'; const mockTimeline = getTimeline(); -// FAILURE introduced by the fix for 8.11.4 related to the default empty string and fix for the infinite loop on the esql tab +const esqlQuery = 'from auditbeat-* | limit 5'; + +const TIMELINE_REQ_WITH_SAVED_SEARCH = 'TIMELINE_REQ_WITH_SAVED_SEARCH'; +const TIMELINE_PATCH_REQ = 'TIMELINE_PATCH_REQ'; + +const handleIntercepts = () => { + cy.intercept('PATCH', '/api/timeline', (req) => { + if (Object.hasOwn(req.body, 'timeline') && req.body.timeline.savedSearchId === null) { + req.alias = TIMELINE_PATCH_REQ; + } + }); + cy.intercept('PATCH', '/api/timeline', (req) => { + if (Object.hasOwn(req.body, 'timeline') && req.body.timeline.savedSearchId !== null) { + req.alias = TIMELINE_REQ_WITH_SAVED_SEARCH; + } + }); +}; + +// Flaky: https://github.com/elastic/kibana/issues/180755 describe.skip( 'Timeline Discover ESQL State', { @@ -50,33 +68,29 @@ describe.skip( win.onbeforeunload = null; }); goToEsqlTab(); + addDiscoverEsqlQuery(esqlQuery); updateDateRangeInLocalDatePickers(DISCOVER_CONTAINER, INITIAL_START_DATE, INITIAL_END_DATE); + handleIntercepts(); }); it('should not allow the dataview to be changed', () => { cy.get(DISCOVER_DATA_VIEW_SWITCHER.BTN).should('not.exist'); }); - it('should remember esql query when navigating away and back to discover ', () => { - const esqlQuery = 'from auditbeat-* | limit 5'; - addDiscoverEsqlQuery(esqlQuery); + it.skip('should remember esql query when navigating away and back to discover ', () => { submitDiscoverSearchBar(); - addNameAndDescriptionToTimeline(mockTimeline); - saveTimeline(); + addNameToTimelineAndSave(mockTimeline.title); + cy.wait(`@${TIMELINE_REQ_WITH_SAVED_SEARCH}`); closeTimeline(); navigateFromHeaderTo(CSP_FINDINGS); navigateFromHeaderTo(ALERTS); openActiveTimeline(); goToEsqlTab(); - verifyDiscoverEsqlQuery(esqlQuery); }); it('should remember columns when navigating away and back to discover ', () => { - const esqlQuery = 'from auditbeat-* | limit 5'; - addDiscoverEsqlQuery(esqlQuery); submitDiscoverSearchBar(); - addNameAndDescriptionToTimeline(mockTimeline); addFieldToTable('host.name'); addFieldToTable('user.name'); - saveTimeline(); + addNameAndDescriptionToTimeline(mockTimeline); closeTimeline(); navigateFromHeaderTo(CSP_FINDINGS); navigateFromHeaderTo(ALERTS); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/search_filter.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/search_filter.cy.ts index 0009351852176..889f75130d197 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/search_filter.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/esql/search_filter.cy.ts @@ -25,6 +25,7 @@ import { addDiscoverEsqlQuery, addFieldToTable, convertEditorNonBreakingSpaceToSpace, + waitForDiscoverFieldsToLoad, } from '../../../../tasks/discover'; import { login } from '../../../../tasks/login'; import { visitWithTimeRange } from '../../../../tasks/navigation'; @@ -38,8 +39,7 @@ const INITIAL_END_DATE = 'Jan 19, 2024 @ 20:33:29.186'; const NEW_START_DATE = 'Jan 18, 2023 @ 20:33:29.186'; const esqlQuery = 'from auditbeat-* | where ecs.version == "8.0.0"'; -// FLAKY: https://github.com/elastic/kibana/issues/175180 -describe.skip( +describe( 'Basic esql search and filter operations', { tags: ['@ess'], @@ -58,16 +58,19 @@ describe.skip( }); it('should show data according to the esql query', () => { - updateDateRangeInLocalDatePickers(DISCOVER_CONTAINER, INITIAL_START_DATE, INITIAL_END_DATE); addDiscoverEsqlQuery(`${esqlQuery} | limit 1`); + updateDateRangeInLocalDatePickers(DISCOVER_CONTAINER, INITIAL_START_DATE, INITIAL_END_DATE); cy.get(DISCOVER_RESULT_HITS).should('have.text', 1); }); it('should be able to add fields to the table', () => { - updateDateRangeInLocalDatePickers(DISCOVER_CONTAINER, INITIAL_START_DATE, INITIAL_END_DATE); addDiscoverEsqlQuery(`${esqlQuery} | limit 1`); - addFieldToTable('host.name'); - addFieldToTable('user.name'); + updateDateRangeInLocalDatePickers(DISCOVER_CONTAINER, INITIAL_START_DATE, INITIAL_END_DATE); + waitForDiscoverFieldsToLoad(); + cy.get(DISCOVER_CONTAINER).within(() => { + addFieldToTable('host.name'); + addFieldToTable('user.name'); + }); cy.get(GET_DISCOVER_DATA_GRID_CELL_HEADER('host.name')).should('be.visible'); cy.get(GET_DISCOVER_DATA_GRID_CELL_HEADER('user.name')).should('be.visible'); }); @@ -88,6 +91,8 @@ describe.skip( }); it(`should change the timerange to ${DEFAULT_DATE} when back is pressed after modifying timerange to ${NEW_START_DATE} without saving`, () => { + // The datepicker is only active when a query exists. + addDiscoverEsqlQuery(esqlQuery); cy.get(GET_LOCAL_SHOW_DATES_BUTTON(DISCOVER_CONTAINER)).click(); cy.get(GET_LOCAL_DATE_PICKER_START_DATE_POPOVER_BUTTON(DISCOVER_CONTAINER)).first().click({}); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts index c28f0ed90d8c5..e1e3a5cf2de32 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/export.cy.ts @@ -22,8 +22,7 @@ import { createTimeline } from '../../../tasks/api_calls/timelines'; import { expectedExportedTimeline } from '../../../objects/timeline'; import { closeToast } from '../../../tasks/common/toast'; -// FLAKY: https://github.com/elastic/kibana/issues/187550 -describe.skip('Export timelines', { tags: ['@ess', '@serverless'] }, () => { +describe('Export timelines', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); deleteTimelines(); @@ -42,6 +41,10 @@ describe.skip('Export timelines', { tags: ['@ess', '@serverless'] }, () => { visit(TIMELINES_URL); }); + /** + * TODO: Good candidate for converting to a jest Test + * https://github.com/elastic/kibana/issues/195612 + */ it('should export custom timeline(s)', function () { cy.log('Export a custom timeline via timeline actions'); @@ -60,6 +63,7 @@ describe.skip('Export timelines', { tags: ['@ess', '@serverless'] }, () => { cy.wrap(response?.statusCode).should('eql', 200); cy.wrap(response?.body).should('eql', expectedExportedTimeline(this.timelineResponse1)); }); + closeToast(); cy.log('Export all custom timelines via bulk actions'); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/flyout_button.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/flyout_button.cy.ts index 4ee0f4c58f151..fc2efa8534d47 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/flyout_button.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/flyout_button.cy.ts @@ -18,8 +18,7 @@ import { import { hostsUrl } from '../../../urls/navigation'; -// FLAKY: https://github.com/elastic/kibana/issues/183085 -describe.skip('timeline flyout button', () => { +describe('timeline flyout button', () => { beforeEach(() => { login(); visitWithTimeRange(hostsUrl('allHosts')); @@ -64,18 +63,4 @@ describe.skip('timeline flyout button', () => { cy.get(TIMELINE_BOTTOM_BAR_TOGGLE_BUTTON).should('have.focus'); } ); - - it( - 'should render the global search dropdown when the input is focused', - { tags: ['@ess'] }, - () => { - openTimelineUsingToggle(); - cy.get('[data-test-subj="nav-search-input"]').focus(); - cy.get('[data-test-subj="nav-search-input"]').should('be.focused'); - cy.get('[data-test-subj="nav-search-option"]').should('be.visible'); - cy.get('[data-test-subj="nav-search-option"]').first().realHover(); - // check that at least one item is visible in the search bar after mousing over, i.e. it's still usable. - cy.get('[data-test-subj="nav-search-option"]').its('length').should('be.gte', 1); - } - ); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts index b27ea9fcc6a81..ebc3591adfe15 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts @@ -23,12 +23,16 @@ import { waitForAllHostsToBeLoaded } from '../../../tasks/hosts/all_hosts'; import { login } from '../../../tasks/login'; import { visitWithTimeRange } from '../../../tasks/navigation'; import { openTimelineUsingToggle } from '../../../tasks/security_main'; -import { addNameToTimelineAndSave, populateTimeline, saveTimeline } from '../../../tasks/timeline'; +import { + addNameToTimelineAndSave, + enableAllRowRenderersWithSwitch, + populateTimeline, + saveTimeline, +} from '../../../tasks/timeline'; import { hostsUrl } from '../../../urls/navigation'; -// FLAKY: https://github.com/elastic/kibana/issues/182021 -describe.skip('Row renderers', { tags: ['@ess', '@serverless'] }, () => { +describe('Row renderers', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { deleteTimelines(); login(); @@ -42,16 +46,19 @@ describe.skip('Row renderers', { tags: ['@ess', '@serverless'] }, () => { }); openTimelineUsingToggle(); populateTimeline(); - cy.get(TIMELINE_SHOW_ROW_RENDERERS_GEAR).should('exist'); - cy.get(TIMELINE_SHOW_ROW_RENDERERS_GEAR).first().click({ force: true }); }); - it('Row renderers should be enabled by default', () => { + it('Row renderers should be disabled by default', () => { + cy.get(TIMELINE_SHOW_ROW_RENDERERS_GEAR).should('exist'); + cy.get(TIMELINE_SHOW_ROW_RENDERERS_GEAR).first().click(); cy.get(TIMELINE_ROW_RENDERERS_MODAL_ITEMS_CHECKBOX).should('exist'); - cy.get(TIMELINE_ROW_RENDERERS_MODAL_ITEMS_CHECKBOX).should('be.checked'); + cy.get(TIMELINE_ROW_RENDERERS_MODAL_ITEMS_CHECKBOX).should('not.be.checked'); }); it('Selected renderer can be disabled and enabled', () => { + enableAllRowRenderersWithSwitch(); + cy.get(TIMELINE_SHOW_ROW_RENDERERS_GEAR).should('exist'); + cy.get(TIMELINE_SHOW_ROW_RENDERERS_GEAR).first().click(); cy.get(TIMELINE_ROW_RENDERERS_SEARCHBOX).should('exist'); cy.get(TIMELINE_ROW_RENDERERS_SEARCHBOX).type('flow'); @@ -95,6 +102,9 @@ describe.skip('Row renderers', { tags: ['@ess', '@serverless'] }, () => { it('Selected renderer can be disabled with one click', () => { // Ensure these elements are visible before continuing since sometimes it takes a second for the modal to show up // and it gives the click handlers a bit of time to be initialized as well to reduce chances of flake + enableAllRowRenderersWithSwitch(); + cy.get(TIMELINE_SHOW_ROW_RENDERERS_GEAR).should('exist'); + cy.get(TIMELINE_SHOW_ROW_RENDERERS_GEAR).first().click(); cy.get(TIMELINE_ROW_RENDERERS_DISABLE_ALL_BTN).should('exist'); cy.get(TIMELINE_ROW_RENDERERS_MODAL_ITEMS_CHECKBOX).should('be.checked'); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/timelines_table.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/timelines_table.cy.ts index 6c1e7ee3f6cf4..4b8d55065d44e 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/timelines_table.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/timelines_table.cy.ts @@ -26,11 +26,10 @@ import { clearSearchBar, searchForTimeline, toggleFavoriteFilter } from '../../. const mockTimeline = getTimeline(); const mockFavoritedTimeline = getFavoritedTimeline(); -// FLAKY: https://github.com/elastic/kibana/issues/181466 -// Failing: See https://github.com/elastic/kibana/issues/181466 -describe.skip('timeline overview search', { tags: ['@ess', '@serverless'] }, () => { +describe('timeline overview search', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { deleteTimelines(); + // create timeline which is not favorited createTimeline(); login(); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts b/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts index 35c46e9f97557..75ee0d10c53ef 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/alerts.ts @@ -256,3 +256,11 @@ export const ALERT_DETAILS_TAKE_ACTION_BUTTON = export const USER_COLUMN = '[data-gridcell-column-id="user.name"]'; export const TOOLTIP = '[data-test-subj="message-tool-tip"]'; + +export const HOVER_ACTIONS = { + ADD_TO_TIMELINE: '[data-test-subj="actionItem-security-default-cellActions-addToTimeline"]', + FILTER_FOR: '[data-test-subj="actionItem-security-default-cellActions-filterIn"]', + FILTER_OUT: '[data-test-subj="actionItem-security-default-cellActions-filterOut"]', + COPY: '[data-test-subj="actionItem-security-default-cellActions-copyToClipboard"]', + SHOW_TOP: '[data-test-subj="actionItem-security-default-cellActions-showTopN"]', +}; diff --git a/x-pack/test/security_solution_cypress/cypress/screens/discover.ts b/x-pack/test/security_solution_cypress/cypress/screens/discover.ts index 114cb9a4db0c4..e699eb48d5f9d 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/discover.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/discover.ts @@ -79,6 +79,12 @@ export const GET_DISCOVER_COLUMN = (columnId: string) => export const GET_DISCOVER_COLUMN_TOGGLE_BTN = (columnId: string) => `${getDataTestSubjectSelector(`fieldToggle-${columnId}`)}`; -export const DISCOVER_FIELD_SEARCH = getDataTestSubjectSelector('fieldListFiltersFieldSearch'); +export const DISCOVER_FIELD_SEARCH = `${getDataTestSubjectSelector( + 'fieldList' +)} ${getDataTestSubjectSelector('fieldListFiltersFieldSearch')}`; export const DISCOVER_FIELD_LIST_LOADING = getDataTestSubjectSelector('fieldListLoading'); + +export const AVAILABLE_FIELD_COUNT = getDataTestSubjectSelector( + 'fieldListGroupedAvailableFields-count' +); diff --git a/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts b/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts index 3398345bcd1fd..a4aac97091af2 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/timeline.ts @@ -260,6 +260,9 @@ export const TIMELINE_ROW_RENDERERS_SURICATA_SIGNATURE_TOOLTIP = `[data-test-sub export const TIMELINE_SHOW_ROW_RENDERERS_GEAR = '[data-test-subj="show-row-renderers-gear"]'; +export const TIMELINE_ENABLE_DISABLE_ALL_ROW_RENDERER = + getDataTestSubjectSelector('row-renderer-switch'); + export const TIMELINE_TABS = '[data-test-subj="timeline"] .euiTabs'; export const TIMELINE_TAB_CONTENT_EQL = '[data-test-subj="timeline-tab-content-eql"]'; @@ -280,8 +283,13 @@ export const ALERT_TABLE_FILE_NAME_VALUES = `${ALERT_TABLE_FILE_NAME_HEADER}[dat export const ACTIVE_TIMELINE_BOTTOM_BAR = '[data-test-subj="timeline-bottom-bar-title-button"]'; +// timeline table grid cell export const GET_TIMELINE_GRID_CELL = (fieldName: string) => - `[data-test-subj="draggable-content-${fieldName}"]`; + `[data-test-subj="dataGridRowCell"][data-gridcell-column-id="${fieldName}"]`; + +// actual content within timeline table grid cell without screenreader text +export const GET_TIMELINE_GRID_CELL_VALUE = (fieldName: string) => + `[data-test-subj="dataGridRowCell"][data-gridcell-column-id="${fieldName}"] .unifiedDataTable__cellValue`; export const EMPTY_DROPPABLE_DATA_PROVIDER_GROUP = `.empty-providers-group`; @@ -292,11 +300,12 @@ export const TIMELINE_VIEW_IN_ANALYZER = '[data-test-subj="view-in-analyzer"]'; export const EMPTY_DATA_PROVIDER_AREA = `.timeline-drop-area-empty`; export const HOVER_ACTIONS = { - ADD_TO_TIMELINE: '[data-test-subj="actionItem-security-default-cellActions-addToTimeline"]', - FILTER_FOR: '[data-test-subj="actionItem-security-default-cellActions-filterIn"]', - FILTER_OUT: '[data-test-subj="actionItem-security-default-cellActions-filterOut"]', - COPY: '[data-test-subj="actionItem-security-default-cellActions-copyToClipboard"]', - SHOW_TOP: '[data-test-subj="actionItem-security-default-cellActions-showTopN"]', + ADD_TO_TIMELINE: + '[data-test-subj="dataGridColumnCellAction-security-default-cellActions-addToTimeline"]', + FILTER_FOR: '[data-test-subj="dataGridColumnCellAction-security-default-cellActions-filterIn"]', + FILTER_OUT: '[data-test-subj="dataGridColumnCellAction-security-default-cellActions-filterOut"]', + COPY: '[data-test-subj="dataGridColumnCellAction-security-default-cellActions-copyToClipboard"]', + SHOW_TOP: '[data-test-subj="dataGridColumnCellAction-security-default-cellActions-showTopN"]', }; export const TIMELINE_FILTER_BADGE_ENABLED = '[data-test-subj~="filter-enabled"]'; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/discover.ts b/x-pack/test/security_solution_cypress/cypress/tasks/discover.ts index 1034922383a40..583f42aaaf2e3 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/discover.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/discover.ts @@ -15,6 +15,7 @@ import { DISCOVER_DATA_VIEW_EDITOR_FLYOUT, DISCOVER_FIELD_LIST_LOADING, DISCOVER_ESQL_EDITABLE_INPUT, + AVAILABLE_FIELD_COUNT, } from '../screens/discover'; import { GET_LOCAL_SEARCH_BAR_SUBMIT_BUTTON } from '../screens/search_bar'; import { goToEsqlTab } from './timeline'; @@ -43,6 +44,14 @@ export const waitForDiscoverGridToLoad = () => { cy.get(DISCOVER_FIELD_LIST_LOADING).should('not.exist'); }; +export const waitForDiscoverFieldsToLoad = () => { + cy.get(AVAILABLE_FIELD_COUNT).should('be.visible'); +}; + +export const assertFieldsAreLoaded = () => { + cy.get(DISCOVER_FIELD_LIST_LOADING).should('not.exist'); +}; + export const fillEsqlQueryBar = (query: string) => { // eslint-disable-next-line cypress/no-force cy.get(DISCOVER_ESQL_EDITABLE_INPUT).type(query, { force: true }); @@ -94,11 +103,11 @@ export const openAddDiscoverFilterPopover = () => { }; export const searchForField = (fieldId: string) => { - cy.get(DISCOVER_FIELD_SEARCH).type(fieldId); + cy.get(DISCOVER_FIELD_SEARCH).should('be.visible').type(fieldId); }; export const clearFieldSearch = () => { - cy.get(DISCOVER_FIELD_SEARCH).clear(); + cy.get(DISCOVER_FIELD_SEARCH).first().clear(); }; export const addFieldToTable = (fieldId: string) => { diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts b/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts index 7d66243071d9d..5866011ec1cbf 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/timeline.ts @@ -65,8 +65,6 @@ import { TIMELINE_TAB_CONTENT_EQL, TIMESTAMP_HOVER_ACTION_OVERFLOW_BTN, ACTIVE_TIMELINE_BOTTOM_BAR, - EMPTY_DATA_PROVIDER_AREA, - EMPTY_DROPPABLE_DATA_PROVIDER_GROUP, GET_TIMELINE_GRID_CELL, HOVER_ACTIONS, TIMELINE_SWITCHQUERYLANGUAGE_BUTTON, @@ -91,14 +89,17 @@ import { TIMELINE_FLYOUT, TIMELINE_FULL_SCREEN_BUTTON, QUERY_EVENT_COUNT, + TIMELINE_ENABLE_DISABLE_ALL_ROW_RENDERER, TIMELINE_DISCOVER_FIELDS_BUTTON, } from '../screens/timeline'; import { REFRESH_BUTTON, TIMELINE, TIMELINES_TAB_TEMPLATE } from '../screens/timelines'; -import { drag, drop, waitForTabToBeLoaded } from './common'; +import { waitForTabToBeLoaded } from './common'; import { closeFieldsBrowser, filterFieldsBrowser } from './fields_browser'; import { TIMELINE_CONTEXT_MENU_BTN } from '../screens/alerts'; +import { LOADING_INDICATOR } from '../screens/security_header'; +import { TOASTER } from '../screens/alerts_detection_rules'; import { RUNTIME_FIELD_INPUT, SAVE_FIELD_BUTTON } from '../screens/create_runtime_field'; const hostExistsQuery = 'host.name: *'; @@ -123,6 +124,17 @@ export const addNameToTimelineAndSaveAsNew = (name: string) => { cy.get(TIMELINE_TITLE_INPUT).should('not.exist'); }; +export const openSaveTimelineModal = () => { + recurse( + () => { + cy.get(SAVE_TIMELINE_ACTION); + + return cy.get(TIMELINE_TITLE_INPUT); + }, + (sub) => sub.is(':visible') + ); +}; + export const addNameAndDescriptionToTimeline = ( timeline: Timeline, modalAlreadyOpen: boolean = false @@ -241,38 +253,17 @@ export const addDataProvider = (filter: TimelineFilter): Cypress.Chainable { - const dragTargetSelector = GET_TIMELINE_GRID_CELL(fieldName); - cy.get(dragTargetSelector) - .eq(rowNumber) - .then((currentSubject) => { - drag(currentSubject); - }); - let dropTarget: Cypress.Chainable>; - - cy.get('body').then((body) => { - if (body.find(EMPTY_DATA_PROVIDER_AREA).length > 0) { - dropTarget = cy.get(EMPTY_DATA_PROVIDER_AREA); - } else { - dropTarget = cy.get(EMPTY_DROPPABLE_DATA_PROVIDER_GROUP); - } - - dropTarget.then((currentEl) => { - drop(currentEl); - }); - }); -}; - export const updateDataProviderByFieldHoverAction = (fieldName: string, rowNumber: number) => { const fieldSelector = GET_TIMELINE_GRID_CELL(fieldName); - cy.get(fieldSelector).eq(rowNumber).trigger('mouseover'); + cy.get(fieldSelector).eq(rowNumber).should('be.visible').realHover(); cy.get(HOVER_ACTIONS.ADD_TO_TIMELINE).should('be.visible'); + recurse( () => { cy.get(HOVER_ACTIONS.ADD_TO_TIMELINE).click(); return cy.root(); }, - ($el) => $el.find(HOVER_ACTIONS.ADD_TO_TIMELINE).length === 0 + ($el) => $el.find(TOASTER).text().startsWith('Added ') ); }; @@ -314,7 +305,13 @@ export const createNewTimeline = () => { }; export const openCreateTimelineOptionsPopover = () => { - cy.get(NEW_TIMELINE_ACTION).filter(':visible').click(); + recurse( + () => { + cy.get(NEW_TIMELINE_ACTION).filter(':visible').click(); + return cy.get(CREATE_NEW_TIMELINE); + }, + (sub) => sub.is(':visible') + ); }; export const createTimelineFromBottomBar = () => { @@ -370,6 +367,8 @@ export const saveTimeline = () => { cy.get(TIMELINE_PROGRESS_BAR).should('exist'); cy.get(TIMELINE_PROGRESS_BAR).should('not.exist'); + + cy.get(LOADING_INDICATOR).should('not.exist'); }); }; @@ -546,3 +545,13 @@ export const openTimelineEventContextMenu = (rowIndex: number = 0) => { export const toggleFullScreen = () => { cy.get(TIMELINE_FULL_SCREEN_BUTTON).first().click(); }; + +export const enableAllRowRenderersWithSwitch = () => { + cy.get(TIMELINE_ENABLE_DISABLE_ALL_ROW_RENDERER).click(); + cy.get(TIMELINE_ENABLE_DISABLE_ALL_ROW_RENDERER).should('have.attr', 'aria-checked', 'true'); +}; + +export const disableAllRowRenderersWithSwitch = () => { + cy.get(TIMELINE_ENABLE_DISABLE_ALL_ROW_RENDERER).click(); + cy.get(TIMELINE_ENABLE_DISABLE_ALL_ROW_RENDERER).should('have.attr', 'aria-checked', 'false'); +}; From 8b02c0d2ef605e5829bb8fecbf9b17a1f0f135aa Mon Sep 17 00:00:00 2001 From: Jon Date: Fri, 25 Oct 2024 12:25:02 -0500 Subject: [PATCH 045/135] [ci] Use es snapshot cache on miscellaneous steps, adjust schedule (#197294) The schedule adjustment is due to 7.17 verification taking longer than other branches. Currently, we only rebuild once when main is updated. This is a stopgap until a cache-only update can be introduced to avoid continuous image rebuilds. --- .../pipeline-resource-definitions/kibana-es-snapshots.yml | 2 +- .buildkite/scripts/steps/checks/capture_oas_snapshot.sh | 5 +++-- .buildkite/scripts/steps/functional/apm_cypress.sh | 1 + .buildkite/scripts/steps/functional/inventory_cypress.sh | 1 + .../steps/functional/observability_onboarding_cypress.sh | 1 + .buildkite/scripts/steps/functional/profiling_cypress.sh | 1 + .buildkite/scripts/steps/functional/synthetics.sh | 1 + 7 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.buildkite/pipeline-resource-definitions/kibana-es-snapshots.yml b/.buildkite/pipeline-resource-definitions/kibana-es-snapshots.yml index 5a2521bb23026..b99fd82408b76 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-es-snapshots.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-es-snapshots.yml @@ -62,7 +62,7 @@ spec: message: Daily build branch: '8.15' Daily build (7.17): - cronline: 0 22 * * * America/New_York + cronline: 0 20 * * * America/New_York message: Daily build branch: '7.17' tags: diff --git a/.buildkite/scripts/steps/checks/capture_oas_snapshot.sh b/.buildkite/scripts/steps/checks/capture_oas_snapshot.sh index 0c0f7ac996bba..e9f42d67008ea 100755 --- a/.buildkite/scripts/steps/checks/capture_oas_snapshot.sh +++ b/.buildkite/scripts/steps/checks/capture_oas_snapshot.sh @@ -2,10 +2,11 @@ set -euo pipefail -.buildkite/scripts/bootstrap.sh - source .buildkite/scripts/common/util.sh +.buildkite/scripts/bootstrap.sh +.buildkite/scripts/copy_es_snapshot_cache.sh + echo --- Capture OAS snapshot cmd="node scripts/capture_oas_snapshot --include-path /api/status --include-path /api/alerting/rule/ --include-path /api/alerting/rules --include-path /api/actions --include-path /api/security/role --include-path /api/spaces --include-path /api/fleet" if is_pr && ! is_auto_commit_disabled; then diff --git a/.buildkite/scripts/steps/functional/apm_cypress.sh b/.buildkite/scripts/steps/functional/apm_cypress.sh index 976c551dfe19a..1fc10089e8eb4 100755 --- a/.buildkite/scripts/steps/functional/apm_cypress.sh +++ b/.buildkite/scripts/steps/functional/apm_cypress.sh @@ -8,6 +8,7 @@ APM_CYPRESS_RECORD_KEY="$(vault_get apm-cypress-dashboard-record-key CYPRESS_REC .buildkite/scripts/bootstrap.sh .buildkite/scripts/download_build_artifacts.sh +.buildkite/scripts/copy_es_snapshot_cache.sh export JOB=kibana-apm-cypress IS_FLAKY_TEST_RUNNER=${CLI_COUNT:-0} diff --git a/.buildkite/scripts/steps/functional/inventory_cypress.sh b/.buildkite/scripts/steps/functional/inventory_cypress.sh index b238b62c9c1fe..b45215ca86505 100644 --- a/.buildkite/scripts/steps/functional/inventory_cypress.sh +++ b/.buildkite/scripts/steps/functional/inventory_cypress.sh @@ -6,6 +6,7 @@ source .buildkite/scripts/common/util.sh .buildkite/scripts/bootstrap.sh .buildkite/scripts/download_build_artifacts.sh +.buildkite/scripts/copy_es_snapshot_cache.sh export JOB=kibana-inventory-onboarding-cypress diff --git a/.buildkite/scripts/steps/functional/observability_onboarding_cypress.sh b/.buildkite/scripts/steps/functional/observability_onboarding_cypress.sh index 095ef5c723392..802bb447f72d2 100644 --- a/.buildkite/scripts/steps/functional/observability_onboarding_cypress.sh +++ b/.buildkite/scripts/steps/functional/observability_onboarding_cypress.sh @@ -6,6 +6,7 @@ source .buildkite/scripts/common/util.sh .buildkite/scripts/bootstrap.sh .buildkite/scripts/download_build_artifacts.sh +.buildkite/scripts/copy_es_snapshot_cache.sh export JOB=kibana-observability-onboarding-cypress diff --git a/.buildkite/scripts/steps/functional/profiling_cypress.sh b/.buildkite/scripts/steps/functional/profiling_cypress.sh index daad169069ae3..4e5fb770a12b4 100644 --- a/.buildkite/scripts/steps/functional/profiling_cypress.sh +++ b/.buildkite/scripts/steps/functional/profiling_cypress.sh @@ -6,6 +6,7 @@ source .buildkite/scripts/common/util.sh .buildkite/scripts/bootstrap.sh .buildkite/scripts/download_build_artifacts.sh +.buildkite/scripts/copy_es_snapshot_cache.sh export JOB=kibana-profiling-cypress diff --git a/.buildkite/scripts/steps/functional/synthetics.sh b/.buildkite/scripts/steps/functional/synthetics.sh index 3d22131701762..aa388096fc404 100644 --- a/.buildkite/scripts/steps/functional/synthetics.sh +++ b/.buildkite/scripts/steps/functional/synthetics.sh @@ -6,6 +6,7 @@ source .buildkite/scripts/common/util.sh .buildkite/scripts/bootstrap.sh .buildkite/scripts/download_build_artifacts.sh +.buildkite/scripts/copy_es_snapshot_cache.sh export JOB=kibana-uptime-playwright From 3ce8b74c48a0bbee3fcabf6ec9fcae8ab1c88dcc Mon Sep 17 00:00:00 2001 From: Francois-Clement Brossard Date: Sat, 26 Oct 2024 02:43:33 +0900 Subject: [PATCH 046/135] [SR] Add tooltips for disabled fields on managed SLM repository and policy (#196565) ## Summary Closes https://github.com/elastic/kibana/issues/173124#issuecomment-2352968634 by adding tooltips details when hovering the disabled SLM repository or policy fields. ### Screenshots **SLM managed repository** ![Screenshot 2024-10-16 at 1 38 19](https://github.com/user-attachments/assets/3bd11ea5-f846-433f-8615-b51de184336b) **SLM managed policy** ![Screenshot 2024-10-16 at 1 37 57](https://github.com/user-attachments/assets/d11757bd-bda5-4b4f-8c1e-e795e01b1fa2) ### Checklist - [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] 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)) - [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#_add_your_labels) - [x] This will appear in the **Release Notes** and follow the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com> --- .../components/disable_tooltip.tsx | 52 ++++++++++++ .../policy_form/steps/step_logistics.tsx | 83 +++++++++++-------- .../type_settings/azure_settings.tsx | 79 +++++++++++------- .../type_settings/gcs_settings.tsx | 79 +++++++++++------- .../type_settings/s3_settings.tsx | 79 +++++++++++------- 5 files changed, 247 insertions(+), 125 deletions(-) create mode 100644 x-pack/plugins/snapshot_restore/public/application/components/disable_tooltip.tsx diff --git a/x-pack/plugins/snapshot_restore/public/application/components/disable_tooltip.tsx b/x-pack/plugins/snapshot_restore/public/application/components/disable_tooltip.tsx new file mode 100644 index 0000000000000..8d82705b27022 --- /dev/null +++ b/x-pack/plugins/snapshot_restore/public/application/components/disable_tooltip.tsx @@ -0,0 +1,52 @@ +/* + * 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, { ReactElement } from 'react'; +import { EuiToolTip } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +export const MANAGED_REPOSITORY_TOOLTIP_MESSAGE = i18n.translate( + 'xpack.snapshotRestore.repositoryForm.disableToolTip', + { + defaultMessage: 'This field is disabled because you are editing a managed repository.', + } +); + +export const MANAGED_POLICY_TOOLTIP_MESSAGE = i18n.translate( + 'xpack.snapshotRestore.policyForm.disableToolTip', + { + defaultMessage: 'This field is disabled because you are editing a managed policy.', + } +); + +interface Props { + isManaged?: boolean; + tooltipMessage: string; + component: ReactElement; +} + +/** + * Component that wraps a given component (disabled field) with a tooltip if a repository + * or policy is managed (isManaged === true). + * + * @param {boolean} isManaged - Determines if the tooltip should be displayed. + * @param {string} tooltipMessage - The message to display inside the tooltip. + * @param {React.ReactElement} component - The component to wrap with the tooltip. + */ +export const DisableToolTip: React.FunctionComponent = ({ + isManaged, + tooltipMessage, + component, +}) => { + return isManaged ? ( + + {component} + + ) : ( + component + ); +}; diff --git a/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_logistics.tsx b/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_logistics.tsx index 2ad6c88af5f13..36fd8c10f684b 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_logistics.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_logistics.tsx @@ -33,6 +33,7 @@ import { useLoadRepositories } from '../../../services/http'; import { linkToAddRepository } from '../../../services/navigation'; import { InlineLoading } from '../..'; import { StepProps } from '.'; +import { DisableToolTip, MANAGED_POLICY_TOOLTIP_MESSAGE } from '../../disable_tooltip'; export const PolicyStepLogistics: React.FunctionComponent = ({ policy, @@ -258,22 +259,28 @@ export const PolicyStepLogistics: React.FunctionComponent = ({ } return ( - ({ - value: name, - text: name, - }))} - hasNoInitialSelection={!doesRepositoryExist} - value={!doesRepositoryExist ? '' : policy.repository} - onBlur={() => setTouched({ ...touched, repository: true })} - onChange={(e) => { - updatePolicy({ - repository: e.target.value, - }); - }} - fullWidth - data-test-subj="repositorySelect" - disabled={policy?.isManagedPolicy && isEditing} + ({ + value: name, + text: name, + }))} + hasNoInitialSelection={!doesRepositoryExist} + value={!doesRepositoryExist ? '' : policy.repository} + onBlur={() => setTouched({ ...touched, repository: true })} + onChange={(e) => { + updatePolicy({ + repository: e.target.value, + }); + }} + fullWidth + data-test-subj="repositorySelect" + disabled={policy?.isManagedPolicy && isEditing} + /> + } /> ); }; @@ -325,25 +332,31 @@ export const PolicyStepLogistics: React.FunctionComponent = ({ } fullWidth > - { - updatePolicy({ - snapshotName: e.target.value, - }); - }} - onBlur={() => setTouched({ ...touched, snapshotName: true })} - placeholder={i18n.translate( - 'xpack.snapshotRestore.policyForm.stepLogistics.policySnapshotNamePlaceholder', - { - defaultMessage: `''`, - description: - 'Example date math snapshot name. Keeping the same syntax is important: ', - } - )} - data-test-subj="snapshotNameInput" - disabled={policy?.isManagedPolicy && isEditing} + { + updatePolicy({ + snapshotName: e.target.value, + }); + }} + onBlur={() => setTouched({ ...touched, snapshotName: true })} + placeholder={i18n.translate( + 'xpack.snapshotRestore.policyForm.stepLogistics.policySnapshotNamePlaceholder', + { + defaultMessage: `''`, + description: + 'Example date math snapshot name. Keeping the same syntax is important: ', + } + )} + data-test-subj="snapshotNameInput" + disabled={policy?.isManagedPolicy && isEditing} + /> + } /> diff --git a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/azure_settings.tsx b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/azure_settings.tsx index da061fa8c2abb..9f33e23a9cb29 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/azure_settings.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/azure_settings.tsx @@ -18,6 +18,7 @@ import { import { AzureRepository, Repository } from '../../../../../common/types'; import { RepositorySettingsValidation } from '../../../services/validation'; import { ChunkSizeField, MaxSnapshotsField, MaxRestoreField } from './common'; +import { DisableToolTip, MANAGED_REPOSITORY_TOOLTIP_MESSAGE } from '../../disable_tooltip'; interface Props { repository: AzureRepository; @@ -94,16 +95,22 @@ export const AzureSettings: React.FunctionComponent = ({ isInvalid={Boolean(hasErrors && settingErrors.client)} error={settingErrors.client} > - { - updateRepositorySettings({ - client: e.target.value, - }); - }} - data-test-subj="clientInput" - disabled={isManagedRepository} + { + updateRepositorySettings({ + client: e.target.value, + }); + }} + data-test-subj="clientInput" + disabled={isManagedRepository} + /> + } /> @@ -139,16 +146,22 @@ export const AzureSettings: React.FunctionComponent = ({ isInvalid={Boolean(hasErrors && settingErrors.container)} error={settingErrors.container} > - { - updateRepositorySettings({ - container: e.target.value, - }); - }} - data-test-subj="containerInput" - disabled={isManagedRepository} + { + updateRepositorySettings({ + container: e.target.value, + }); + }} + data-test-subj="containerInput" + disabled={isManagedRepository} + /> + } /> @@ -184,16 +197,22 @@ export const AzureSettings: React.FunctionComponent = ({ isInvalid={Boolean(hasErrors && settingErrors.basePath)} error={settingErrors.basePath} > - { - updateRepositorySettings({ - basePath: e.target.value, - }); - }} - data-test-subj="basePathInput" - disabled={isManagedRepository} + { + updateRepositorySettings({ + basePath: e.target.value, + }); + }} + data-test-subj="basePathInput" + disabled={isManagedRepository} + /> + } /> diff --git a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/gcs_settings.tsx b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/gcs_settings.tsx index 865a628b984b6..75272fec0c7e1 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/gcs_settings.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/gcs_settings.tsx @@ -12,6 +12,7 @@ import { EuiDescribedFormGroup, EuiFieldText, EuiFormRow, EuiSwitch, EuiTitle } import { GCSRepository, Repository } from '../../../../../common/types'; import { RepositorySettingsValidation } from '../../../services/validation'; import { ChunkSizeField, MaxSnapshotsField, MaxRestoreField } from './common'; +import { DisableToolTip, MANAGED_REPOSITORY_TOOLTIP_MESSAGE } from '../../disable_tooltip'; interface Props { repository: GCSRepository; @@ -82,16 +83,22 @@ export const GCSSettings: React.FunctionComponent = ({ isInvalid={Boolean(hasErrors && settingErrors.client)} error={settingErrors.client} > - { - updateRepositorySettings({ - client: e.target.value, - }); - }} - data-test-subj="clientInput" - disabled={isManagedRepository} + { + updateRepositorySettings({ + client: e.target.value, + }); + }} + data-test-subj="clientInput" + disabled={isManagedRepository} + /> + } /> @@ -127,16 +134,22 @@ export const GCSSettings: React.FunctionComponent = ({ isInvalid={Boolean(hasErrors && settingErrors.bucket)} error={settingErrors.bucket} > - { - updateRepositorySettings({ - bucket: e.target.value, - }); - }} - data-test-subj="bucketInput" - disabled={isManagedRepository} + { + updateRepositorySettings({ + bucket: e.target.value, + }); + }} + data-test-subj="bucketInput" + disabled={isManagedRepository} + /> + } /> @@ -172,16 +185,22 @@ export const GCSSettings: React.FunctionComponent = ({ isInvalid={Boolean(hasErrors && settingErrors.basePath)} error={settingErrors.basePath} > - { - updateRepositorySettings({ - basePath: e.target.value, - }); - }} - data-test-subj="basePathInput" - disabled={isManagedRepository} + { + updateRepositorySettings({ + basePath: e.target.value, + }); + }} + data-test-subj="basePathInput" + disabled={isManagedRepository} + /> + } /> diff --git a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/s3_settings.tsx b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/s3_settings.tsx index 88398315a327c..dd9953cf93a78 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/s3_settings.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/s3_settings.tsx @@ -20,6 +20,7 @@ import { import { Repository, S3Repository } from '../../../../../common/types'; import { RepositorySettingsValidation } from '../../../services/validation'; import { ChunkSizeField, MaxSnapshotsField, MaxRestoreField } from './common'; +import { DisableToolTip, MANAGED_REPOSITORY_TOOLTIP_MESSAGE } from '../../disable_tooltip'; interface Props { repository: S3Repository; @@ -117,16 +118,22 @@ export const S3Settings: React.FunctionComponent = ({ isInvalid={Boolean(hasErrors && settingErrors.client)} error={settingErrors.client} > - { - updateRepositorySettings({ - client: e.target.value, - }); - }} - data-test-subj="clientInput" - disabled={isManagedRepository} + { + updateRepositorySettings({ + client: e.target.value, + }); + }} + data-test-subj="clientInput" + disabled={isManagedRepository} + /> + } /> @@ -162,16 +169,22 @@ export const S3Settings: React.FunctionComponent = ({ isInvalid={Boolean(hasErrors && settingErrors.bucket)} error={settingErrors.bucket} > - { - updateRepositorySettings({ - bucket: e.target.value, - }); - }} - data-test-subj="bucketInput" - disabled={isManagedRepository} + { + updateRepositorySettings({ + bucket: e.target.value, + }); + }} + data-test-subj="bucketInput" + disabled={isManagedRepository} + /> + } /> @@ -207,16 +220,22 @@ export const S3Settings: React.FunctionComponent = ({ isInvalid={Boolean(hasErrors && settingErrors.basePath)} error={settingErrors.basePath} > - { - updateRepositorySettings({ - basePath: e.target.value, - }); - }} - data-test-subj="basePathInput" - disabled={isManagedRepository} + { + updateRepositorySettings({ + basePath: e.target.value, + }); + }} + data-test-subj="basePathInput" + disabled={isManagedRepository} + /> + } /> From a1d755a675b05269f167d160f4c0c28a83d5e4d5 Mon Sep 17 00:00:00 2001 From: Ievgen Sorokopud Date: Fri, 25 Oct 2024 21:17:57 +0200 Subject: [PATCH 047/135] [Security GenAI] When indices referenced in KB index entries are deleted from OUTSIDE the AI Assistant KB UI, there is not indication to the user (#197156) (#197722) ## Summary Bug https://github.com/elastic/kibana/issues/197156 This is a UI part of the bug that warns a user about missing indices used in knowledge base entries. ### To test 1. Add an index entry that uses existing index 2. Remove that index 3. Go back to knowledge base entries page 4. You should see warning icon next to the name of the index entry which uses removed index. Also, when you edit that entry you will see `Index doesn't exist` error next to the `Index` field in the flyout Screenshot 2024-10-24 at 19 54 36 Screenshot 2024-10-24 at 19 54 52 ### 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 --- .../inline_actions/index.tsx | 1 + .../index.test.tsx | 38 ++++++++++++++- .../index.tsx | 15 +++++- .../index_entry_editor.test.tsx | 17 +++++++ .../index_entry_editor.tsx | 14 +++++- .../translations.ts | 15 ++++++ .../use_knowledge_base_table.tsx | 48 ++++++++++++++++++- 7 files changed, 143 insertions(+), 5 deletions(-) diff --git a/x-pack/packages/kbn-elastic-assistant/impl/assistant/common/components/assistant_settings_management/inline_actions/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/assistant/common/components/assistant_settings_management/inline_actions/index.tsx index 06e0c8ebcc977..7a2da0d22fc3e 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/assistant/common/components/assistant_settings_management/inline_actions/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/assistant/common/components/assistant_settings_management/inline_actions/index.tsx @@ -37,6 +37,7 @@ export const useInlineActions = ( actions: [ { name: i18n.EDIT_BUTTON, + 'data-test-subj': 'edit-button', description: i18n.EDIT_BUTTON, icon: 'pencil', type: 'icon', diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index.test.tsx index 86cc30ea02943..1b1cabd786739 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index.test.tsx @@ -55,6 +55,7 @@ const mockDataViews = { { name: 'field-2', esTypes: ['text'] }, { name: 'field-3', esTypes: ['semantic_text'] }, ]), + getExistingIndices: jest.fn().mockResolvedValue(['index-2']), } as unknown as DataViewsContract; const queryClient = new QueryClient(); const wrapper = (props: { children: React.ReactNode }) => ( @@ -65,7 +66,22 @@ const wrapper = (props: { children: React.ReactNode }) => ( describe('KnowledgeBaseSettingsManagement', () => { const mockData = [ { id: '1', name: 'Test Entry 1', type: 'document', kbResource: 'user', users: [{ id: 'hi' }] }, - { id: '2', name: 'Test Entry 2', type: 'index', kbResource: 'global', users: [] }, + { + id: '2', + name: 'Test Entry 2', + type: 'index', + kbResource: 'global', + users: [], + index: 'missing-index', + }, + { + id: '3', + name: 'Test Entry 3', + type: 'index', + kbResource: 'private', + users: [{ id: 'fake-user' }], + index: 'index-2', + }, ]; beforeEach(() => { @@ -241,4 +257,24 @@ describe('KnowledgeBaseSettingsManagement', () => { }); expect(screen.queryByTestId('delete-entry-confirmation')).not.toBeInTheDocument(); }); + + it('shows warning icon for index entries with missing indices', async () => { + render(, { + wrapper, + }); + + await waitFor(() => expect(screen.getByTestId('missing-index-icon')).toBeInTheDocument()); + + expect(screen.getAllByTestId('missing-index-icon').length).toEqual(1); + + fireEvent.mouseOver(screen.getByTestId('missing-index-icon')); + + await waitFor(() => screen.getByTestId('missing-index-tooltip')); + + expect( + screen.getByText( + 'The index assigned to this knowledge base entry is unavailable. Check the permissions on the configured index, or that the index has not been deleted. You can update the index to be used for this knowledge entry, or delete the entry entirely.' + ) + ).toBeInTheDocument(); + }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index.tsx index e3a86c62d1222..3633a935a3bea 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index.tsx @@ -30,6 +30,7 @@ import { } from '@kbn/elastic-assistant-common'; import { css } from '@emotion/react'; import { DataViewsContract } from '@kbn/data-views-plugin/public'; +import useAsync from 'react-use/lib/useAsync'; import { KnowledgeBaseTour } from '../../tour/knowledge_base'; import { AlertsSettingsManagement } from '../../assistant/settings/alerts_settings/alerts_settings_management'; import { useKnowledgeBaseEntries } from '../../assistant/api/knowledge_base/entries/use_knowledge_base_entries'; @@ -173,10 +174,22 @@ export const KnowledgeBaseSettingsManagement: React.FC = React.memo(({ d toasts, enabled: enableKnowledgeBaseByDefault, }); + + const { value: existingIndices } = useAsync(() => { + const indices: string[] = []; + entries.data.forEach((entry) => { + if (entry.type === 'index') { + indices.push(entry.index); + } + }); + return dataViews.getExistingIndices(indices); + }, [entries.data]); + const { getColumns } = useKnowledgeBaseTable(); const columns = useMemo( () => getColumns({ + existingIndices, isDeleteEnabled: (entry: KnowledgeBaseEntryResponse) => { return ( !isSystemEntry(entry) && (isGlobalEntry(entry) ? hasManageGlobalKnowledgeBase : true) @@ -197,7 +210,7 @@ export const KnowledgeBaseSettingsManagement: React.FC = React.memo(({ d openFlyout(); }, }), - [entries.data, getColumns, hasManageGlobalKnowledgeBase, openFlyout] + [entries.data, existingIndices, getColumns, hasManageGlobalKnowledgeBase, openFlyout] ); // Refresh button diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.test.tsx b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.test.tsx index e4656b10d1d31..faa4653c9beab 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.test.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.test.tsx @@ -22,6 +22,7 @@ describe('IndexEntryEditor', () => { { name: 'field-2', esTypes: ['text'] }, { name: 'field-3', esTypes: ['semantic_text'] }, ]), + getExistingIndices: jest.fn().mockResolvedValue(['index-1']), } as unknown as DataViewsContract; const defaultProps = { @@ -147,4 +148,20 @@ describe('IndexEntryEditor', () => { expect(getByRole('combobox', { name: i18n.ENTRY_FIELD_PLACEHOLDER })).toBeDisabled(); }); }); + + it('fetches index options and updates on selection 2', async () => { + (mockDataViews.getExistingIndices as jest.Mock).mockResolvedValue([]); + const { getByText } = render( + + ); + + await waitFor(() => { + expect(mockDataViews.getExistingIndices).toHaveBeenCalled(); + }); + + expect(getByText("Index doesn't exist")).toBeInTheDocument(); + }); }); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.tsx b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.tsx index 550861bcbffd9..b5e1c278e2ddb 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.tsx @@ -96,6 +96,12 @@ export const IndexEntryEditor: React.FC = React.memo( })); }, [dataViews]); + const { value: isMissingIndex } = useAsync(async () => { + if (!entry?.index?.length) return false; + + return !(await dataViews.getExistingIndices([entry.index])).length; + }, [entry?.index]); + const indexFields = useAsync( async () => dataViews.getFieldsForWildcard({ @@ -251,11 +257,17 @@ export const IndexEntryEditor: React.FC = React.memo( fullWidth /> - + {i18n.MISSING_INDEX_ERROR}} + > { ); }; +const NameColumn = ({ + entry, + existingIndices, +}: { + entry: KnowledgeBaseEntryResponse; + existingIndices?: string[]; +}) => { + let showMissingIndexWarning = false; + if (existingIndices && entry.type === 'index') { + showMissingIndexWarning = !existingIndices.includes(entry.index); + } + return ( + <> + {entry.name} + {showMissingIndexWarning && ( + + + + )} + + ); +}; + export const useKnowledgeBaseTable = () => { const getActions = useInlineActions(); @@ -97,11 +137,13 @@ export const useKnowledgeBaseTable = () => { const getColumns = useCallback( ({ + existingIndices, isDeleteEnabled, isEditEnabled, onDeleteActionClicked, onEditActionClicked, }: { + existingIndices?: string[]; isDeleteEnabled: (entry: KnowledgeBaseEntryResponse) => boolean; isEditEnabled: (entry: KnowledgeBaseEntryResponse) => boolean; onDeleteActionClicked: (entry: KnowledgeBaseEntryResponse) => void; @@ -115,7 +157,9 @@ export const useKnowledgeBaseTable = () => { }, { name: i18n.COLUMN_NAME, - render: ({ name }: KnowledgeBaseEntryResponse) => name, + render: (entry: KnowledgeBaseEntryResponse) => ( + + ), sortable: ({ name }: KnowledgeBaseEntryResponse) => name, width: '30%', }, From ae9c0d385015f3068a04af46678e18e2f00b519a Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:18:12 -0400 Subject: [PATCH 048/135] [Security Solution][Endpoint] Ensure that DS indices for response actions are created prior to sending action to Endpoint (#196953) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary PR adds changes to Security Solution so that DOT indices (restricted in Serverless) are created in Kibana prior to Elastic Defend (Endpoint) attempting to stream documents to these indices. The indices that are now created in kibana are: - `.logs-endpoint.diagnostic.collection-` - `.logs-endpoint.action.responses-` - `.logs-endpoint.heartbeat-` _(⚠️ created only in serverless only)_ ### Fleet changes: - Added support for the following two server-side extension points: - `packagePolicyPostUpdate` : callbacks invoked after an integration policy has been updated successfully - `agentPolicyPostUpdate` : callbacks invoked after an agent policy has been updated successfully ### Security Solution: - Logic was added to the following Fleet server-side extension points that checks if the necessary indices exist and if not, it creates them: - After creating an Elastic Defend integration policy - After updating an Elastic Defend integration policy - After updating a Fleet Agent Policy that includes Elastic Defend integration policy --- x-pack/plugins/fleet/server/mocks/index.ts | 16 +- .../server/services/agent_policy.test.ts | 32 +++ .../fleet/server/services/agent_policy.ts | 16 +- .../server/services/package_policy.test.ts | 35 +++ .../fleet/server/services/package_policy.ts | 90 ++++---- .../server/services/package_policy_service.ts | 52 +++-- .../plugins/fleet/server/types/extensions.ts | 23 +- .../endpoint/endpoint_app_context_services.ts | 35 ++- .../clients => }/lib/simple_mem_cache.test.ts | 7 + .../clients => }/lib/simple_mem_cache.ts | 6 + .../server/endpoint/mocks/mocks.ts | 2 + .../lib/base_response_actions_client.ts | 8 +- .../endpoint_fleet_services_factory.mocks.ts | 22 +- .../endpoint_fleet_services_factory.test.ts | 181 +++++++++++++++ .../fleet/endpoint_fleet_services_factory.ts | 216 +++++++++++++++--- .../fleet_integration.test.ts | 54 ++++- .../fleet_integration/fleet_integration.ts | 91 +++++++- .../create_policy_datastreams.test.ts | 119 ++++++++++ .../handlers/create_policy_datastreams.ts | 159 +++++++++++++ 19 files changed, 1028 insertions(+), 136 deletions(-) rename x-pack/plugins/security_solution/server/endpoint/{services/actions/clients => }/lib/simple_mem_cache.test.ts (92%) rename x-pack/plugins/security_solution/server/endpoint/{services/actions/clients => }/lib/simple_mem_cache.ts (95%) create mode 100644 x-pack/plugins/security_solution/server/endpoint/services/fleet/endpoint_fleet_services_factory.test.ts create mode 100644 x-pack/plugins/security_solution/server/fleet_integration/handlers/create_policy_datastreams.test.ts create mode 100644 x-pack/plugins/security_solution/server/fleet_integration/handlers/create_policy_datastreams.ts diff --git a/x-pack/plugins/fleet/server/mocks/index.ts b/x-pack/plugins/fleet/server/mocks/index.ts index 43b113899072e..ac806c1448a24 100644 --- a/x-pack/plugins/fleet/server/mocks/index.ts +++ b/x-pack/plugins/fleet/server/mocks/index.ts @@ -186,7 +186,7 @@ export const createPackagePolicyServiceMock = (): jest.Mocked => { return { - get: jest.fn(), - list: jest.fn(), - getFullAgentPolicy: jest.fn(), - getByIds: jest.fn(), - turnOffAgentTamperProtections: jest.fn(), - fetchAllAgentPolicies: jest.fn(), - fetchAllAgentPolicyIds: jest.fn(), + get: jest.fn().mockReturnValue(Promise.resolve()), + list: jest.fn().mockReturnValue(Promise.resolve()), + getFullAgentPolicy: jest.fn().mockReturnValue(Promise.resolve()), + getByIds: jest.fn().mockReturnValue(Promise.resolve()), + turnOffAgentTamperProtections: jest.fn().mockReturnValue(Promise.resolve()), + fetchAllAgentPolicies: jest.fn().mockReturnValue(Promise.resolve()), + fetchAllAgentPolicyIds: jest.fn().mockReturnValue(Promise.resolve()), }; }; diff --git a/x-pack/plugins/fleet/server/services/agent_policy.test.ts b/x-pack/plugins/fleet/server/services/agent_policy.test.ts index 00bc01aa1f2cb..608b6f739fc29 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.test.ts @@ -1285,6 +1285,38 @@ describe('Agent policy', () => { }) ).resolves.not.toThrow(); }); + + it('should run external "agentPolicyPostUpdate" callbacks when update is successful', async () => { + const soClient = getAgentPolicyCreateMock(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + + const postUpdateCallback = jest.fn(async (policy) => policy); + mockedAppContextService.getExternalCallbacks.mockImplementation((type) => { + if (type === 'agentPolicyPostUpdate') { + return new Set([postUpdateCallback]); + } + }); + + soClient.get.mockResolvedValue({ + attributes: {}, + id: 'test-id', + type: 'mocked', + references: [], + }); + + await expect( + agentPolicyService.update(soClient, esClient, 'test-id', { + name: 'test', + namespace: 'default', + }) + ).resolves.not.toThrow(); + + expect(mockedAppContextService.getExternalCallbacks).toHaveBeenCalledWith( + 'agentPolicyPostUpdate' + ); + + expect(postUpdateCallback).toHaveBeenCalled(); + }); }); describe('deployPolicy', () => { diff --git a/x-pack/plugins/fleet/server/services/agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policy.ts index 0209ee6edb630..bcbeafdde1182 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.ts @@ -62,6 +62,7 @@ import type { PostAgentPolicyUpdateCallback, PreconfiguredAgentPolicy, OutputsForAgentPolicy, + PostAgentPolicyPostUpdateCallback, } from '../types'; import { AGENT_POLICY_INDEX, @@ -309,8 +310,8 @@ class AgentPolicyService { public async runExternalCallbacks( externalCallbackType: ExternalCallback[0], - agentPolicy: NewAgentPolicy | Partial - ): Promise> { + agentPolicy: NewAgentPolicy | Partial | AgentPolicy + ): Promise | AgentPolicy> { const logger = appContextService.getLogger(); logger.debug(`Running external callbacks for ${externalCallbackType}`); try { @@ -333,6 +334,12 @@ class AgentPolicyService { ); updatedNewAgentPolicy = result; } + if (externalCallbackType === 'agentPolicyPostUpdate') { + result = await (callback as PostAgentPolicyPostUpdateCallback)( + newAgentPolicy as AgentPolicy + ); + updatedNewAgentPolicy = result; + } } newAgentPolicy = updatedNewAgentPolicy; } @@ -741,6 +748,11 @@ class AgentPolicyService { bumpRevision: true, removeProtection: false, skipValidation: options?.skipValidation ?? false, + }).then((updatedAgentPolicy) => { + return this.runExternalCallbacks( + 'agentPolicyPostUpdate', + updatedAgentPolicy + ) as unknown as AgentPolicy; }); } diff --git a/x-pack/plugins/fleet/server/services/package_policy.test.ts b/x-pack/plugins/fleet/server/services/package_policy.test.ts index 8c322d997a612..30523448e721d 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.test.ts @@ -1718,6 +1718,41 @@ describe('Package policy service', () => { }); }); + it('should run "packagePolicyPostUpdate" external callbacks', async () => { + const soClient = savedObjectsClientMock.create(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + const mockPackagePolicy = createPackagePolicyMock(); + const attributes = { + ...mockPackagePolicy, + inputs: [], + }; + + jest.spyOn(appContextService, 'getExternalCallbacks'); + + soClient.get.mockResolvedValue({ + id: 'test-package-policy', + type: LEGACY_PACKAGE_POLICY_SAVED_OBJECT_TYPE, + references: [], + attributes, + }); + + soClient.update.mockResolvedValue({ + id: 'test-package-policy', + type: LEGACY_PACKAGE_POLICY_SAVED_OBJECT_TYPE, + references: [], + attributes, + }); + + await packagePolicyService.update(soClient, esClient, 'test-package-policy', { + ...mockPackagePolicy, + inputs: [], + }); + + expect(appContextService.getExternalCallbacks).toHaveBeenCalledWith( + 'packagePolicyPostUpdate' + ); + }); + describe('remove protections', () => { beforeEach(() => { mockAgentPolicyService.bumpRevision.mockReset(); diff --git a/x-pack/plugins/fleet/server/services/package_policy.ts b/x-pack/plugins/fleet/server/services/package_policy.ts index 2d360dba63767..daa08844d5fbc 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.ts @@ -94,6 +94,7 @@ import type { DryRunPackagePolicy, PostPackagePolicyCreateCallback, PostPackagePolicyPostCreateCallback, + PutPackagePolicyPostUpdateCallback, } from '../types'; import type { ExternalCallback } from '..'; @@ -127,6 +128,8 @@ import type { PackagePolicyClient, PackagePolicyClientFetchAllItemsOptions, PackagePolicyService, + RunExternalCallbacksPackagePolicyArgument, + RunExternalCallbacksPackagePolicyResponse, } from './package_policy_service'; import { installAssetsForInputPackagePolicy } from './epm/packages/install'; import { auditLoggingService } from './audit_logging'; @@ -1091,9 +1094,16 @@ class PackagePolicyClientImpl implements PackagePolicyClient { await Promise.all([...bumpPromises, assetRemovePromise, deleteSecretsPromise]); sendUpdatePackagePolicyTelemetryEvent(soClient, [packagePolicyUpdate], [oldPackagePolicy]); + logger.debug(`Package policy ${id} update completed`); - return newPolicy; + // Run external post-update callbacks and return + return packagePolicyService.runExternalCallbacks( + 'packagePolicyPostUpdate', + newPolicy, + soClient, + esClient + ); } public async bulkUpdate( @@ -1930,48 +1940,21 @@ class PackagePolicyClientImpl implements PackagePolicyClient { public async runExternalCallbacks
( externalCallbackType: A, - packagePolicy: A extends 'packagePolicyDelete' - ? DeletePackagePoliciesResponse - : A extends 'packagePolicyPostDelete' - ? PostDeletePackagePoliciesResponse - : A extends 'packagePolicyPostCreate' - ? PackagePolicy - : A extends 'packagePolicyCreate' - ? NewPackagePolicy - : never, + packagePolicy: RunExternalCallbacksPackagePolicyArgument, soClient: SavedObjectsClientContract, esClient: ElasticsearchClient, context?: RequestHandlerContext, request?: KibanaRequest - ): Promise< - A extends 'packagePolicyDelete' - ? void - : A extends 'packagePolicyPostDelete' - ? void - : A extends 'packagePolicyPostCreate' - ? PackagePolicy - : A extends 'packagePolicyCreate' - ? NewPackagePolicy - : never - >; - public async runExternalCallbacks( - externalCallbackType: ExternalCallback[0], - packagePolicy: - | PackagePolicy - | NewPackagePolicy - | PostDeletePackagePoliciesResponse - | DeletePackagePoliciesResponse, - soClient: SavedObjectsClientContract, - esClient: ElasticsearchClient, - context?: RequestHandlerContext, - request?: KibanaRequest - ): Promise { + ): Promise> { const logger = appContextService.getLogger(); const numberOfCallbacks = appContextService.getExternalCallbacks(externalCallbackType)?.size; + let runResult: any; + logger.debug(`Running ${numberOfCallbacks} external callbacks for ${externalCallbackType}`); + try { if (externalCallbackType === 'packagePolicyPostDelete') { - return await this.runPostDeleteExternalCallbacks( + runResult = await this.runPostDeleteExternalCallbacks( packagePolicy as PostDeletePackagePoliciesResponse, soClient, esClient, @@ -1979,7 +1962,7 @@ class PackagePolicyClientImpl implements PackagePolicyClient { request ); } else if (externalCallbackType === 'packagePolicyDelete') { - return await this.runDeleteExternalCallbacks( + runResult = await this.runDeleteExternalCallbacks( packagePolicy as DeletePackagePoliciesResponse, soClient, esClient @@ -1988,21 +1971,33 @@ class PackagePolicyClientImpl implements PackagePolicyClient { if (!Array.isArray(packagePolicy)) { let newData = packagePolicy; const externalCallbacks = appContextService.getExternalCallbacks(externalCallbackType); + if (externalCallbacks && externalCallbacks.size > 0) { - let updatedNewData = newData; + let updatedNewData: any = newData; + for (const callback of externalCallbacks) { - let result; + let thisCallbackResponse; + if (externalCallbackType === 'packagePolicyPostCreate') { - result = await (callback as PostPackagePolicyPostCreateCallback)( + thisCallbackResponse = await (callback as PostPackagePolicyPostCreateCallback)( updatedNewData as PackagePolicy, soClient, esClient, context, request ); - updatedNewData = PackagePolicySchema.validate(result) as NewPackagePolicy; + updatedNewData = PackagePolicySchema.validate(thisCallbackResponse); + } else if (externalCallbackType === 'packagePolicyPostUpdate') { + thisCallbackResponse = await (callback as PutPackagePolicyPostUpdateCallback)( + updatedNewData as PackagePolicy, + soClient, + esClient, + context, + request + ); + updatedNewData = PackagePolicySchema.validate(thisCallbackResponse); } else { - result = await (callback as PostPackagePolicyCreateCallback)( + thisCallbackResponse = await (callback as PostPackagePolicyCreateCallback)( updatedNewData as NewPackagePolicy, soClient, esClient, @@ -2012,10 +2007,10 @@ class PackagePolicyClientImpl implements PackagePolicyClient { } if (externalCallbackType === 'packagePolicyCreate') { - updatedNewData = NewPackagePolicySchema.validate(result) as NewPackagePolicy; + updatedNewData = NewPackagePolicySchema.validate(thisCallbackResponse); } else if (externalCallbackType === 'packagePolicyUpdate') { const omitted = { - ...omit(result, [ + ...omit(thisCallbackResponse, [ 'id', 'spaceIds', 'version', @@ -2026,16 +2021,19 @@ class PackagePolicyClientImpl implements PackagePolicyClient { 'created_by', 'elasticsearch', ]), - inputs: result.inputs.map((input) => omit(input, ['compiled_input'])), + inputs: thisCallbackResponse.inputs.map((input) => + omit(input, ['compiled_input']) + ), }; - updatedNewData = UpdatePackagePolicySchema.validate(omitted) as PackagePolicy; + updatedNewData = UpdatePackagePolicySchema.validate(omitted); } } newData = updatedNewData; } - return newData; + + runResult = newData; } } } catch (error) { @@ -2043,6 +2041,8 @@ class PackagePolicyClientImpl implements PackagePolicyClient { logger.error(error); throw error; } + + return runResult as unknown as RunExternalCallbacksPackagePolicyResponse; } public async runPostDeleteExternalCallbacks( diff --git a/x-pack/plugins/fleet/server/services/package_policy_service.ts b/x-pack/plugins/fleet/server/services/package_policy_service.ts index f5cb879cef7cb..967efb1055cfb 100644 --- a/x-pack/plugins/fleet/server/services/package_policy_service.ts +++ b/x-pack/plugins/fleet/server/services/package_policy_service.ts @@ -40,6 +40,36 @@ export interface PackagePolicyService { get asInternalUser(): PackagePolicyClient; } +export type RunExternalCallbacksPackagePolicyArgument = + A extends 'packagePolicyDelete' + ? DeletePackagePoliciesResponse + : A extends 'packagePolicyPostDelete' + ? PostDeletePackagePoliciesResponse + : A extends 'packagePolicyCreate' + ? NewPackagePolicy + : A extends 'packagePolicyPostCreate' + ? PackagePolicy + : A extends 'packagePolicyUpdate' + ? UpdatePackagePolicy + : A extends 'packagePolicyPostUpdate' + ? PackagePolicy + : never; + +export type RunExternalCallbacksPackagePolicyResponse = + A extends 'packagePolicyDelete' + ? void + : A extends 'packagePolicyPostDelete' + ? void + : A extends 'packagePolicyCreate' + ? NewPackagePolicy + : A extends 'packagePolicyPostCreate' + ? PackagePolicy + : A extends 'packagePolicyUpdate' + ? UpdatePackagePolicy + : A extends 'packagePolicyPostUpdate' + ? PackagePolicy + : undefined; + export interface PackagePolicyClient { create( soClient: SavedObjectsClientContract, @@ -169,30 +199,12 @@ export interface PackagePolicyClient { runExternalCallbacks( externalCallbackType: A, - packagePolicy: A extends 'packagePolicyDelete' - ? DeletePackagePoliciesResponse - : A extends 'packagePolicyPostDelete' - ? PostDeletePackagePoliciesResponse - : A extends 'packagePolicyPostCreate' - ? PackagePolicy - : A extends 'packagePolicyUpdate' - ? UpdatePackagePolicy - : NewPackagePolicy, + packagePolicy: RunExternalCallbacksPackagePolicyArgument, soClient: SavedObjectsClientContract, esClient: ElasticsearchClient, context?: RequestHandlerContext, request?: KibanaRequest - ): Promise< - A extends 'packagePolicyDelete' - ? void - : A extends 'packagePolicyPostDelete' - ? void - : A extends 'packagePolicyPostCreate' - ? PackagePolicy - : A extends 'packagePolicyUpdate' - ? UpdatePackagePolicy - : NewPackagePolicy - >; + ): Promise>; runDeleteExternalCallbacks( deletedPackagePolicies: DeletePackagePoliciesResponse, diff --git a/x-pack/plugins/fleet/server/types/extensions.ts b/x-pack/plugins/fleet/server/types/extensions.ts index 594e16f619556..2293747b253e3 100644 --- a/x-pack/plugins/fleet/server/types/extensions.ts +++ b/x-pack/plugins/fleet/server/types/extensions.ts @@ -60,6 +60,14 @@ export type PutPackagePolicyUpdateCallback = ( request?: KibanaRequest ) => Promise; +export type PutPackagePolicyPostUpdateCallback = ( + packagePolicy: PackagePolicy, + soClient: SavedObjectsClientContract, + esClient: ElasticsearchClient, + context?: RequestHandlerContext, + request?: KibanaRequest +) => Promise; + export type PostAgentPolicyCreateCallback = ( agentPolicy: NewAgentPolicy ) => Promise; @@ -68,6 +76,8 @@ export type PostAgentPolicyUpdateCallback = ( agentPolicy: Partial ) => Promise>; +export type PostAgentPolicyPostUpdateCallback = (agentPolicy: AgentPolicy) => Promise; + export type ExternalCallbackCreate = ['packagePolicyCreate', PostPackagePolicyCreateCallback]; export type ExternalCallbackPostCreate = [ 'packagePolicyPostCreate', @@ -79,7 +89,12 @@ export type ExternalCallbackPostDelete = [ 'packagePolicyPostDelete', PostPackagePolicyPostDeleteCallback ]; + export type ExternalCallbackUpdate = ['packagePolicyUpdate', PutPackagePolicyUpdateCallback]; +export type ExternalCallbackPostUpdate = [ + 'packagePolicyPostUpdate', + PutPackagePolicyPostUpdateCallback +]; export type ExternalCallbackAgentPolicyCreate = [ 'agentPolicyCreate', @@ -89,6 +104,10 @@ export type ExternalCallbackAgentPolicyUpdate = [ 'agentPolicyUpdate', PostAgentPolicyUpdateCallback ]; +export type ExternalCallbackAgentPolicyPostUpdate = [ + 'agentPolicyPostUpdate', + PostAgentPolicyPostUpdateCallback +]; /** * Callbacks supported by the Fleet plugin @@ -99,7 +118,9 @@ export type ExternalCallback = | ExternalCallbackDelete | ExternalCallbackPostDelete | ExternalCallbackUpdate + | ExternalCallbackPostUpdate | ExternalCallbackAgentPolicyCreate - | ExternalCallbackAgentPolicyUpdate; + | ExternalCallbackAgentPolicyUpdate + | ExternalCallbackAgentPolicyPostUpdate; export type ExternalCallbacksStorage = Map>; diff --git a/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts b/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts index 192fb6059325a..1afa24ebbd529 100644 --- a/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts +++ b/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts @@ -31,10 +31,12 @@ import type { ResponseActionsClient } from './services'; import { getResponseActionsClient, NormalizedExternalConnectorClient } from './services'; import { getAgentPolicyCreateCallback, + getAgentPolicyPostUpdateCallback, getAgentPolicyUpdateCallback, getPackagePolicyCreateCallback, getPackagePolicyDeleteCallback, getPackagePolicyPostCreateCallback, + getPackagePolicyPostUpdateCallback, getPackagePolicyUpdateCallback, } from '../fleet_integration/fleet_integration'; import type { ManifestManager } from './services/artifacts'; @@ -117,7 +119,8 @@ export class EndpointAppContextService { this.savedObjectsFactoryService = savedObjectsFactory; this.fleetServicesFactory = new EndpointFleetServicesFactory( dependencies.fleetStartServices, - savedObjectsFactory + savedObjectsFactory, + this.createLogger('endpointFleetServices') ); this.registerFleetExtensions(); @@ -169,6 +172,8 @@ export class EndpointAppContextService { getAgentPolicyUpdateCallback(logger, productFeaturesService) ); + registerFleetCallback('agentPolicyPostUpdate', getAgentPolicyPostUpdateCallback(this)); + registerFleetCallback( 'packagePolicyCreate', getPackagePolicyCreateCallback( @@ -183,10 +188,7 @@ export class EndpointAppContextService { ) ); - registerFleetCallback( - 'packagePolicyPostCreate', - getPackagePolicyPostCreateCallback(logger, exceptionListsClient) - ); + registerFleetCallback('packagePolicyPostCreate', getPackagePolicyPostCreateCallback(this)); registerFleetCallback( 'packagePolicyUpdate', @@ -201,6 +203,8 @@ export class EndpointAppContextService { ) ); + registerFleetCallback('packagePolicyPostUpdate', getPackagePolicyPostUpdateCallback(this)); + registerFleetCallback( 'packagePolicyPostDelete', getPackagePolicyDeleteCallback(exceptionListsClient, soClient) @@ -218,6 +222,27 @@ export class EndpointAppContextService { return this.savedObjectsFactoryService; } + /** + * Is kibana running in serverless mode + */ + public isServerless(): boolean { + if (!this.setupDependencies) { + throw new EndpointAppContentServicesNotSetUpError(); + } + + // TODO:PT check what this returns when running locally with kibana in serverless emulation + + return Boolean(this.setupDependencies.cloud.isServerlessEnabled); + } + + public getInternalEsClient(): ElasticsearchClient { + if (!this.startDependencies?.esClient) { + throw new EndpointAppContentServicesNotStartedError(); + } + + return this.startDependencies.esClient; + } + private getFleetAuthzService(): FleetStartContract['authz'] { if (!this.startDependencies?.fleetStartServices) { throw new EndpointAppContentServicesNotStartedError(); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/simple_mem_cache.test.ts b/x-pack/plugins/security_solution/server/endpoint/lib/simple_mem_cache.test.ts similarity index 92% rename from x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/simple_mem_cache.test.ts rename to x-pack/plugins/security_solution/server/endpoint/lib/simple_mem_cache.test.ts index f351e2e40d5be..27ba3bdf23945 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/simple_mem_cache.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/lib/simple_mem_cache.test.ts @@ -51,6 +51,13 @@ describe('SimpleMemCache class', () => { expect(cache.get(key)).toEqual(undefined); }); + it('should delete all entries from cache', () => { + cache.set(key, value); + cache.deleteAll(); + + expect(cache.get(key)).toEqual(undefined); + }); + it('should cleanup expired cache entries', () => { const key2 = 'myKey'; cache.set(key, value); // Default ttl of 10s diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/simple_mem_cache.ts b/x-pack/plugins/security_solution/server/endpoint/lib/simple_mem_cache.ts similarity index 95% rename from x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/simple_mem_cache.ts rename to x-pack/plugins/security_solution/server/endpoint/lib/simple_mem_cache.ts index fc355bf6c3797..a65a1ee6be71a 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/simple_mem_cache.ts +++ b/x-pack/plugins/security_solution/server/endpoint/lib/simple_mem_cache.ts @@ -19,6 +19,8 @@ export interface SimpleMemCacheInterface { get(key: any): TValue | undefined; /** Delete a piece of data from cache */ delete(key: any): void; + /** Delete all cached entries */ + deleteAll(): void; /** Clean up the cache by removing all expired entries */ cleanup(): void; } @@ -79,6 +81,10 @@ export class SimpleMemCache implements SimpleMemCacheInterface { this.cache.delete(key); } + public deleteAll(): void { + this.cache.clear(); + } + public cleanup(): void { for (const [cacheKey, cacheData] of this.cache.entries()) { if (this.isExpired(cacheData)) { diff --git a/x-pack/plugins/security_solution/server/endpoint/mocks/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/mocks/mocks.ts index 5ab221b7bfc07..91a2bc40454b9 100644 --- a/x-pack/plugins/security_solution/server/endpoint/mocks/mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/mocks/mocks.ts @@ -144,6 +144,8 @@ export const createMockEndpointAppContextService = ( return responseActionsClientMock.create(); }), savedObjects: createSavedObjectsClientFactoryMock({ savedObjectsServiceStart }).service, + isServerless: jest.fn().mockReturnValue(false), + getInternalEsClient: jest.fn().mockReturnValue(esClient), } as unknown as jest.Mocked; }; diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.ts index 0411e4a9c8f65..7a8f14b6e9a8e 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/base_response_actions_client.ts @@ -20,7 +20,7 @@ import { } from '../../../../../lib/telemetry/event_based/events'; import { NotFoundError } from '../../../../errors'; import { fetchActionRequestById } from '../../utils/fetch_action_request_by_id'; -import { SimpleMemCache } from './simple_mem_cache'; +import { SimpleMemCache } from '../../../../lib/simple_mem_cache'; import { fetchActionResponses, fetchEndpointActionResponses, @@ -581,6 +581,10 @@ export abstract class ResponseActionsClientImpl implements ResponseActionsClient >( options: ResponseActionsClientWriteActionResponseToEndpointIndexOptions ): Promise> { + // FIXME:PT need to ensure we use a index below that has the proper `namespace` when agent type is Endpoint + // Background: Endpoint responses require that the document be written to an index that has the + // correct `namespace` as defined by the Integration/Agent policy and that logic is not currently implemented. + const doc = this.buildActionResponseEsDoc(options); this.log.debug(() => `Writing response action response:\n${stringify(doc)}`); @@ -594,7 +598,7 @@ export abstract class ResponseActionsClientImpl implements ResponseActionsClient .catch((err) => { throw new ResponseActionsClientError( `Failed to create action response document: ${err.message}`, - err.statusCode ?? 500, + 500, err ); }); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/fleet/endpoint_fleet_services_factory.mocks.ts b/x-pack/plugins/security_solution/server/endpoint/services/fleet/endpoint_fleet_services_factory.mocks.ts index 91119ea3df5fb..302528b024f76 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/fleet/endpoint_fleet_services_factory.mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/fleet/endpoint_fleet_services_factory.mocks.ts @@ -8,6 +8,8 @@ import type { DeeplyMockedKeys } from '@kbn/utility-types-jest'; import type { FleetStartContract } from '@kbn/fleet-plugin/server'; import { createFleetStartContractMock } from '@kbn/fleet-plugin/server/mocks'; +import type { MockedLogger } from '@kbn/logging-mocks'; +import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; import type { SavedObjectsClientFactory } from '../saved_objects'; import type { EndpointFleetServicesFactoryInterface, @@ -24,35 +26,41 @@ export interface EndpointFleetServicesFactoryInterfaceMocked asInternalUser: () => EndpointInternalFleetServicesInterfaceMocked; } -interface CreateEndpointFleetServicesFactoryMockOptions { +export interface CreateEndpointFleetServicesFactoryMockOptions { fleetDependencies: DeeplyMockedKeys; savedObjects: SavedObjectsClientFactory; + logger: MockedLogger; } -export const createEndpointFleetServicesFactoryMock = ( - dependencies: Partial = {} -): { +export interface CreateEndpointFleetServicesFactoryResponse { service: EndpointFleetServicesFactoryInterfaceMocked; dependencies: CreateEndpointFleetServicesFactoryMockOptions; -} => { +} + +export const createEndpointFleetServicesFactoryMock = ( + dependencies: Partial = {} +): CreateEndpointFleetServicesFactoryResponse => { const { fleetDependencies = createFleetStartContractMock(), savedObjects = createSavedObjectsClientFactoryMock().service, + logger = loggingSystemMock.createLogger(), } = dependencies; const serviceFactoryMock = new EndpointFleetServicesFactory( fleetDependencies, - savedObjects + savedObjects, + logger ) as unknown as EndpointFleetServicesFactoryInterfaceMocked; const fleetInternalServicesMocked = serviceFactoryMock.asInternalUser(); jest.spyOn(fleetInternalServicesMocked, 'ensureInCurrentSpace'); + jest.spyOn(fleetInternalServicesMocked, 'getPolicyNamespace'); const asInternalUserSpy = jest.spyOn(serviceFactoryMock, 'asInternalUser'); asInternalUserSpy.mockReturnValue(fleetInternalServicesMocked); return { service: serviceFactoryMock, - dependencies: { fleetDependencies, savedObjects }, + dependencies: { fleetDependencies, savedObjects, logger }, }; }; diff --git a/x-pack/plugins/security_solution/server/endpoint/services/fleet/endpoint_fleet_services_factory.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/fleet/endpoint_fleet_services_factory.test.ts new file mode 100644 index 0000000000000..c1f7ca004e03e --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/fleet/endpoint_fleet_services_factory.test.ts @@ -0,0 +1,181 @@ +/* + * 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 { + CreateEndpointFleetServicesFactoryResponse, + EndpointInternalFleetServicesInterfaceMocked, +} from './endpoint_fleet_services_factory.mocks'; +import { createEndpointFleetServicesFactoryMock } from './endpoint_fleet_services_factory.mocks'; +import { AgentNotFoundError } from '@kbn/fleet-plugin/server'; +import { NotFoundError } from '../../errors'; +import type { AgentPolicy, PackagePolicy } from '@kbn/fleet-plugin/common'; +import { FleetAgentPolicyGenerator } from '../../../../common/endpoint/data_generators/fleet_agent_policy_generator'; +import { FleetPackagePolicyGenerator } from '../../../../common/endpoint/data_generators/fleet_package_policy_generator'; + +describe('EndpointServiceFactory', () => { + let fleetServicesMock: EndpointInternalFleetServicesInterfaceMocked; + let fleetServicesFactoryMock: CreateEndpointFleetServicesFactoryResponse; + + beforeEach(() => { + fleetServicesFactoryMock = createEndpointFleetServicesFactoryMock(); + fleetServicesMock = fleetServicesFactoryMock.service.asInternalUser(); + }); + + it('should return fleet services when `asInternalUser()` is invoked', () => { + expect(Object.keys(fleetServicesMock)).toEqual([ + 'agent', + 'agentPolicy', + 'packages', + 'packagePolicy', + 'savedObjects', + 'endpointPolicyKuery', + 'ensureInCurrentSpace', + 'getPolicyNamespace', + ]); + }); + + describe('#ensureInCurentSpace()', () => { + it('should check agent ids', async () => { + await expect( + fleetServicesMock.ensureInCurrentSpace({ agentIds: ['123'] }) + ).resolves.toBeUndefined(); + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.agentService.asInternalUser.getByIds + ).toHaveBeenCalledWith(['123']); + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.agentPolicyService.getByIds + ).not.toHaveBeenCalled(); + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.packagePolicyService.getByIDs + ).not.toHaveBeenCalled(); + }); + + it('should check integration policy ids', async () => { + await expect( + fleetServicesMock.ensureInCurrentSpace({ integrationPolicyIds: ['123'] }) + ).resolves.toBeUndefined(); + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.agentService.asInternalUser.getByIds + ).not.toHaveBeenCalled(); + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.agentPolicyService.getByIds + ).not.toHaveBeenCalled(); + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.packagePolicyService.getByIDs + ).toHaveBeenCalledWith(expect.anything(), ['123']); + }); + + it('should check agent policy ids', async () => { + await expect( + fleetServicesMock.ensureInCurrentSpace({ agentPolicyIds: ['123'] }) + ).resolves.toBeUndefined(); + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.agentService.asInternalUser.getByIds + ).not.toHaveBeenCalled(); + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.agentPolicyService.getByIds + ).toHaveBeenCalledWith(expect.anything(), ['123']); + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.packagePolicyService.getByIDs + ).not.toHaveBeenCalled(); + }); + + it('should check agent Ids, integration policy id and agent policy ids', async () => { + await expect( + fleetServicesMock.ensureInCurrentSpace({ + integrationPolicyIds: ['123'], + agentIds: ['123'], + agentPolicyIds: ['123'], + }) + ).resolves.toBeUndefined(); + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.agentService.asInternalUser.getByIds + ).toHaveBeenCalledWith(['123']); + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.agentPolicyService.getByIds + ).toHaveBeenCalledWith(expect.anything(), ['123']); + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.packagePolicyService.getByIDs + ).toHaveBeenCalledWith(expect.anything(), ['123']); + }); + + it('should throw error any of the data is not visible in current space', async () => { + fleetServicesFactoryMock.dependencies.fleetDependencies.agentService.asInternalUser.getByIds.mockImplementation( + async () => { + throw new AgentNotFoundError('not found mock'); + } + ); + await expect( + fleetServicesMock.ensureInCurrentSpace({ + integrationPolicyIds: ['123'], + agentIds: ['123'], + agentPolicyIds: ['123'], + }) + ).rejects.toThrowError(NotFoundError); + }); + }); + + describe('#getPolicyNamespace()', () => { + let integrationPolicy: PackagePolicy; + let agentPolicy1: AgentPolicy; + let agentPolicy2: AgentPolicy; + + beforeEach(() => { + const agentPolicyGenerator = new FleetAgentPolicyGenerator('seed'); + const integrationPolicyGenerator = new FleetPackagePolicyGenerator('seed'); + + agentPolicy1 = agentPolicyGenerator.generate({ namespace: 'foo1' }); + agentPolicy2 = agentPolicyGenerator.generate({ namespace: 'foo2' }); + integrationPolicy = integrationPolicyGenerator.generate({ + namespace: undefined, + policy_ids: [agentPolicy1.id, agentPolicy2.id], + }); + + fleetServicesFactoryMock.dependencies.fleetDependencies.packagePolicyService.getByIDs.mockResolvedValue( + [integrationPolicy] + ); + fleetServicesFactoryMock.dependencies.fleetDependencies.agentPolicyService.getByIds.mockResolvedValue( + [agentPolicy1, agentPolicy2] + ); + }); + + it('should return namespace from agent policies if integration policy does not have one defined', async () => { + await expect( + fleetServicesMock.getPolicyNamespace({ + integrationPolicies: [integrationPolicy.id], + }) + ).resolves.toEqual({ + integrationPolicy: { + [integrationPolicy.id]: ['foo1', 'foo2'], + }, + }); + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.agentPolicyService.getByIds + ).toHaveBeenCalledWith(expect.anything(), [agentPolicy1.id, agentPolicy2.id]); + }); + + it('should return namespace from integration policy if defined', async () => { + integrationPolicy.namespace = 'bar'; + + await expect( + fleetServicesMock.getPolicyNamespace({ + integrationPolicies: [integrationPolicy.id], + }) + ).resolves.toEqual({ + integrationPolicy: { + [integrationPolicy.id]: ['bar'], + }, + }); + + // The agentPolicy sevice should not have been called because the package policy has + // a namespace id, so no need. + expect( + fleetServicesFactoryMock.dependencies.fleetDependencies.agentPolicyService.getByIds + ).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/fleet/endpoint_fleet_services_factory.ts b/x-pack/plugins/security_solution/server/endpoint/services/fleet/endpoint_fleet_services_factory.ts index 50e2006272218..bbda061b3ceff 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/fleet/endpoint_fleet_services_factory.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/fleet/endpoint_fleet_services_factory.ts @@ -13,12 +13,14 @@ import type { PackageClient, } from '@kbn/fleet-plugin/server'; import { AgentNotFoundError } from '@kbn/fleet-plugin/server'; -import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common'; -import type { SavedObjectsClientContract } from '@kbn/core/server'; +import type { AgentPolicy } from '@kbn/fleet-plugin/common'; +import { PACKAGE_POLICY_SAVED_OBJECT_TYPE, type PackagePolicy } from '@kbn/fleet-plugin/common'; +import type { Logger, SavedObjectsClientContract } from '@kbn/core/server'; import { AgentPolicyNotFoundError, PackagePolicyNotFoundError, } from '@kbn/fleet-plugin/server/errors'; +import { stringify } from '../../utils/stringify'; import { NotFoundError } from '../../errors'; import type { SavedObjectsClientFactory } from '../saved_objects'; @@ -37,14 +39,21 @@ export interface EndpointFleetServicesInterface { * Will check the data provided to ensure it is visible for the current space. Supports * several types of data (ex. integration policies, agent policies, etc) */ - ensureInCurrentSpace(options: EnsureInCurrentSpaceOptions): Promise; -} + ensureInCurrentSpace( + options: Pick< + CheckInCurrentSpaceOptions, + 'agentIds' | 'integrationPolicyIds' | 'agentPolicyIds' + > + ): Promise; -type EnsureInCurrentSpaceOptions = Partial<{ - agentIds: string[]; - agentPolicyIds: string[]; - integrationPolicyIds: string[]; -}>; + /** + * Retrieves the `namespace` assigned to Endpoint Integration Policies + * @param options + */ + getPolicyNamespace( + options: Pick + ): Promise; +} export interface EndpointInternalFleetServicesInterface extends EndpointFleetServicesInterface { savedObjects: SavedObjectsClientFactory; @@ -60,7 +69,8 @@ export interface EndpointFleetServicesFactoryInterface { export class EndpointFleetServicesFactory implements EndpointFleetServicesFactoryInterface { constructor( private readonly fleetDependencies: FleetStartContract, - private readonly savedObjects: SavedObjectsClientFactory + private readonly savedObjects: SavedObjectsClientFactory, + private readonly logger: Logger ) {} asInternalUser(spaceId?: string): EndpointInternalFleetServicesInterface { @@ -85,31 +95,31 @@ export class EndpointFleetServicesFactory implements EndpointFleetServicesFactor if (!soClient) { soClient = this.savedObjects.createInternalScopedSoClient({ spaceId }); } + return checkInCurrentSpace({ + soClient, + agentService: agent, + agentPolicyService: agentPolicy, + packagePolicyService: packagePolicy, + integrationPolicyIds, + agentPolicyIds, + agentIds, + }); + }; + + const getPolicyNamespace: EndpointFleetServicesInterface['getPolicyNamespace'] = async ( + options + ) => { + if (!soClient) { + soClient = this.savedObjects.createInternalScopedSoClient({ spaceId }); + } - const handlePromiseErrors = (err: Error): never => { - // We wrap the error with our own Error class so that the API can property return a 404 - if ( - err instanceof AgentNotFoundError || - err instanceof AgentPolicyNotFoundError || - err instanceof PackagePolicyNotFoundError - ) { - throw new NotFoundError(err.message, err); - } - - throw err; - }; - - await Promise.all([ - agentIds.length ? agent.getByIds(agentIds).catch(handlePromiseErrors) : null, - - agentPolicyIds.length - ? agentPolicy.getByIds(soClient, agentPolicyIds).catch(handlePromiseErrors) - : null, - - integrationPolicyIds.length - ? packagePolicy.getByIDs(soClient, integrationPolicyIds).catch(handlePromiseErrors) - : null, - ]); + return fetchEndpointPolicyNamespace({ + ...options, + soClient, + logger: this.logger, + packagePolicyService: packagePolicy, + agentPolicyService: agentPolicy, + }); }; return { @@ -123,6 +133,144 @@ export class EndpointFleetServicesFactory implements EndpointFleetServicesFactor endpointPolicyKuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: "endpoint"`, ensureInCurrentSpace, + getPolicyNamespace, }; } } + +interface CheckInCurrentSpaceOptions { + soClient: SavedObjectsClientContract; + agentService: AgentClient; + agentPolicyService: AgentPolicyServiceInterface; + packagePolicyService: PackagePolicyClient; + agentIds?: string[]; + agentPolicyIds?: string[]; + integrationPolicyIds?: string[]; +} + +/** + * Checks if data provided (integration policies, agent policies and/or agentIds) are visible in + * current space + * + * @param soClient + * @param agentService + * @param agentPolicyService + * @param packagePolicyService + * @param integrationPolicyIds + * @param agentPolicyIds + * @param agentIds + * + * @throws NotFoundError + */ +const checkInCurrentSpace = async ({ + soClient, + agentService, + agentPolicyService, + packagePolicyService, + integrationPolicyIds = [], + agentPolicyIds = [], + agentIds = [], +}: CheckInCurrentSpaceOptions): Promise => { + const handlePromiseErrors = (err: Error): never => { + // We wrap the error with our own Error class so that the API can property return a 404 + if ( + err instanceof AgentNotFoundError || + err instanceof AgentPolicyNotFoundError || + err instanceof PackagePolicyNotFoundError + ) { + throw new NotFoundError(err.message, err); + } + + throw err; + }; + + await Promise.all([ + agentIds.length ? agentService.getByIds(agentIds).catch(handlePromiseErrors) : null, + + agentPolicyIds.length + ? agentPolicyService.getByIds(soClient, agentPolicyIds).catch(handlePromiseErrors) + : null, + + integrationPolicyIds.length + ? packagePolicyService.getByIDs(soClient, integrationPolicyIds).catch(handlePromiseErrors) + : null, + ]); +}; + +interface FetchEndpointPolicyNamespaceOptions { + logger: Logger; + soClient: SavedObjectsClientContract; + packagePolicyService: PackagePolicyClient; + agentPolicyService: AgentPolicyServiceInterface; + /** A list of integration policies IDs */ + integrationPolicies: string[]; +} + +export interface FetchEndpointPolicyNamespaceResponse { + integrationPolicy: Record; +} + +const fetchEndpointPolicyNamespace = async ({ + logger, + soClient, + packagePolicyService, + agentPolicyService, + integrationPolicies, +}: FetchEndpointPolicyNamespaceOptions): Promise => { + const response: FetchEndpointPolicyNamespaceResponse = { + integrationPolicy: {}, + }; + const agentPolicyIdsToRetrieve = new Set(); + const retrievedIntegrationPolicies: Record = {}; + const retrievedAgentPolicies: Record = {}; + + if (integrationPolicies.length > 0) { + logger.debug( + () => `Retrieving package policies from fleet for:\n${stringify(integrationPolicies)}` + ); + const packagePolicies = + (await packagePolicyService.getByIDs(soClient, integrationPolicies)) ?? []; + + logger.trace(() => `Fleet package policies retrieved:\n${stringify(packagePolicies)}`); + + for (const packagePolicy of packagePolicies) { + retrievedIntegrationPolicies[packagePolicy.id] = packagePolicy; + + // Integration policy does not have an explicit namespace, which means it + // inherits it from the associated agent policies, so lets retrieve those + if (!packagePolicy.namespace) { + packagePolicy.policy_ids.forEach((agentPolicyId) => { + agentPolicyIdsToRetrieve.add(agentPolicyId); + }); + } + } + } + + if (agentPolicyIdsToRetrieve.size > 0) { + const ids = Array.from(agentPolicyIdsToRetrieve); + + logger.debug(() => `Retrieving agent policies from fleet for:\n${stringify(ids)}`); + + const agentPolicies = await agentPolicyService.getByIds(soClient, ids); + + logger.trace(() => `Fleet agent policies retrieved:\n${stringify(agentPolicies)}`); + + for (const agentPolicy of agentPolicies) { + retrievedAgentPolicies[agentPolicy.id] = agentPolicy; + } + } + + for (const integrationPolicyId of integrationPolicies) { + const integrationPolicyNamespace = retrievedIntegrationPolicies[integrationPolicyId].namespace; + + response.integrationPolicy[integrationPolicyId] = integrationPolicyNamespace + ? [integrationPolicyNamespace] + : retrievedIntegrationPolicies[integrationPolicyId].policy_ids.map((agentPolicyId) => { + return retrievedAgentPolicies[agentPolicyId].namespace; + }); + } + + logger.debug(() => `Policy namespaces:\n${stringify(response)}`); + + return response; +}; diff --git a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts index 6accb29354ee4..80337d1a927b8 100644 --- a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts +++ b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts @@ -7,6 +7,7 @@ import type { ExceptionListSchema } from '@kbn/securitysolution-io-ts-list-types'; +import type { ElasticsearchClientMock } from '@kbn/core/server/mocks'; import { elasticsearchServiceMock, httpServerMock, @@ -38,7 +39,10 @@ import { import { requestContextMock } from '../lib/detection_engine/routes/__mocks__'; import { requestContextFactoryMock } from '../request_context_factory.mock'; import type { EndpointAppContextServiceStartContract } from '../endpoint/endpoint_app_context_services'; -import { createMockEndpointAppContextServiceStartContract } from '../endpoint/mocks'; +import { + createMockEndpointAppContextService, + createMockEndpointAppContextServiceStartContract, +} from '../endpoint/mocks'; import { licenseMock } from '@kbn/licensing-plugin/common/licensing.mock'; import { LicenseService } from '../../common/license'; import { Subject } from 'rxjs'; @@ -73,16 +77,30 @@ import { createProductFeaturesServiceMock } from '../lib/product_features_servic import * as moment from 'moment'; import type { PostAgentPolicyCreateCallback, + PostPackagePolicyPostCreateCallback, PutPackagePolicyUpdateCallback, } from '@kbn/fleet-plugin/server/types'; import type { EndpointMetadataService } from '../endpoint/services/metadata'; import { createEndpointMetadataServiceTestContextMock } from '../endpoint/services/metadata/mocks'; +import { createPolicyDataStreamsIfNeeded as _createPolicyDataStreamsIfNeeded } from './handlers/create_policy_datastreams'; jest.mock('uuid', () => ({ v4: (): string => 'NEW_UUID', })); -describe('ingest_integration tests ', () => { +jest.mock('./handlers/create_policy_datastreams', () => { + const actualModule = jest.requireActual('./handlers/create_policy_datastreams'); + + return { + ...actualModule, + createPolicyDataStreamsIfNeeded: jest.fn(async () => {}), + }; +}); + +const createPolicyDataStreamsIfNeededMock = + _createPolicyDataStreamsIfNeeded as unknown as jest.Mock; + +describe('Fleet integrations', () => { let endpointAppContextStartContract: EndpointAppContextServiceStartContract; let req: KibanaRequest; let ctx: ReturnType; @@ -350,10 +368,20 @@ describe('ingest_integration tests ', () => { }); describe('package policy post create callback', () => { - const soClient = savedObjectsClientMock.create(); - const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - const callback = getPackagePolicyPostCreateCallback(logger, exceptionListClient); - const policyConfig = generator.generatePolicyPackagePolicy() as PackagePolicy; + let soClient: ReturnType; + let esClient: ElasticsearchClientMock; + let callback: PostPackagePolicyPostCreateCallback; + let policyConfig: PackagePolicy; + let endpointAppContextServiceMock: ReturnType; + + beforeEach(() => { + soClient = savedObjectsClientMock.create(); + esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + endpointAppContextServiceMock = createMockEndpointAppContextService(); + endpointAppContextServiceMock.getExceptionListsClient.mockReturnValue(exceptionListClient); + callback = getPackagePolicyPostCreateCallback(endpointAppContextServiceMock); + policyConfig = generator.generatePolicyPackagePolicy() as PackagePolicy; + }); it('should create the Endpoint Event Filters List and add the correct Event Filters List Item attached to the policy given nonInteractiveSession parameter on integration config eventFilters', async () => { const integrationConfig = { @@ -374,11 +402,11 @@ describe('ingest_integration tests ', () => { req ); - expect(await exceptionListClient.createExceptionList).toHaveBeenCalledWith( + expect(exceptionListClient.createExceptionList).toHaveBeenCalledWith( expect.objectContaining({ listId: ENDPOINT_EVENT_FILTERS_LIST_ID }) ); - expect(await exceptionListClient.createExceptionListItem).toHaveBeenCalledWith( + expect(exceptionListClient.createExceptionListItem).toHaveBeenCalledWith( expect.objectContaining({ listId: ENDPOINT_EVENT_FILTERS_LIST_ID, tags: [`policy:${postCreatedPolicyConfig.id}`], @@ -413,14 +441,20 @@ describe('ingest_integration tests ', () => { req ); - expect(await exceptionListClient.createExceptionList).not.toHaveBeenCalled(); + expect(exceptionListClient.createExceptionList).not.toHaveBeenCalled(); - expect(await exceptionListClient.createExceptionListItem).not.toHaveBeenCalled(); + expect(exceptionListClient.createExceptionListItem).not.toHaveBeenCalled(); expect(postCreatedPolicyConfig.inputs[0]!.config!.integration_config.value).toEqual( integrationConfig ); }); + + it('should call `createPolicyDatastreamsIfNeeded`', async () => { + await callback(policyConfig, soClient, esClient, requestContextMock.convertContext(ctx), req); + + expect(createPolicyDataStreamsIfNeededMock).toHaveBeenCalled(); + }); }); describe('agent policy update callback', () => { diff --git a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts index 71c935e720511..54f1ce8cc7e01 100644 --- a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts +++ b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts @@ -27,8 +27,13 @@ import type { InfoResponse } from '@elastic/elasticsearch/lib/api/types'; import { ProductFeatureSecurityKey } from '@kbn/security-solution-features/keys'; import type { PostAgentPolicyCreateCallback, + PostAgentPolicyPostUpdateCallback, PostAgentPolicyUpdateCallback, + PutPackagePolicyPostUpdateCallback, } from '@kbn/fleet-plugin/server/types'; +import type { EndpointInternalFleetServicesInterface } from '../endpoint/services/fleet'; +import type { EndpointAppContextService } from '../endpoint/endpoint_app_context_services'; +import { createPolicyDataStreamsIfNeeded } from './handlers/create_policy_datastreams'; import { updateAntivirusRegistrationEnabled } from '../../common/endpoint/utils/update_antivirus_registration_enabled'; import { validatePolicyAgainstProductFeatures } from './handlers/validate_policy_against_product_features'; import { validateEndpointPackagePolicy } from './handlers/validate_endpoint_package_policy'; @@ -62,6 +67,32 @@ const isEndpointPackagePolicy = ( return packagePolicy.package?.name === 'endpoint'; }; +const getEndpointPolicyForAgentPolicy = async ( + fleetServices: EndpointInternalFleetServicesInterface, + agentPolicy: AgentPolicy +): Promise => { + let agentPolicyIntegrations: PackagePolicy[] | undefined = agentPolicy.package_policies; + + if (!agentPolicyIntegrations) { + const fullAgentPolicy = await fleetServices.agentPolicy.get( + fleetServices.savedObjects.createInternalScopedSoClient(), + agentPolicy.id, + true + ); + agentPolicyIntegrations = fullAgentPolicy?.package_policies ?? []; + } + + if (Array.isArray(agentPolicyIntegrations)) { + for (const integrationPolicy of agentPolicyIntegrations) { + if (isEndpointPackagePolicy(integrationPolicy)) { + return integrationPolicy; + } + } + } + + return undefined; +}; + const shouldUpdateMetaValues = ( endpointPackagePolicy: PolicyConfig, currentLicenseType: string, @@ -279,16 +310,47 @@ export const getPackagePolicyUpdateCallback = ( }; }; +export const getPackagePolicyPostUpdateCallback = ( + endpointServices: EndpointAppContextService +): PutPackagePolicyPostUpdateCallback => { + const logger = endpointServices.createLogger('endpointPackagePolicyPostUpdate'); + + return async (packagePolicy) => { + if (!isEndpointPackagePolicy(packagePolicy)) { + return packagePolicy; + } + + logger.debug(`Processing endpoint integration policy (post update): ${packagePolicy.id}`); + + // The check below will run in the background - we don't need to wait for it + createPolicyDataStreamsIfNeeded({ + endpointServices, + endpointPolicyIds: [packagePolicy.id], + }).catch(() => {}); // to silence @typescript-eslint/no-floating-promises + + return packagePolicy; + }; +}; + export const getPackagePolicyPostCreateCallback = ( - logger: Logger, - exceptionsClient: ExceptionListClient | undefined + endpointServices: EndpointAppContextService ): PostPackagePolicyPostCreateCallback => { + const logger = endpointServices.createLogger('endpointPolicyPostCreate'); + const exceptionsClient = endpointServices.getExceptionListsClient(); + return async (packagePolicy: PackagePolicy): Promise => { // We only care about Endpoint package policies if (!exceptionsClient || !isEndpointPackagePolicy(packagePolicy)) { return packagePolicy; } + // Check and create internal datastreams for this policy if needed. + // NOTE: we don't need for it to complete here, thus no `await`. + createPolicyDataStreamsIfNeeded({ + endpointServices, + endpointPolicyIds: [packagePolicy.id], + }).catch(() => {}); // to silence @typescript-eslint/no-floating-promises + const integrationConfig = packagePolicy?.inputs[0]?.config?.integration_config; if (integrationConfig && integrationConfig?.value?.eventFilters !== undefined) { @@ -353,6 +415,31 @@ export const getAgentPolicyUpdateCallback = ( }; }; +export const getAgentPolicyPostUpdateCallback = ( + endpointServices: EndpointAppContextService +): PostAgentPolicyPostUpdateCallback => { + const logger = endpointServices.createLogger('endpointPolicyPostUpdate'); + + return async (agentPolicy) => { + const fleetServices = endpointServices.getInternalFleetServices(); + const endpointPolicy = await getEndpointPolicyForAgentPolicy(fleetServices, agentPolicy); + + if (!endpointPolicy) { + return agentPolicy; + } + + logger.debug(`Processing post-update to Fleet agent policy: [${agentPolicy.id}]`); + + // We don't need to `await` for this function to execute. It can be done in the background + createPolicyDataStreamsIfNeeded({ + endpointServices, + endpointPolicyIds: [endpointPolicy.id], + }).catch(() => {}); // to silence @typescript-eslint/no-floating-promises + + return agentPolicy; + }; +}; + export const getPackagePolicyDeleteCallback = ( exceptionsClient: ExceptionListClient | undefined, savedObjectsClient: SavedObjectsClientContract | undefined diff --git a/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_policy_datastreams.test.ts b/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_policy_datastreams.test.ts new file mode 100644 index 0000000000000..0efaa5516a6f9 --- /dev/null +++ b/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_policy_datastreams.test.ts @@ -0,0 +1,119 @@ +/* + * 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 { createMockEndpointAppContextService } from '../../endpoint/mocks'; +import type { ElasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; +import type { FetchEndpointPolicyNamespaceResponse } from '../../endpoint/services/fleet'; +import { createPolicyDataStreamsIfNeeded } from './create_policy_datastreams'; + +describe('createPolicyDataStreamsIfNeeded()', () => { + let endpointServicesMock: ReturnType; + let esClientMock: ElasticsearchClientMock; + let policyNamespacesMock: FetchEndpointPolicyNamespaceResponse; + + beforeEach(() => { + endpointServicesMock = createMockEndpointAppContextService(); + + esClientMock = endpointServicesMock.getInternalEsClient() as ElasticsearchClientMock; + esClientMock.indices.exists.mockResolvedValue(false); + + policyNamespacesMock = { integrationPolicy: { '123': ['foo1', 'foo2'] } }; + ( + endpointServicesMock.getInternalFleetServices().getPolicyNamespace as jest.Mock + ).mockResolvedValue(policyNamespacesMock); + }); + + afterEach(() => { + createPolicyDataStreamsIfNeeded.cache.deleteAll(); + }); + + it('should create datastreams if they do not exist', async () => { + await createPolicyDataStreamsIfNeeded({ + endpointServices: endpointServicesMock, + endpointPolicyIds: ['123'], + }); + + expect(esClientMock.indices.createDataStream).toHaveBeenCalledTimes(4); + [ + '.logs-endpoint.diagnostic.collection-foo1', + '.logs-endpoint.diagnostic.collection-foo2', + '.logs-endpoint.action.responses-foo1', + '.logs-endpoint.action.responses-foo2', + ].forEach((indexName) => { + expect(esClientMock.indices.createDataStream).toHaveBeenCalledWith({ + name: indexName, + }); + }); + }); + + it('should not create datastream if they already exist', async () => { + esClientMock.indices.exists.mockImplementation(async (options) => { + return ( + options.index === '.logs-endpoint.action.responses-foo1' || + options.index === '.logs-endpoint.diagnostic.collection-foo1' + ); + }); + + await createPolicyDataStreamsIfNeeded({ + endpointServices: endpointServicesMock, + endpointPolicyIds: ['123'], + }); + + expect(esClientMock.indices.createDataStream).toHaveBeenCalledTimes(2); + ['.logs-endpoint.diagnostic.collection-foo2', '.logs-endpoint.action.responses-foo2'].forEach( + (indexName) => { + expect(esClientMock.indices.createDataStream).toHaveBeenCalledWith({ + name: indexName, + }); + } + ); + }); + + it('should create heartbeat index when running in serverless', async () => { + (endpointServicesMock.isServerless as jest.Mock).mockReturnValue(true); + await createPolicyDataStreamsIfNeeded({ + endpointServices: endpointServicesMock, + endpointPolicyIds: ['123'], + }); + + expect(esClientMock.indices.createDataStream).toHaveBeenCalledTimes(6); + [ + '.logs-endpoint.diagnostic.collection-foo1', + '.logs-endpoint.diagnostic.collection-foo2', + '.logs-endpoint.action.responses-foo1', + '.logs-endpoint.action.responses-foo2', + '.logs-endpoint.heartbeat-foo1', + '.logs-endpoint.heartbeat-foo2', + ].forEach((indexName) => { + expect(esClientMock.indices.createDataStream).toHaveBeenCalledWith({ + name: indexName, + }); + }); + }); + + it('should not call ES if index existence was already checked', async () => { + createPolicyDataStreamsIfNeeded.cache.set('.logs-endpoint.action.responses-foo1', true); + await createPolicyDataStreamsIfNeeded({ + endpointServices: endpointServicesMock, + endpointPolicyIds: ['123'], + }); + + expect(esClientMock.indices.exists).not.toHaveBeenCalledWith({ + index: '.logs-endpoint.action.responses-foo1', + }); + expect(esClientMock.indices.createDataStream).toHaveBeenCalledTimes(3); + [ + '.logs-endpoint.diagnostic.collection-foo1', + '.logs-endpoint.diagnostic.collection-foo2', + '.logs-endpoint.action.responses-foo2', + ].forEach((indexName) => { + expect(esClientMock.indices.createDataStream).toHaveBeenCalledWith({ + name: indexName, + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_policy_datastreams.ts b/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_policy_datastreams.ts new file mode 100644 index 0000000000000..93fec3526a7b3 --- /dev/null +++ b/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_policy_datastreams.ts @@ -0,0 +1,159 @@ +/* + * 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 pMap from 'p-map'; +import type { EndpointAppContextService } from '../../endpoint/endpoint_app_context_services'; +import { catchAndWrapError } from '../../endpoint/utils'; +import type { SimpleMemCacheInterface } from '../../endpoint/lib/simple_mem_cache'; +import { SimpleMemCache } from '../../endpoint/lib/simple_mem_cache'; +import { + ENDPOINT_ACTION_RESPONSES_DS, + ENDPOINT_HEARTBEAT_INDEX_PATTERN, +} from '../../../common/endpoint/constants'; +import { DEFAULT_DIAGNOSTIC_INDEX } from '../../lib/telemetry/constants'; +import { stringify } from '../../endpoint/utils/stringify'; + +const buildIndexNameWithNamespace = ( + indexNamePrefixOrPattern: string, + namespace: string +): string => { + if (indexNamePrefixOrPattern.endsWith('*')) { + const hasDash = indexNamePrefixOrPattern.endsWith('-*'); + return `${indexNamePrefixOrPattern.substring(0, indexNamePrefixOrPattern.length - 1)}${ + hasDash ? '' : '-' + }${namespace}`; + } + + return `${indexNamePrefixOrPattern}${ + indexNamePrefixOrPattern.endsWith('-') ? '' : '-' + }${namespace}`; +}; + +const cache = new SimpleMemCache({ + // Cache of created Datastreams last for 12h, at which point it is checked again. + // This is just a safeguard case (for whatever reason) the index is deleted + // 1.8e+7 === hours + ttl: 1.8e7, +}); + +interface PolicyDataStreamsCreator { + (options: CreatePolicyDataStreamsOptions): Promise; + cache: SimpleMemCacheInterface; +} + +export interface CreatePolicyDataStreamsOptions { + endpointServices: EndpointAppContextService; + endpointPolicyIds: string[]; +} + +/** + * Ensures that the DOT index Datastreams necessary to support Elastic Defend are crated (prior to + * endpoint writing data to them) + */ +export const createPolicyDataStreamsIfNeeded: PolicyDataStreamsCreator = async ({ + endpointServices, + endpointPolicyIds, +}: CreatePolicyDataStreamsOptions): Promise => { + const logger = endpointServices.createLogger('endpointPolicyDatastreamCreator'); + const esClient = endpointServices.getInternalEsClient(); + + logger.debug( + () => + `Checking if datastreams need to be created for Endpoint integration policy [${endpointPolicyIds.join( + ', ' + )}]` + ); + + // FIXME:PT Need to ensure that the datastreams are created in all associated space ids that the policy is shared with + // This can be deferred to activity around support of Spaces - team issue: 8199 (epic) + // We might need to do much here other than to ensure we can access all policies across all spaces in order to get the namespace value + + const fleetServices = endpointServices.getInternalFleetServices(); + const policyNamespaces = await fleetServices.getPolicyNamespace({ + integrationPolicies: endpointPolicyIds, + }); + const indexesCreated: string[] = []; + const createErrors: string[] = []; + const indicesToCreate: string[] = Object.values(policyNamespaces.integrationPolicy).reduce< + string[] + >((acc, namespaceList) => { + for (const namespace of namespaceList) { + acc.push( + buildIndexNameWithNamespace(DEFAULT_DIAGNOSTIC_INDEX, namespace), + buildIndexNameWithNamespace(ENDPOINT_ACTION_RESPONSES_DS, namespace) + ); + + if (endpointServices.isServerless()) { + acc.push(buildIndexNameWithNamespace(ENDPOINT_HEARTBEAT_INDEX_PATTERN, namespace)); + } + } + + return acc; + }, []); + + const processesDatastreamIndex = async (datastreamIndexName: string): Promise => { + if (cache.get(datastreamIndexName)) { + return; + } + + const doesDataStreamAlreadyExist = await esClient.indices + .exists({ index: datastreamIndexName }) + .catch(catchAndWrapError); + + if (doesDataStreamAlreadyExist) { + cache.set(datastreamIndexName, true); + return; + } + + await esClient.indices + .createDataStream({ name: datastreamIndexName }) + .then(() => { + indexesCreated.push(datastreamIndexName); + cache.set(datastreamIndexName, true); + }) + .catch((err) => { + // It's possible that between the `.exists()` check and this `.createDataStream()` that + // the index could have been created. If that's the case, then just ignore the error. + if (err.body?.error?.type === 'resource_already_exists_exception') { + cache.set(datastreamIndexName, true); + return; + } + + createErrors.push( + `Attempt to create datastream [${datastreamIndexName}] failed:\n${stringify( + err.body?.error ?? err + )}` + ); + }); + }; + + logger.debug( + () => + `Checking if the following datastream(s) need to be created:\n ${indicesToCreate.join( + '\n ' + )}` + ); + + await pMap(indicesToCreate, processesDatastreamIndex, { concurrency: 10 }); + + if (indexesCreated.length > 0) { + logger.info( + `Datastream(s) created in support of Elastic Defend policy [${endpointPolicyIds.join( + ', ' + )}]:\n ${indexesCreated.join('\n ')}` + ); + } else if (createErrors.length === 0) { + logger.debug(() => `Nothing to do. Datastreams already exist`); + } + + if (createErrors.length > 0) { + logger.error( + `${createErrors.length} errors encountered:\n${createErrors.join('\n--------\n')}` + ); + } +}; +createPolicyDataStreamsIfNeeded.cache = cache; From c8be1e26d0ab24f9efd0e7efef4d76957fb9bea0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Fri, 25 Oct 2024 15:54:59 -0400 Subject: [PATCH 049/135] Mark connector param validation failures as user errors (#197812) Resolves https://github.com/elastic/response-ops-team/issues/255 In this PR, I'm changing the type of error thrown when connector parameter validation fails so it indicates it's a user type of error. This will allow us to exclude these errors from our serverless monitoring given the users define the parameters the connectors receive when they run. Mainly via alerting rule mustache templates, which are easy to render empty strings and such. --- .../actions/server/lib/action_executor.test.ts | 2 +- .../actions/server/lib/action_executor.ts | 11 +++++++++++ .../tests/actions/connector_types/bedrock.ts | 4 ++-- .../actions/connector_types/cases_webhook.ts | 10 +++++----- .../tests/actions/connector_types/d3security.ts | 4 ++-- .../tests/actions/connector_types/gemini.ts | 4 ++-- .../group2/tests/actions/connector_types/jira.ts | 16 ++++++++-------- .../tests/actions/connector_types/openai.ts | 4 ++-- .../actions/connector_types/servicenow_itom.ts | 6 +++--- .../actions/connector_types/servicenow_itsm.ts | 12 ++++++------ .../actions/connector_types/servicenow_sir.ts | 12 ++++++------ .../tests/actions/connector_types/swimlane.ts | 8 ++++---- .../tests/actions/connector_types/thehive.ts | 4 ++-- .../tests/actions/sub_action_framework/index.ts | 2 +- 14 files changed, 55 insertions(+), 44 deletions(-) diff --git a/x-pack/plugins/actions/server/lib/action_executor.test.ts b/x-pack/plugins/actions/server/lib/action_executor.test.ts index 6e4ec1b69c876..76354dc882dd9 100644 --- a/x-pack/plugins/actions/server/lib/action_executor.test.ts +++ b/x-pack/plugins/actions/server/lib/action_executor.test.ts @@ -851,7 +851,7 @@ describe('Action Executor', () => { status: 'error', retry: false, message: `error validating action params: [param1]: expected value of type [string] but got [undefined]`, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); diff --git a/x-pack/plugins/actions/server/lib/action_executor.ts b/x-pack/plugins/actions/server/lib/action_executor.ts index a636f4b41566c..b0f9db0ef700c 100644 --- a/x-pack/plugins/actions/server/lib/action_executor.ts +++ b/x-pack/plugins/actions/server/lib/action_executor.ts @@ -685,6 +685,17 @@ function validateAction( try { validatedParams = validateParams(actionType, params, validatorServices); + } catch (err) { + throw new ActionExecutionError(err.message, ActionExecutionErrorReason.Validation, { + actionId, + status: 'error', + message: err.message, + retry: !!taskInfo, + errorSource: TaskErrorSource.USER, + }); + } + + try { validatedConfig = validateConfig(actionType, config, validatorServices); validatedSecrets = validateSecrets(actionType, secrets, validatorServices); if (actionType.validate?.connector) { diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/bedrock.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/bedrock.ts index 3bc7b665e2c2e..ca8ae72ee06ce 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/bedrock.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/bedrock.ts @@ -267,7 +267,7 @@ export default function bedrockTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); @@ -620,7 +620,7 @@ export default function bedrockTest({ getService }: FtrProviderContext) { expect(body).to.eql({ status: 'error', connector_id: bedrockActionId, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/cases_webhook.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/cases_webhook.ts index fcf0f2d84e755..72f726d18b0e1 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/cases_webhook.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/cases_webhook.ts @@ -272,7 +272,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: [subAction]: expected value to equal [pushToService]', - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); @@ -291,7 +291,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: [subActionParams.incident.title]: expected value of type [string] but got [undefined]', - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); @@ -318,7 +318,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: [subActionParams.incident.title]: expected value of type [string] but got [undefined]', - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); @@ -347,7 +347,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: [subActionParams.comments]: types that failed validation:\n- [subActionParams.comments.0.0.commentId]: expected value of type [string] but got [undefined]\n- [subActionParams.comments.1]: expected value to equal [null]', - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); @@ -375,7 +375,7 @@ export default function casesWebhookTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: [subActionParams.comments]: types that failed validation:\n- [subActionParams.comments.0.0.comment]: expected value of type [string] but got [undefined]\n- [subActionParams.comments.1]: expected value to equal [null]', - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/d3security.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/d3security.ts index 72cea764d0165..17785ec704a55 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/d3security.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/d3security.ts @@ -183,7 +183,7 @@ export default function d3SecurityTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); @@ -311,7 +311,7 @@ export default function d3SecurityTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/gemini.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/gemini.ts index 8d235c15dc21c..469929591e448 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/gemini.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/gemini.ts @@ -243,7 +243,7 @@ export default function geminiTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); @@ -378,7 +378,7 @@ export default function geminiTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/jira.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/jira.ts index d41f8f1fcad71..92c7f5aae4609 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/jira.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/jira.ts @@ -262,7 +262,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subAction]: expected value to equal [pushToService]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); @@ -281,7 +281,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.summary]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); @@ -308,7 +308,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.summary]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); @@ -337,7 +337,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.commentId]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); @@ -365,7 +365,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.comment]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); @@ -394,7 +394,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.labels]: types that failed validation:\n - [subActionParams.incident.labels.0.0]: The label label with spaces cannot contain spaces\n - [subActionParams.incident.labels.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); @@ -430,7 +430,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.otherFields]: types that failed validation:\n - [subActionParams.incident.otherFields.0]: A maximum of 20 fields in otherFields can be defined at a time.\n - [subActionParams.incident.otherFields.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); @@ -461,7 +461,7 @@ export default function jiraTest({ getService }: FtrProviderContext) { retry: false, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.otherFields]: types that failed validation:\n - [subActionParams.incident.otherFields.0.key("summary")]: The following properties cannot be defined inside otherFields: summary.\n - [subActionParams.incident.otherFields.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [issueTypes]\n- [5.subAction]: expected value to equal [fieldsByIssueType]\n- [6.subAction]: expected value to equal [issues]\n- [7.subAction]: expected value to equal [issue]', - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/openai.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/openai.ts index 8a47b6a882456..a7774618bcc5a 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/openai.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/openai.ts @@ -251,7 +251,7 @@ export default function genAiTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); @@ -483,7 +483,7 @@ export default function genAiTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itom.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itom.ts index c189580951495..09f6f14d4616b 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itom.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itom.ts @@ -440,7 +440,7 @@ export default function serviceNowITOMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [addEvent]\n- [1.subAction]: expected value to equal [getChoices]', }); @@ -459,7 +459,7 @@ export default function serviceNowITOMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [addEvent]\n- [1.subAction]: expected value to equal [getChoices]', }); @@ -482,7 +482,7 @@ export default function serviceNowITOMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [addEvent]\n- [1.subActionParams.fields]: expected value of type [array] but got [undefined]', }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itsm.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itsm.ts index 1f4f01db068d9..02e94e7548534 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itsm.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_itsm.ts @@ -476,7 +476,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subAction]: expected value to equal [pushToService]\n- [4.subAction]: expected value to equal [getChoices]\n- [5.subAction]: expected value to equal [closeIncident]', }); @@ -495,7 +495,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.short_description]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [getChoices]\n- [5.subAction]: expected value to equal [closeIncident]', }); @@ -519,7 +519,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.short_description]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [getChoices]\n- [5.subAction]: expected value to equal [closeIncident]', }); @@ -547,7 +547,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.commentId]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [getChoices]\n- [5.subAction]: expected value to equal [closeIncident]', }); @@ -575,7 +575,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.comment]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [getChoices]\n- [5.subAction]: expected value to equal [closeIncident]', }); @@ -673,7 +673,7 @@ export default function serviceNowITSMTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subAction]: expected value to equal [pushToService]\n- [4.subActionParams.fields]: expected value of type [array] but got [undefined]\n- [5.subAction]: expected value to equal [closeIncident]', }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_sir.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_sir.ts index 527ea53bbd1d5..713721063b40f 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_sir.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/servicenow_sir.ts @@ -489,7 +489,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subAction]: expected value to equal [pushToService]\n- [4.subAction]: expected value to equal [getChoices]', }); @@ -508,7 +508,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.short_description]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [getChoices]', }); @@ -532,7 +532,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.incident.short_description]: expected value of type [string] but got [undefined]\n- [4.subAction]: expected value to equal [getChoices]', }); @@ -560,7 +560,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.commentId]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [getChoices]', }); @@ -588,7 +588,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subActionParams.comments]: types that failed validation:\n - [subActionParams.comments.0.0.comment]: expected value of type [string] but got [undefined]\n - [subActionParams.comments.1]: expected value to equal [null]\n- [4.subAction]: expected value to equal [getChoices]', }); @@ -686,7 +686,7 @@ export default function serviceNowSIRTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: types that failed validation:\n- [0.subAction]: expected value to equal [getFields]\n- [1.subAction]: expected value to equal [getIncident]\n- [2.subAction]: expected value to equal [handshake]\n- [3.subAction]: expected value to equal [pushToService]\n- [4.subActionParams.fields]: expected value of type [array] but got [undefined]', }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/swimlane.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/swimlane.ts index 93c2e4bc973af..cd09cd453d3a5 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/swimlane.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/swimlane.ts @@ -351,7 +351,7 @@ export default function swimlaneTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: [subAction]: expected value to equal [pushToService]', }); @@ -377,7 +377,7 @@ export default function swimlaneTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: [subActionParams]: expected a plain object value, but found [null] instead.', }); @@ -402,7 +402,7 @@ export default function swimlaneTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: [subActionParams.comments]: types that failed validation:\n- [subActionParams.comments.0.0.commentId]: expected value of type [string] but got [undefined]\n- [subActionParams.comments.1]: expected value to equal [null]', }); @@ -427,7 +427,7 @@ export default function swimlaneTest({ getService }: FtrProviderContext) { connector_id: simulatedActionId, status: 'error', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, message: 'error validating action params: [subActionParams.comments]: types that failed validation:\n- [subActionParams.comments.0.0.comment]: expected value of type [string] but got [undefined]\n- [subActionParams.comments.1]: expected value to equal [null]', }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/thehive.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/thehive.ts index e1bf048606bc1..a6bd8531327fc 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/thehive.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/thehive.ts @@ -201,7 +201,7 @@ export default function theHiveTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); @@ -320,7 +320,7 @@ export default function theHiveTest({ getService }: FtrProviderContext) { message: 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', retry: false, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); }); }); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/sub_action_framework/index.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/sub_action_framework/index.ts index b504f8204c4aa..6f5e51845f667 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/sub_action_framework/index.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/sub_action_framework/index.ts @@ -218,7 +218,7 @@ export default function createActionTests({ getService }: FtrProviderContext) { status: 'error', retry: false, connector_id: res.body.id, - errorSource: TaskErrorSource.FRAMEWORK, + errorSource: TaskErrorSource.USER, }); } }); From 1065bbf03ca0583935d9b482939823e6b46c3c52 Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Fri, 25 Oct 2024 15:37:23 -0500 Subject: [PATCH 050/135] [Security Solution][Notes] - fix createdBy filter for notes management page (#197706) --- oas_docs/output/kibana.serverless.yaml | 2 +- oas_docs/output/kibana.yaml | 2 +- .../upselling/messages/index.tsx | 4 +- .../timeline/get_notes/get_notes_route.gen.ts | 2 +- .../get_notes/get_notes_route.schema.yaml | 2 +- ...imeline_api_2023_10_31.bundled.schema.yaml | 2 +- ...imeline_api_2023_10_31.bundled.schema.yaml | 2 +- .../public/common/mock/global_state.ts | 2 +- .../security_solution/public/notes/api/api.ts | 6 +-- ...sx => created_by_filter_dropdown.test.tsx} | 25 ++++++---- ...own.tsx => created_by_filter_dropdown.tsx} | 39 ++++++++++----- .../notes/components/search_row.test.tsx | 8 +++- .../public/notes/components/search_row.tsx | 4 +- .../public/notes/components/test_ids.ts | 2 +- .../public/notes/components/utility_bar.tsx | 14 +++--- .../notes/pages/note_management_page.tsx | 14 +++--- .../public/notes/store/notes.slice.test.ts | 18 +++---- .../public/notes/store/notes.slice.ts | 22 ++++----- .../server/lib/timeline/routes/index.ts | 10 +++- .../lib/timeline/routes/notes/get_notes.ts | 48 ++++++++++++++++--- .../security_solution/server/routes/index.ts | 2 +- .../plugins/security_solution/tsconfig.json | 2 + .../saved_objects/tests/notes.ts | 27 +++++++++-- 23 files changed, 174 insertions(+), 85 deletions(-) rename x-pack/plugins/security_solution/public/notes/components/{user_filter_dropdown.test.tsx => created_by_filter_dropdown.test.tsx} (74%) rename x-pack/plugins/security_solution/public/notes/components/{user_filter_dropdown.tsx => created_by_filter_dropdown.tsx} (68%) diff --git a/oas_docs/output/kibana.serverless.yaml b/oas_docs/output/kibana.serverless.yaml index 78c228171175b..f8eab00f618c5 100644 --- a/oas_docs/output/kibana.serverless.yaml +++ b/oas_docs/output/kibana.serverless.yaml @@ -35486,7 +35486,7 @@ paths: nullable: true type: string - in: query - name: userFilter + name: createdByFilter schema: nullable: true type: string diff --git a/oas_docs/output/kibana.yaml b/oas_docs/output/kibana.yaml index e7d8b9240cf1f..0df87c781112a 100644 --- a/oas_docs/output/kibana.yaml +++ b/oas_docs/output/kibana.yaml @@ -38921,7 +38921,7 @@ paths: nullable: true type: string - in: query - name: userFilter + name: createdByFilter schema: nullable: true type: string diff --git a/x-pack/packages/security-solution/upselling/messages/index.tsx b/x-pack/packages/security-solution/upselling/messages/index.tsx index 4bda9477f13c0..1283671911402 100644 --- a/x-pack/packages/security-solution/upselling/messages/index.tsx +++ b/x-pack/packages/security-solution/upselling/messages/index.tsx @@ -48,8 +48,8 @@ export const ALERT_SUPPRESSION_RULE_DETAILS = i18n.translate( ); export const UPGRADE_NOTES_MANAGEMENT_USER_FILTER = (requiredLicense: string) => - i18n.translate('securitySolutionPackages.noteManagement.userFilter.upsell', { - defaultMessage: 'Upgrade to {requiredLicense} to make use of user filters', + i18n.translate('securitySolutionPackages.noteManagement.createdByFilter.upsell', { + defaultMessage: 'Upgrade to {requiredLicense} to make use of createdBy filter', values: { requiredLicense, }, diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.gen.ts index 151fb05f41856..0ee6445dd71e3 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.gen.ts @@ -54,7 +54,7 @@ export const GetNotesRequestQuery = z.object({ sortField: z.string().nullable().optional(), sortOrder: z.string().nullable().optional(), filter: z.string().nullable().optional(), - userFilter: z.string().nullable().optional(), + createdByFilter: z.string().nullable().optional(), associatedFilter: AssociatedFilterType.optional(), }); export type GetNotesRequestQueryInput = z.input; diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml index 019c11baa7386..e142126817707 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml @@ -52,7 +52,7 @@ paths: type: string nullable: true - in: query - name: userFilter + name: createdByFilter schema: nullable: true type: string diff --git a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml index 7a928b357603b..562bf9b80d3ea 100644 --- a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml @@ -98,7 +98,7 @@ paths: nullable: true type: string - in: query - name: userFilter + name: createdByFilter schema: nullable: true type: string diff --git a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml index 6ffcd585d8160..a68919aa0e1fd 100644 --- a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml @@ -98,7 +98,7 @@ paths: nullable: true type: string - in: query - name: userFilter + name: createdByFilter schema: nullable: true type: string diff --git a/x-pack/plugins/security_solution/public/common/mock/global_state.ts b/x-pack/plugins/security_solution/public/common/mock/global_state.ts index 5874062f05523..6473f6fa5a67e 100644 --- a/x-pack/plugins/security_solution/public/common/mock/global_state.ts +++ b/x-pack/plugins/security_solution/public/common/mock/global_state.ts @@ -550,7 +550,7 @@ export const mockGlobalState: State = { direction: 'desc' as const, }, filter: '', - userFilter: '', + createdByFilter: '', associatedFilter: AssociatedFilter.all, search: '', selectedIds: [], diff --git a/x-pack/plugins/security_solution/public/notes/api/api.ts b/x-pack/plugins/security_solution/public/notes/api/api.ts index 917974a154884..892b01e3d17f0 100644 --- a/x-pack/plugins/security_solution/public/notes/api/api.ts +++ b/x-pack/plugins/security_solution/public/notes/api/api.ts @@ -43,7 +43,7 @@ export const fetchNotes = async ({ sortField, sortOrder, filter, - userFilter, + createdByFilter, associatedFilter, search, }: { @@ -52,7 +52,7 @@ export const fetchNotes = async ({ sortField: string; sortOrder: string; filter: string; - userFilter: string; + createdByFilter: string; associatedFilter: AssociatedFilter; search: string; }) => { @@ -63,7 +63,7 @@ export const fetchNotes = async ({ sortField, sortOrder, filter, - userFilter, + createdByFilter, associatedFilter, search, }, diff --git a/x-pack/plugins/security_solution/public/notes/components/user_filter_dropdown.test.tsx b/x-pack/plugins/security_solution/public/notes/components/created_by_filter_dropdown.test.tsx similarity index 74% rename from x-pack/plugins/security_solution/public/notes/components/user_filter_dropdown.test.tsx rename to x-pack/plugins/security_solution/public/notes/components/created_by_filter_dropdown.test.tsx index b095036e58632..301e59db1bfc1 100644 --- a/x-pack/plugins/security_solution/public/notes/components/user_filter_dropdown.test.tsx +++ b/x-pack/plugins/security_solution/public/notes/components/created_by_filter_dropdown.test.tsx @@ -7,8 +7,8 @@ import { fireEvent, render, screen } from '@testing-library/react'; import React from 'react'; -import { UserFilterDropdown } from './user_filter_dropdown'; -import { USER_SELECT_TEST_ID } from './test_ids'; +import { CreatedByFilterDropdown } from './created_by_filter_dropdown'; +import { CREATED_BY_SELECT_TEST_ID } from './test_ids'; import { useSuggestUsers } from '../../common/components/user_profiles/use_suggest_users'; import { useLicense } from '../../common/hooks/use_license'; import { useUpsellingMessage } from '../../common/hooks/use_upselling'; @@ -32,16 +32,25 @@ describe('UserFilterDropdown', () => { jest.clearAllMocks(); (useSuggestUsers as jest.Mock).mockReturnValue({ isLoading: false, - data: [{ user: { username: 'test' } }, { user: { username: 'elastic' } }], + data: [ + { + uid: '1', + user: { username: 'test' }, + }, + { + uid: '2', + user: { username: 'elastic' }, + }, + ], }); (useLicense as jest.Mock).mockReturnValue({ isPlatinumPlus: () => true }); (useUpsellingMessage as jest.Mock).mockReturnValue('upsellingMessage'); }); it('should render the component enabled', () => { - const { getByTestId } = render(); + const { getByTestId } = render(); - const dropdown = getByTestId(USER_SELECT_TEST_ID); + const dropdown = getByTestId(CREATED_BY_SELECT_TEST_ID); expect(dropdown).toBeInTheDocument(); expect(dropdown).not.toHaveClass('euiComboBox-isDisabled'); @@ -50,13 +59,13 @@ describe('UserFilterDropdown', () => { it('should render the dropdown disabled', async () => { (useLicense as jest.Mock).mockReturnValue({ isPlatinumPlus: () => false }); - const { getByTestId } = render(); + const { getByTestId } = render(); - expect(getByTestId(USER_SELECT_TEST_ID)).toHaveClass('euiComboBox-isDisabled'); + expect(getByTestId(CREATED_BY_SELECT_TEST_ID)).toHaveClass('euiComboBox-isDisabled'); }); it('should call the correct action when select a user', async () => { - const { getByTestId } = render(); + const { getByTestId } = render(); const userSelect = getByTestId('comboBoxSearchInput'); userSelect.focus(); diff --git a/x-pack/plugins/security_solution/public/notes/components/user_filter_dropdown.tsx b/x-pack/plugins/security_solution/public/notes/components/created_by_filter_dropdown.tsx similarity index 68% rename from x-pack/plugins/security_solution/public/notes/components/user_filter_dropdown.tsx rename to x-pack/plugins/security_solution/public/notes/components/created_by_filter_dropdown.tsx index 78f4ef6dd2ac8..4b962e4c1ef60 100644 --- a/x-pack/plugins/security_solution/public/notes/components/user_filter_dropdown.tsx +++ b/x-pack/plugins/security_solution/public/notes/components/created_by_filter_dropdown.tsx @@ -13,15 +13,26 @@ import { i18n } from '@kbn/i18n'; import type { EuiComboBoxOptionOption } from '@elastic/eui/src/components/combo_box/types'; import { useLicense } from '../../common/hooks/use_license'; import { useUpsellingMessage } from '../../common/hooks/use_upselling'; -import { USER_SELECT_TEST_ID } from './test_ids'; +import { CREATED_BY_SELECT_TEST_ID } from './test_ids'; import { useSuggestUsers } from '../../common/components/user_profiles/use_suggest_users'; -import { userFilterUsers } from '..'; +import { userFilterCreatedBy } from '..'; -export const USERS_DROPDOWN = i18n.translate('xpack.securitySolution.notes.usersDropdownLabel', { - defaultMessage: 'Users', +export const CREATED_BY = i18n.translate('xpack.securitySolution.notes.createdByDropdownLabel', { + defaultMessage: 'Created by', }); -export const UserFilterDropdown = React.memo(() => { +interface User { + /** + * uuid of the UserProfile + */ + id: string; + /** + * full_name || email || username of the UserProfile + */ + label: string; +} + +export const CreatedByFilterDropdown = React.memo(() => { const dispatch = useDispatch(); const isPlatinumPlus = useLicense().isPlatinumPlus(); const upsellingMessage = useUpsellingMessage('note_management_user_filter'); @@ -30,19 +41,21 @@ export const UserFilterDropdown = React.memo(() => { searchTerm: '', enabled: isPlatinumPlus, }); - const users = useMemo( + + const users: User[] = useMemo( () => (data || []).map((userProfile: UserProfileWithAvatar) => ({ - label: userProfile.user.full_name || userProfile.user.username, + id: userProfile.uid, + label: userProfile.user.full_name || userProfile.user.email || userProfile.user.username, })), [data] ); - const [selectedUser, setSelectedUser] = useState>>(); + const [selectedUser, setSelectedUser] = useState>>(); const onChange = useCallback( - (user: Array>) => { + (user: Array>) => { setSelectedUser(user); - dispatch(userFilterUsers(user.length > 0 ? user[0].label : '')); + dispatch(userFilterCreatedBy(user.length > 0 ? (user[0].id as string) : '')); }, [dispatch] ); @@ -50,14 +63,14 @@ export const UserFilterDropdown = React.memo(() => { const dropdown = useMemo( () => ( ), [isLoading, isPlatinumPlus, onChange, selectedUser, users] @@ -76,4 +89,4 @@ export const UserFilterDropdown = React.memo(() => { ); }); -UserFilterDropdown.displayName = 'UserFilterDropdown'; +CreatedByFilterDropdown.displayName = 'CreatedByFilterDropdown'; diff --git a/x-pack/plugins/security_solution/public/notes/components/search_row.test.tsx b/x-pack/plugins/security_solution/public/notes/components/search_row.test.tsx index 447ade158306b..cdae928b4ad87 100644 --- a/x-pack/plugins/security_solution/public/notes/components/search_row.test.tsx +++ b/x-pack/plugins/security_solution/public/notes/components/search_row.test.tsx @@ -9,7 +9,11 @@ import { render } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; import { SearchRow } from './search_row'; -import { ASSOCIATED_NOT_SELECT_TEST_ID, SEARCH_BAR_TEST_ID, USER_SELECT_TEST_ID } from './test_ids'; +import { + ASSOCIATED_NOT_SELECT_TEST_ID, + SEARCH_BAR_TEST_ID, + CREATED_BY_SELECT_TEST_ID, +} from './test_ids'; import { AssociatedFilter } from '../../../common/notes/constants'; import { useSuggestUsers } from '../../common/components/user_profiles/use_suggest_users'; import { TestProviders } from '../../common/mock'; @@ -43,7 +47,7 @@ describe('SearchRow', () => { ); expect(getByTestId(SEARCH_BAR_TEST_ID)).toBeInTheDocument(); - expect(getByTestId(USER_SELECT_TEST_ID)).toBeInTheDocument(); + expect(getByTestId(CREATED_BY_SELECT_TEST_ID)).toBeInTheDocument(); expect(getByTestId(ASSOCIATED_NOT_SELECT_TEST_ID)).toBeInTheDocument(); }); diff --git a/x-pack/plugins/security_solution/public/notes/components/search_row.tsx b/x-pack/plugins/security_solution/public/notes/components/search_row.tsx index 3c4093f913acf..ea006f9a3f01f 100644 --- a/x-pack/plugins/security_solution/public/notes/components/search_row.tsx +++ b/x-pack/plugins/security_solution/public/notes/components/search_row.tsx @@ -16,7 +16,7 @@ import { } from '@elastic/eui'; import { useDispatch } from 'react-redux'; import { i18n } from '@kbn/i18n'; -import { UserFilterDropdown } from './user_filter_dropdown'; +import { CreatedByFilterDropdown } from './created_by_filter_dropdown'; import { ASSOCIATED_NOT_SELECT_TEST_ID, SEARCH_BAR_TEST_ID } from './test_ids'; import { userFilterAssociatedNotes, userSearchedNotes } from '..'; import { AssociatedFilter } from '../../../common/notes/constants'; @@ -65,7 +65,7 @@ export const SearchRow = React.memo(() => { - + { const pagination = useSelector(selectNotesPagination); const sort = useSelector(selectNotesTableSort); const selectedItems = useSelector(selectNotesTableSelectedIds); - const notesUserFilters = useSelector(selectNotesTableUserFilters); - const notesAssociatedFilters = useSelector(selectNotesTableAssociatedFilter); + const notesCreatedByFilter = useSelector(selectNotesTableCreatedByFilter); + const notesAssociatedFilter = useSelector(selectNotesTableAssociatedFilter); const resultsCount = useMemo(() => { const { perPage, page, total } = pagination; const startOfCurrentPage = perPage * (page - 1) + 1; @@ -87,8 +87,8 @@ export const NotesUtilityBar = React.memo(() => { sortField: sort.field, sortOrder: sort.direction, filter: '', - userFilter: notesUserFilters, - associatedFilter: notesAssociatedFilters, + createdByFilter: notesCreatedByFilter, + associatedFilter: notesAssociatedFilter, search: notesSearch, }) ); @@ -98,8 +98,8 @@ export const NotesUtilityBar = React.memo(() => { pagination.perPage, sort.field, sort.direction, - notesUserFilters, - notesAssociatedFilters, + notesCreatedByFilter, + notesAssociatedFilter, notesSearch, ]); return ( diff --git a/x-pack/plugins/security_solution/public/notes/pages/note_management_page.tsx b/x-pack/plugins/security_solution/public/notes/pages/note_management_page.tsx index 4795d6146be4d..3060e5ccf93d9 100644 --- a/x-pack/plugins/security_solution/public/notes/pages/note_management_page.tsx +++ b/x-pack/plugins/security_solution/public/notes/pages/note_management_page.tsx @@ -36,7 +36,7 @@ import { selectNotesTablePendingDeleteIds, selectFetchNotesError, ReqStatus, - selectNotesTableUserFilters, + selectNotesTableCreatedByFilter, selectNotesTableAssociatedFilter, } from '..'; import type { NotesState } from '..'; @@ -121,8 +121,8 @@ export const NoteManagementPage = () => { const pagination = useSelector(selectNotesPagination); const sort = useSelector(selectNotesTableSort); const notesSearch = useSelector(selectNotesTableSearch); - const notesUserFilters = useSelector(selectNotesTableUserFilters); - const notesAssociatedFilters = useSelector(selectNotesTableAssociatedFilter); + const notesCreatedByFilter = useSelector(selectNotesTableCreatedByFilter); + const notesAssociatedFilter = useSelector(selectNotesTableAssociatedFilter); const pendingDeleteIds = useSelector(selectNotesTablePendingDeleteIds); const isDeleteModalVisible = pendingDeleteIds.length > 0; const fetchNotesStatus = useSelector(selectFetchNotesStatus); @@ -138,8 +138,8 @@ export const NoteManagementPage = () => { sortField: sort.field, sortOrder: sort.direction, filter: '', - userFilter: notesUserFilters, - associatedFilter: notesAssociatedFilters, + createdByFilter: notesCreatedByFilter, + associatedFilter: notesAssociatedFilter, search: notesSearch, }) ); @@ -149,8 +149,8 @@ export const NoteManagementPage = () => { pagination.perPage, sort.field, sort.direction, - notesUserFilters, - notesAssociatedFilters, + notesCreatedByFilter, + notesAssociatedFilter, notesSearch, ]); diff --git a/x-pack/plugins/security_solution/public/notes/store/notes.slice.test.ts b/x-pack/plugins/security_solution/public/notes/store/notes.slice.test.ts index 65fa293bd824a..46bcec9b448f9 100644 --- a/x-pack/plugins/security_solution/public/notes/store/notes.slice.test.ts +++ b/x-pack/plugins/security_solution/public/notes/store/notes.slice.test.ts @@ -38,7 +38,7 @@ import { selectNotesTableSort, selectSortedNotesByDocumentId, selectSortedNotesBySavedObjectId, - selectNotesTableUserFilters, + selectNotesTableCreatedByFilter, selectNotesTableAssociatedFilter, userClosedDeleteModal, userFilteredNotes, @@ -49,7 +49,7 @@ import { userSelectedRow, userSelectedNotesForDeletion, userSortedNotes, - userFilterUsers, + userFilterCreatedBy, userClosedCreateErrorToast, userFilterAssociatedNotes, } from './notes.slice'; @@ -104,7 +104,7 @@ const initialNonEmptyState: NotesState = { direction: 'desc' as const, }, filter: '', - userFilter: '', + createdByFilter: '', associatedFilter: AssociatedFilter.all, search: '', selectedIds: [], @@ -508,13 +508,13 @@ describe('notesSlice', () => { }); }); - describe('userFilterUsers', () => { + describe('userFilterCreatedBy', () => { it('should set correct value to filter users', () => { - const action = { type: userFilterUsers.type, payload: 'abc' }; + const action = { type: userFilterCreatedBy.type, payload: 'abc' }; expect(notesReducer(initalEmptyState, action)).toEqual({ ...initalEmptyState, - userFilter: 'abc', + createdByFilter: 'abc', }); }); }); @@ -866,12 +866,12 @@ describe('notesSlice', () => { expect(selectNotesTableSearch(state)).toBe('test search'); }); - it('should select user filter', () => { + it('should select createdBy filter', () => { const state = { ...mockGlobalState, - notes: { ...initialNotesState, userFilter: 'abc' }, + notes: { ...initialNotesState, createdByFilter: 'abc' }, }; - expect(selectNotesTableUserFilters(state)).toBe('abc'); + expect(selectNotesTableCreatedByFilter(state)).toBe('abc'); }); it('should select associated filter', () => { diff --git a/x-pack/plugins/security_solution/public/notes/store/notes.slice.ts b/x-pack/plugins/security_solution/public/notes/store/notes.slice.ts index 28bf609a4f210..259a14b208969 100644 --- a/x-pack/plugins/security_solution/public/notes/store/notes.slice.ts +++ b/x-pack/plugins/security_solution/public/notes/store/notes.slice.ts @@ -58,7 +58,7 @@ export interface NotesState extends EntityState { direction: 'asc' | 'desc'; }; filter: string; - userFilter: string; + createdByFilter: string; search: string; associatedFilter: AssociatedFilter; selectedIds: string[]; @@ -94,7 +94,7 @@ export const initialNotesState: NotesState = notesAdapter.getInitialState({ direction: 'desc', }, filter: '', - userFilter: '', + createdByFilter: '', associatedFilter: AssociatedFilter.all, search: '', selectedIds: [], @@ -129,13 +129,13 @@ export const fetchNotes = createAsyncThunk< sortField: string; sortOrder: string; filter: string; - userFilter: string; + createdByFilter: string; associatedFilter: AssociatedFilter; search: string; }, {} >('notes/fetchNotes', async (args) => { - const { page, perPage, sortField, sortOrder, filter, userFilter, associatedFilter, search } = + const { page, perPage, sortField, sortOrder, filter, createdByFilter, associatedFilter, search } = args; const res = await fetchNotesApi({ page, @@ -143,7 +143,7 @@ export const fetchNotes = createAsyncThunk< sortField, sortOrder, filter, - userFilter, + createdByFilter, associatedFilter, search, }); @@ -169,7 +169,7 @@ export const deleteNotes = createAsyncThunk { state.filter = action.payload; }, - userFilterUsers: (state: NotesState, action: { payload: string }) => { - state.userFilter = action.payload; + userFilterCreatedBy: (state: NotesState, action: { payload: string }) => { + state.createdByFilter = action.payload; }, userFilterAssociatedNotes: (state: NotesState, action: { payload: AssociatedFilter }) => { state.associatedFilter = action.payload; @@ -332,7 +332,7 @@ export const selectNotesTableSelectedIds = (state: State) => state.notes.selecte export const selectNotesTableSearch = (state: State) => state.notes.search; -export const selectNotesTableUserFilters = (state: State) => state.notes.userFilter; +export const selectNotesTableCreatedByFilter = (state: State) => state.notes.createdByFilter; export const selectNotesTableAssociatedFilter = (state: State) => state.notes.associatedFilter; @@ -423,7 +423,7 @@ export const { userSelectedPerPage, userSortedNotes, userFilteredNotes, - userFilterUsers, + userFilterCreatedBy, userFilterAssociatedNotes, userSearchedNotes, userSelectedRow, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/index.ts index 905e28872a5a4..90ec0bce1be00 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/index.ts @@ -5,6 +5,8 @@ * 2.0. */ +import type { StartServicesAccessor } from '@kbn/core-lifecycle-server'; +import type { StartPlugins } from '../../../plugin_contract'; import type { SecuritySolutionPluginRouter } from '../../../types'; import type { ConfigType } from '../../..'; import { @@ -27,7 +29,11 @@ import { persistNoteRoute, deleteNoteRoute, getNotesRoute } from './notes'; import { persistPinnedEventRoute } from './pinned_events'; -export function registerTimelineRoutes(router: SecuritySolutionPluginRouter, config: ConfigType) { +export function registerTimelineRoutes( + router: SecuritySolutionPluginRouter, + config: ConfigType, + startServices: StartServicesAccessor +) { createTimelinesRoute(router); patchTimelinesRoute(router); @@ -46,7 +52,7 @@ export function registerTimelineRoutes(router: SecuritySolutionPluginRouter, con persistNoteRoute(router); deleteNoteRoute(router); - getNotesRoute(router); + getNotesRoute(router, startServices); persistPinnedEventRoute(router); } diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts index 7b8c732ae54ca..0cd7853b38a1b 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts @@ -15,6 +15,9 @@ import type { } from '@kbn/core-saved-objects-api-server'; import type { KueryNode } from '@kbn/es-query'; import { nodeBuilder, nodeTypes } from '@kbn/es-query'; +import type { StartServicesAccessor } from '@kbn/core-lifecycle-server'; +import type { UserProfile } from '@kbn/core-user-profile-common'; +import type { StartPlugins } from '../../../../plugin_contract'; import { AssociatedFilter } from '../../../../../common/notes/constants'; import { timelineSavedObjectType } from '../../saved_object_mappings'; import type { SecuritySolutionPluginRouter } from '../../../../types'; @@ -27,7 +30,10 @@ import { noteSavedObjectType } from '../../saved_object_mappings/notes'; import { GetNotesRequestQuery, type GetNotesResponse } from '../../../../../common/api/timeline'; /* eslint-disable complexity */ -export const getNotesRoute = (router: SecuritySolutionPluginRouter) => { +export const getNotesRoute = ( + router: SecuritySolutionPluginRouter, + startServices: StartServicesAccessor +) => { router.versioned .get({ path: NOTE_URL, @@ -139,11 +145,41 @@ export const getNotesRoute = (router: SecuritySolutionPluginRouter) => { const filterKueryNodeArray = [filterAsKueryNode]; // retrieve all the notes created by a specific user - const userFilter = queryParams?.userFilter; - if (userFilter) { - filterKueryNodeArray.push( - nodeBuilder.is(`${noteSavedObjectType}.attributes.createdBy`, userFilter) - ); + // the createdByFilter value is the uuid of the user + const createdByFilter = queryParams?.createdByFilter; // now uuid + if (createdByFilter) { + // because the notes createdBy property can be either full_name, email or username + // see pickSaveNote (https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/saved_object.ts#L302) + // which uses the getUserDisplayName (https://github.com/elastic/kibana/blob/main/packages/kbn-user-profile-components/src/user_profile.ts#L138) + const [_, { security }] = await startServices(); + const users: UserProfile[] = await security.userProfiles.bulkGet({ + uids: new Set([createdByFilter]), + }); + // once we retrieve the user by the uuid we can search all the notes that have the createdBy property with full_name, email or username values + if (users && users.length > 0) { + const { + user: { email, full_name: fullName, username: userName }, + } = users[0]; + const createdByNodeArray = []; + if (fullName) { + createdByNodeArray.push( + nodeBuilder.is(`${noteSavedObjectType}.attributes.createdBy`, fullName) + ); + } + if (userName) { + createdByNodeArray.push( + nodeBuilder.is(`${noteSavedObjectType}.attributes.createdBy`, userName) + ); + } + if (email) { + createdByNodeArray.push( + nodeBuilder.is(`${noteSavedObjectType}.attributes.createdBy`, email) + ); + } + filterKueryNodeArray.push(nodeBuilder.or(createdByNodeArray)); + } else { + throw new Error(`User with uid ${createdByFilter} not found`); + } } const associatedFilter = queryParams?.associatedFilter; diff --git a/x-pack/plugins/security_solution/server/routes/index.ts b/x-pack/plugins/security_solution/server/routes/index.ts index 0b80d142e14ce..8fb74afc770b5 100644 --- a/x-pack/plugins/security_solution/server/routes/index.ts +++ b/x-pack/plugins/security_solution/server/routes/index.ts @@ -100,7 +100,7 @@ export const initRoutes = ( registerResolverRoutes(router, getStartServices, config); - registerTimelineRoutes(router, config); + registerTimelineRoutes(router, config, getStartServices); // Detection Engine Signals routes that have the REST endpoints of /api/detection_engine/signals // POST /api/detection_engine/signals/status diff --git a/x-pack/plugins/security_solution/tsconfig.json b/x-pack/plugins/security_solution/tsconfig.json index 15d082d32edda..a84f21c047ea8 100644 --- a/x-pack/plugins/security_solution/tsconfig.json +++ b/x-pack/plugins/security_solution/tsconfig.json @@ -231,5 +231,7 @@ "@kbn/serverless", "@kbn/core-user-profile-browser", "@kbn/data-stream-adapter", + "@kbn/core-lifecycle-server", + "@kbn/core-user-profile-common", ] } diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/notes.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/notes.ts index 4596297f9411a..8e897509aaf98 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/notes.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/tests/notes.ts @@ -384,14 +384,15 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { // skipped https://github.com/elastic/kibana/issues/196896 describe('@skipInServerless', () => { - it('should retrieve all notes that have been created by a specific user', async () => { + // TODO we need to figure out how to retrieve the uid of the current user in the test environment + it.skip('should retrieve all notes that have been created by a specific user', async () => { await Promise.all([ createNote(supertest, { text: 'first note' }), createNote(supertest, { text: 'second note' }), ]); const response = await supertest - .get(`${NOTE_URL}?userFilter=elastic`) + .get(`${NOTE_URL}?createdByFilter=elastic`) .set('kbn-xsrf', 'true') .set('elastic-api-version', '2023-10-31'); const { totalCount } = response.body as GetNotesResult; @@ -400,14 +401,15 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { }); }); - it('should return nothing if no notes have been created by that user', async () => { + // TODO we need to figure out how to create another user in the test environment + it.skip('should return nothing if no notes have been created by that user', async () => { await Promise.all([ createNote(supertest, { text: 'first note' }), createNote(supertest, { text: 'second note' }), ]); const response = await supertest - .get(`${NOTE_URL}?userFilter=user1`) + .get(`${NOTE_URL}?createdByFilter=user1`) .set('kbn-xsrf', 'true') .set('elastic-api-version', '2023-10-31'); const { totalCount } = response.body as GetNotesResult; @@ -415,6 +417,23 @@ export default function ({ getService }: FtrProviderContextWithSpaces) { expect(totalCount).to.be(0); }); + it('should return error if user does not exist', async () => { + await Promise.all([ + createNote(supertest, { text: 'first note' }), + createNote(supertest, { text: 'second note' }), + ]); + + const response = await supertest + .get(`${NOTE_URL}?createdByFilter=wrong_user`) + .set('kbn-xsrf', 'true') + .set('elastic-api-version', '2023-10-31'); + + expect(response.body).to.not.have.property('totalCount'); + expect(response.body).to.not.have.property('notes'); + expect(response.body.message).to.be('User with uid wrong_user not found'); + expect(response.body.status_code).to.be(500); + }); + it('should retrieve all notes that have an association with a document only', async () => { await Promise.all([ createNote(supertest, { documentId: eventId1, text: 'associated with event-1 only' }), From de5ccde5947703035b3578e3e8cddd2552fe28ae Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Fri, 25 Oct 2024 15:57:39 -0500 Subject: [PATCH 051/135] [Search][Fix] Index Details: poll mappings (#197885) --- x-pack/plugins/search_indices/public/constants.ts | 1 + .../search_indices/public/hooks/api/use_index_mappings.ts | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/search_indices/public/constants.ts b/x-pack/plugins/search_indices/public/constants.ts index bf9cf14a4ea17..fa5d7fde6d4c8 100644 --- a/x-pack/plugins/search_indices/public/constants.ts +++ b/x-pack/plugins/search_indices/public/constants.ts @@ -7,6 +7,7 @@ export enum QueryKeys { FetchIndex = 'fetchIndex', + FetchMapping = 'fetchMapping', FetchSearchIndicesStatus = 'fetchSearchIndicesStatus', FetchUserStartPrivileges = 'fetchUserStartPrivileges', SearchDocuments = 'searchDocuments', diff --git a/x-pack/plugins/search_indices/public/hooks/api/use_index_mappings.ts b/x-pack/plugins/search_indices/public/hooks/api/use_index_mappings.ts index 0e57e17465922..1d5a83aa920ed 100644 --- a/x-pack/plugins/search_indices/public/hooks/api/use_index_mappings.ts +++ b/x-pack/plugins/search_indices/public/hooks/api/use_index_mappings.ts @@ -8,12 +8,16 @@ import { useQuery } from '@tanstack/react-query'; import { useKibana } from '../use_kibana'; import { Mappings } from '../../types'; +import { QueryKeys } from '../../constants'; +const POLLING_INTERVAL = 15 * 1000; export const useIndexMapping = (indexName: string) => { const { http } = useKibana().services; - const queryKey = ['fetchMapping', indexName]; + const queryKey = [QueryKeys.FetchMapping, indexName]; const result = useQuery({ queryKey, + refetchInterval: POLLING_INTERVAL, + refetchIntervalInBackground: true, refetchOnWindowFocus: 'always', queryFn: () => http.fetch(`/api/index_management/mapping/${encodeURIComponent(indexName)}`), From d17fc09034d69f15748ddb0a49eae78959401c5a Mon Sep 17 00:00:00 2001 From: Ievgen Sorokopud Date: Sat, 26 Oct 2024 00:45:32 +0200 Subject: [PATCH 052/135] [Security GenAI] When a "global" Knowledge Base entry is updated to "private", a duplicate "private" entry gets created and the global entry remains unchanged (#197157) (#197516) ## Summary Original ticket describing the BUG: https://github.com/elastic/kibana/issues/197157 These changes fix two issues: 1. Updating an entry from Global to Private duplicates it. After discussing with the team we decided that this is an expected behaviour and we would add a modal dialog which warns users about it. See more details here https://github.com/elastic/kibana/issues/197157#issuecomment-2432592394 2. Editing Private entry and switching the sharing option twice from Private => Global => Private causes the issue where we would treat selected entry as a new one and thus calling "create entry" instead of "update". ### Steps to reproduce second issue: * Edit private entry * Update entry's name * Switch sharing option to Global * Switch sharing option back to Private * Save the entry **Current behaviour**: a new private entry is created **Expected behaviour**: existing private entry is updated ### Screen recording of the fixed first issue https://github.com/user-attachments/assets/e11e14bd-c557-401e-a23f-e01ac7aedf30 ### 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 --- .../document_entry_editor.tsx | 21 +- .../index.test.tsx | 181 +++++++++++++++++- .../index.tsx | 64 +++++-- .../index_entry_editor.tsx | 16 +- .../translations.ts | 22 +++ 5 files changed, 274 insertions(+), 30 deletions(-) diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/document_entry_editor.tsx b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/document_entry_editor.tsx index 11d9ac2d62289..a48010f088c42 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/document_entry_editor.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/document_entry_editor.tsx @@ -14,18 +14,28 @@ import { EuiIcon, EuiText, } from '@elastic/eui'; -import React, { useCallback } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { DocumentEntry } from '@kbn/elastic-assistant-common'; import * as i18n from './translations'; +import { isGlobalEntry } from './helpers'; interface Props { entry?: DocumentEntry; + originalEntry?: DocumentEntry; setEntry: React.Dispatch>>; hasManageGlobalKnowledgeBase: boolean; } export const DocumentEntryEditor: React.FC = React.memo( - ({ entry, setEntry, hasManageGlobalKnowledgeBase }) => { + ({ entry, setEntry, hasManageGlobalKnowledgeBase, originalEntry }) => { + const privateUsers = useMemo(() => { + const originalUsers = originalEntry?.users; + if (originalEntry && !isGlobalEntry(originalEntry)) { + return originalUsers; + } + return undefined; + }, [originalEntry]); + // Name const setName = useCallback( (e: React.ChangeEvent) => @@ -38,12 +48,13 @@ export const DocumentEntryEditor: React.FC = React.memo( (value: string) => setEntry((prevEntry) => ({ ...prevEntry, - users: value === i18n.SHARING_GLOBAL_OPTION_LABEL ? [] : undefined, + users: value === i18n.SHARING_GLOBAL_OPTION_LABEL ? [] : privateUsers, })), - [setEntry] + [privateUsers, setEntry] ); const sharingOptions = [ { + 'data-test-subj': 'sharing-private-option', value: i18n.SHARING_PRIVATE_OPTION_LABEL, inputDisplay: ( @@ -57,6 +68,7 @@ export const DocumentEntryEditor: React.FC = React.memo( ), }, { + 'data-test-subj': 'sharing-global-option', value: i18n.SHARING_GLOBAL_OPTION_LABEL, inputDisplay: ( @@ -111,6 +123,7 @@ export const DocumentEntryEditor: React.FC = React.memo( fullWidth > ( ); describe('KnowledgeBaseSettingsManagement', () => { + const mockCreateEntry = jest.fn(); + const mockUpdateEntry = jest.fn(); + const mockDeleteEntry = jest.fn(); const mockData = [ - { id: '1', name: 'Test Entry 1', type: 'document', kbResource: 'user', users: [{ id: 'hi' }] }, + { + id: '1', + createdAt: '2024-10-21T18:54:14.773Z', + createdBy: 'u_user_id_1', + updatedAt: '2024-10-23T17:33:15.933Z', + updatedBy: 'u_user_id_1', + users: [{ name: 'Test User 1' }], + name: 'Test Entry 1', + namespace: 'default', + type: 'document', + kbResource: 'user', + source: 'user', + text: 'Very nice text', + }, { id: '2', + createdAt: '2024-10-25T09:55:56.596Z', + createdBy: 'u_user_id_2', + updatedAt: '2024-10-25T09:55:56.596Z', + updatedBy: 'u_user_id_2', + users: [], name: 'Test Entry 2', + namespace: 'default', type: 'index', - kbResource: 'global', - users: [], - index: 'missing-index', + index: 'index-1', + field: 'semantic_field1', + description: 'Test description', + queryDescription: 'Test query instruction', }, { id: '3', + createdAt: '2024-10-25T09:55:56.596Z', + createdBy: 'u_user_id_1', + updatedAt: '2024-10-25T09:55:56.596Z', + updatedBy: 'u_user_id_1', + users: [{ name: 'Test User 1' }], name: 'Test Entry 3', + namespace: 'default', type: 'index', - kbResource: 'private', - users: [{ id: 'fake-user' }], index: 'index-2', + field: 'semantic_field2', + description: 'Test description', + queryDescription: 'Test query instruction', + }, + { + id: '4', + createdAt: '2024-10-21T18:54:14.773Z', + createdBy: 'u_user_id_3', + updatedAt: '2024-10-23T17:33:15.933Z', + updatedBy: 'u_user_id_3', + users: [], + name: 'Test Entry 4', + namespace: 'default', + type: 'document', + kbResource: 'user', + source: 'user', + text: 'Very nice text', }, ]; @@ -114,15 +159,15 @@ describe('KnowledgeBaseSettingsManagement', () => { closeFlyout: jest.fn(), }); (useCreateKnowledgeBaseEntry as jest.Mock).mockReturnValue({ - mutateAsync: jest.fn(), + mutateAsync: mockCreateEntry, isLoading: false, }); (useUpdateKnowledgeBaseEntries as jest.Mock).mockReturnValue({ - mutateAsync: jest.fn(), + mutateAsync: mockUpdateEntry, isLoading: false, }); (useDeleteKnowledgeBaseEntries as jest.Mock).mockReturnValue({ - mutateAsync: jest.fn(), + mutateAsync: mockDeleteEntry, isLoading: false, }); }); @@ -258,6 +303,124 @@ describe('KnowledgeBaseSettingsManagement', () => { expect(screen.queryByTestId('delete-entry-confirmation')).not.toBeInTheDocument(); }); + it('does not create a duplicate document entry when switching sharing option twice', async () => { + (useFlyoutModalVisibility as jest.Mock).mockReturnValue({ + isFlyoutOpen: true, + openFlyout: jest.fn(), + closeFlyout: jest.fn(), + }); + render(, { + wrapper, + }); + + await waitFor(() => { + fireEvent.click(screen.getAllByTestId('edit-button')[0]); + }); + expect(screen.getByTestId('flyout')).toBeVisible(); + + await waitFor(() => { + expect(screen.getByText('Edit document entry')).toBeInTheDocument(); + }); + + const updatedName = 'New Entry Name'; + await waitFor(() => { + const nameInput = screen.getByTestId('entryNameInput'); + fireEvent.change(nameInput, { target: { value: updatedName } }); + }); + + await waitFor(() => { + fireEvent.click(screen.getByTestId('sharing-select')); + fireEvent.click(screen.getByTestId('sharing-global-option')); + fireEvent.click(screen.getByTestId('sharing-select')); + fireEvent.click(screen.getByTestId('sharing-private-option')); + fireEvent.click(screen.getByTestId('save-button')); + }); + + await waitFor(() => { + expect(mockUpdateEntry).toHaveBeenCalledTimes(1); + }); + expect(mockCreateEntry).toHaveBeenCalledTimes(0); + expect(mockUpdateEntry).toHaveBeenCalledWith([{ ...mockData[0], name: updatedName }]); + }); + + it('does not create a duplicate index entry when switching sharing option twice', async () => { + (useFlyoutModalVisibility as jest.Mock).mockReturnValue({ + isFlyoutOpen: true, + openFlyout: jest.fn(), + closeFlyout: jest.fn(), + }); + render(, { + wrapper, + }); + + await waitFor(() => { + fireEvent.click(screen.getAllByTestId('edit-button')[2]); + }); + expect(screen.getByTestId('flyout')).toBeVisible(); + + await waitFor(() => { + expect(screen.getByText('Edit index entry')).toBeInTheDocument(); + }); + + const updatedName = 'New Entry Name'; + await waitFor(() => { + const nameInput = screen.getByTestId('entry-name'); + fireEvent.change(nameInput, { target: { value: updatedName } }); + }); + + await waitFor(() => { + fireEvent.click(screen.getByTestId('sharing-select')); + fireEvent.click(screen.getByTestId('sharing-global-option')); + fireEvent.click(screen.getByTestId('sharing-select')); + fireEvent.click(screen.getByTestId('sharing-private-option')); + fireEvent.click(screen.getByTestId('save-button')); + }); + + await waitFor(() => { + expect(mockUpdateEntry).toHaveBeenCalledTimes(1); + }); + expect(mockCreateEntry).toHaveBeenCalledTimes(0); + expect(mockUpdateEntry).toHaveBeenCalledWith([{ ...mockData[2], name: updatedName }]); + }); + + it('shows duplicate entry modal when making global to private entry update', async () => { + (useFlyoutModalVisibility as jest.Mock).mockReturnValue({ + isFlyoutOpen: true, + openFlyout: jest.fn(), + closeFlyout: jest.fn(), + }); + render(, { + wrapper, + }); + + await waitFor(() => { + fireEvent.click(screen.getAllByTestId('edit-button')[3]); + }); + expect(screen.getByTestId('flyout')).toBeVisible(); + + await waitFor(() => { + expect(screen.getByText('Edit document entry')).toBeInTheDocument(); + }); + + await waitFor(() => { + fireEvent.click(screen.getByTestId('sharing-select')); + fireEvent.click(screen.getByTestId('sharing-private-option')); + fireEvent.click(screen.getByTestId('save-button')); + }); + + expect(screen.getByTestId('create-duplicate-entry-modal')).toBeInTheDocument(); + await waitFor(() => { + fireEvent.click(screen.getByTestId('confirmModalConfirmButton')); + }); + expect(screen.queryByTestId('create-duplicate-entry-modal')).not.toBeInTheDocument(); + + await waitFor(() => { + expect(mockCreateEntry).toHaveBeenCalledTimes(1); + }); + expect(mockUpdateEntry).toHaveBeenCalledTimes(0); + expect(mockCreateEntry).toHaveBeenCalledWith({ ...mockData[3], users: undefined }); + }); + it('shows warning icon for index entries with missing indices', async () => { render(, { wrapper, diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index.tsx b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index.tsx index 3633a935a3bea..54ea159ff0589 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index.tsx @@ -83,6 +83,12 @@ export const KnowledgeBaseSettingsManagement: React.FC = React.memo(({ d const isKbSetup = isKnowledgeBaseSetup(kbStatus); const [deleteKBItem, setDeleteKBItem] = useState(null); + const [duplicateKBItem, setDuplicateKBItem] = useState( + null + ); + const [originalEntry, setOriginalEntry] = useState( + undefined + ); // Only needed for legacy settings management const { knowledgeBase, setUpdatedKnowledgeBaseSettings, resetSettings, saveSettings } = @@ -146,35 +152,37 @@ export const KnowledgeBaseSettingsManagement: React.FC = React.memo(({ d }); const isModifyingEntry = isCreatingEntry || isUpdatingEntries || isDeletingEntries; + const { + data: entries, + isFetching: isFetchingEntries, + refetch: refetchEntries, + } = useKnowledgeBaseEntries({ + http, + toasts, + enabled: enableKnowledgeBaseByDefault, + }); + // Flyout Save/Cancel Actions const onSaveConfirmed = useCallback(async () => { if (isKnowledgeBaseEntryResponse(selectedEntry)) { await updateEntries([selectedEntry]); closeFlyout(); } else if (isKnowledgeBaseEntryCreateProps(selectedEntry)) { + if (originalEntry) { + setDuplicateKBItem(selectedEntry); + return; + } await createEntry(selectedEntry); closeFlyout(); - } else if (isKnowledgeBaseEntryCreateProps(selectedEntry)) { - createEntry(selectedEntry); - closeFlyout(); } - }, [closeFlyout, selectedEntry, createEntry, updateEntries]); + }, [selectedEntry, originalEntry, updateEntries, closeFlyout, createEntry]); const onSaveCancelled = useCallback(() => { + setOriginalEntry(undefined); setSelectedEntry(undefined); closeFlyout(); }, [closeFlyout]); - const { - data: entries, - isFetching: isFetchingEntries, - refetch: refetchEntries, - } = useKnowledgeBaseEntries({ - http, - toasts, - enabled: enableKnowledgeBaseByDefault, - }); - const { value: existingIndices } = useAsync(() => { const indices: string[] = []; entries.data.forEach((entry) => { @@ -206,6 +214,7 @@ export const KnowledgeBaseSettingsManagement: React.FC = React.memo(({ d }, onEditActionClicked: ({ id }: KnowledgeBaseEntryResponse) => { const entry = entries.data.find((e) => e.id === id); + setOriginalEntry(entry); setSelectedEntry(entry); openFlyout(); }, @@ -294,6 +303,18 @@ export const KnowledgeBaseSettingsManagement: React.FC = React.memo(({ d } }, [deleteEntry, deleteKBItem, setDeleteKBItem]); + const handleCancelDuplicateEntry = useCallback(() => { + setDuplicateKBItem(null); + }, [setDuplicateKBItem]); + + const handleDuplicateEntry = useCallback(async () => { + if (duplicateKBItem) { + await createEntry(duplicateKBItem); + closeFlyout(); + setDuplicateKBItem(null); + } + }, [closeFlyout, createEntry, duplicateKBItem]); + if (!enableKnowledgeBaseByDefault) { return ( <> @@ -392,6 +413,7 @@ export const KnowledgeBaseSettingsManagement: React.FC = React.memo(({ d {selectedEntry?.type === DocumentEntryType.value ? ( >> } @@ -400,6 +422,7 @@ export const KnowledgeBaseSettingsManagement: React.FC = React.memo(({ d ) : ( >> @@ -425,6 +448,19 @@ export const KnowledgeBaseSettingsManagement: React.FC = React.memo(({ d

{i18n.DELETE_ENTRY_CONFIRMATION_CONTENT}

)} + {duplicateKBItem && ( + +

{i18n.DUPLICATE_ENTRY_CONFIRMATION_CONTENT}

+
+ )} ); diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.tsx b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.tsx index b5e1c278e2ddb..ff61c61ed7423 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.tsx +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/index_entry_editor.tsx @@ -21,16 +21,26 @@ import React, { useCallback, useMemo } from 'react'; import { IndexEntry } from '@kbn/elastic-assistant-common'; import { DataViewsContract } from '@kbn/data-views-plugin/public'; import * as i18n from './translations'; +import { isGlobalEntry } from './helpers'; interface Props { dataViews: DataViewsContract; entry?: IndexEntry; + originalEntry?: IndexEntry; setEntry: React.Dispatch>>; hasManageGlobalKnowledgeBase: boolean; } export const IndexEntryEditor: React.FC = React.memo( - ({ dataViews, entry, setEntry, hasManageGlobalKnowledgeBase }) => { + ({ dataViews, entry, setEntry, hasManageGlobalKnowledgeBase, originalEntry }) => { + const privateUsers = useMemo(() => { + const originalUsers = originalEntry?.users; + if (originalEntry && !isGlobalEntry(originalEntry)) { + return originalUsers; + } + return undefined; + }, [originalEntry]); + // Name const setName = useCallback( (e: React.ChangeEvent) => @@ -43,9 +53,9 @@ export const IndexEntryEditor: React.FC = React.memo( (value: string) => setEntry((prevEntry) => ({ ...prevEntry, - users: value === i18n.SHARING_GLOBAL_OPTION_LABEL ? [] : undefined, + users: value === i18n.SHARING_GLOBAL_OPTION_LABEL ? [] : privateUsers, })), - [setEntry] + [privateUsers, setEntry] ); const sharingOptions = [ { diff --git a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/translations.ts b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/translations.ts index a1ed74654360a..b311f373c214b 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/translations.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/knowledge_base/knowledge_base_settings_management/translations.ts @@ -336,6 +336,28 @@ export const PRIVATE = i18n.translate( } ); +export const SAVE_BUTTON_TEXT = i18n.translate( + 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettingsManagement.saveButtonText', + { + defaultMessage: 'Save', + } +); + +export const DUPLICATE_ENTRY_CONFIRMATION_TITLE = i18n.translate( + 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettingsManagement.duplicateEntryConfirmationTitle', + { + defaultMessage: 'Duplicate entry?', + } +); + +export const DUPLICATE_ENTRY_CONFIRMATION_CONTENT = i18n.translate( + 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettingsManagement.duplicateEntryConfirmationContent', + { + defaultMessage: + 'Changing a knowledge base entry from global to private will create a private copy of the original global entry. Please delete the global entry if you would like to revoke the content for other users.', + } +); + export const MISSING_INDEX_ERROR = i18n.translate( 'xpack.elasticAssistant.assistant.settings.knowledgeBaseSettingsManagement.missingIndexError', { From 95ed9ad9fd52c70909dad4e70d3d4897dda874c4 Mon Sep 17 00:00:00 2001 From: "elastic-renovate-prod[bot]" <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2024 20:44:11 -0500 Subject: [PATCH 053/135] Update docker.elastic.co/wolfi/chainguard-base:latest Docker digest to de4d5b0 (main) (#197917) --- src/dev/build/tasks/os_packages/docker_generator/run.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dev/build/tasks/os_packages/docker_generator/run.ts b/src/dev/build/tasks/os_packages/docker_generator/run.ts index fcc9535d6bbb7..d764978c9db92 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/run.ts +++ b/src/dev/build/tasks/os_packages/docker_generator/run.ts @@ -51,7 +51,7 @@ export async function runDockerGenerator( */ if (flags.baseImage === 'wolfi') baseImageName = - 'docker.elastic.co/wolfi/chainguard-base:latest@sha256:973431347ad45f40e01afbbd010bf9de929c088a63382239b90dd84f39618bc8'; + 'docker.elastic.co/wolfi/chainguard-base:latest@sha256:de4d5b06ee2074eb716f29e72b170346fd4715e5f083fc83a378603ce5bd9ced'; let imageFlavor = ''; if (flags.baseImage === 'ubi') imageFlavor += `-ubi`; From 7ad937db574603e53aeebe69d591554801cf857b Mon Sep 17 00:00:00 2001 From: Jiawei Wu <74562234+JiaweiWu@users.noreply.github.com> Date: Sat, 26 Oct 2024 18:47:29 +0900 Subject: [PATCH 054/135] [Response Ops][Maintenance Window] Fix Maintenance Window Wildcard Scoped Queries (#194777) ## Summary Issue: https://github.com/elastic/sdh-kibana/issues/4923 Fixes maintenance window scoped query using wildcards by injecting the `analyze_wildcard` property to the DSL used to determine which alerts should be associated with the maintenance window. Also fixes the update route to correctly take into account the user's `allowLeadingWildcard` flag. It was implemented for the create route but not the update route. Fixes: https://github.com/elastic/kibana/issues/194763 ### To test: 1. Install sample data: ![image](https://github.com/user-attachments/assets/4be72fc8-e4ab-47a3-b5db-48f97b1827ae) 2. Create a maintenance window with the following scoped query: ![image](https://github.com/user-attachments/assets/e2d37fd0-b957-4e76-bea3-8d954651c557) 3. Create a ES query rule and trigger actions: ![image](https://github.com/user-attachments/assets/551f5145-9ab7-48c4-a48e-e674b4f0509a) 4. Assert the `maintenance_window_id` on the 4 alerts are set ![image](https://github.com/user-attachments/assets/7ace95d3-d992-4305-a564-cf3004c9ae9e) ### 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: Elastic Machine --- .../lib/get_summarized_alerts_query.ts | 25 ++- .../lib/inject_analyze_wildcard.test.ts | 169 ++++++++++++++++++ .../lib/inject_analyze_wildcard.ts | 30 ++++ .../update/update_maintenance_window.test.ts | 15 ++ .../update/update_maintenance_window.ts | 7 +- .../group3/maintenance_window_scoped_query.ts | 67 +++++++ 6 files changed, 306 insertions(+), 7 deletions(-) create mode 100644 x-pack/plugins/alerting/server/alerts_client/lib/inject_analyze_wildcard.test.ts create mode 100644 x-pack/plugins/alerting/server/alerts_client/lib/inject_analyze_wildcard.ts diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/get_summarized_alerts_query.ts b/x-pack/plugins/alerting/server/alerts_client/lib/get_summarized_alerts_query.ts index 4f0aa0fb003df..ab3edece0becc 100644 --- a/x-pack/plugins/alerting/server/alerts_client/lib/get_summarized_alerts_query.ts +++ b/x-pack/plugins/alerting/server/alerts_client/lib/get_summarized_alerts_query.ts @@ -39,6 +39,7 @@ import { import { SummarizedAlertsChunk, ScopedQueryAlerts } from '../..'; import { FormatAlert } from '../../types'; import { expandFlattenedAlert } from './format_alert'; +import { injectAnalyzeWildcard } from './inject_analyze_wildcard'; const MAX_ALERT_DOCS_TO_RETURN = 100; enum AlertTypes { @@ -310,9 +311,14 @@ export const getQueryByScopedQueries = ({ return; } - const scopedQueryFilter = generateAlertsFilterDSL({ - query: scopedQuery as AlertsFilter['query'], - })[0] as { bool: BoolQuery }; + const scopedQueryFilter = generateAlertsFilterDSL( + { + query: scopedQuery as AlertsFilter['query'], + }, + { + analyzeWildcard: true, + } + )[0] as { bool: BoolQuery }; aggs[id] = { filter: { @@ -324,6 +330,7 @@ export const getQueryByScopedQueries = ({ aggs: { alertId: { top_hits: { + size: MAX_ALERT_DOCS_TO_RETURN, _source: { includes: [ALERT_UUID], }, @@ -340,11 +347,19 @@ export const getQueryByScopedQueries = ({ }; }; -const generateAlertsFilterDSL = (alertsFilter: AlertsFilter): QueryDslQueryContainer[] => { +const generateAlertsFilterDSL = ( + alertsFilter: AlertsFilter, + options?: { analyzeWildcard?: boolean } +): QueryDslQueryContainer[] => { const filter: QueryDslQueryContainer[] = []; + const { analyzeWildcard = false } = options || {}; if (alertsFilter.query) { - filter.push(JSON.parse(alertsFilter.query.dsl!)); + const parsedQuery = JSON.parse(alertsFilter.query.dsl!); + if (analyzeWildcard) { + injectAnalyzeWildcard(parsedQuery); + } + filter.push(parsedQuery); } if (alertsFilter.timeframe) { filter.push( diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/inject_analyze_wildcard.test.ts b/x-pack/plugins/alerting/server/alerts_client/lib/inject_analyze_wildcard.test.ts new file mode 100644 index 0000000000000..1e1db14d928ba --- /dev/null +++ b/x-pack/plugins/alerting/server/alerts_client/lib/inject_analyze_wildcard.test.ts @@ -0,0 +1,169 @@ +/* + * 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 { injectAnalyzeWildcard } from './inject_analyze_wildcard'; + +const getQuery = (query?: string) => { + return { + bool: { + must: [], + filter: [ + { + bool: { + filter: [ + { + bool: { + should: [ + { + query_string: { + fields: ['kibana.alert.instance.id'], + query: query || '*elastic*', + }, + }, + ], + minimum_should_match: 1, + }, + }, + { + bool: { + should: [ + { + match: { + 'kibana.alert.action_group': 'test', + }, + }, + ], + minimum_should_match: 1, + }, + }, + ], + }, + }, + ], + should: [], + must_not: [ + { + match_phrase: { + _id: 'assdasdasd', + }, + }, + ], + }, + }; +}; +describe('injectAnalyzeWildcard', () => { + test('should inject analyze_wildcard field', () => { + const query = getQuery(); + injectAnalyzeWildcard(query); + expect(query).toMatchInlineSnapshot(` + Object { + "bool": Object { + "filter": Array [ + Object { + "bool": Object { + "filter": Array [ + Object { + "bool": Object { + "minimum_should_match": 1, + "should": Array [ + Object { + "query_string": Object { + "analyze_wildcard": true, + "fields": Array [ + "kibana.alert.instance.id", + ], + "query": "*elastic*", + }, + }, + ], + }, + }, + Object { + "bool": Object { + "minimum_should_match": 1, + "should": Array [ + Object { + "match": Object { + "kibana.alert.action_group": "test", + }, + }, + ], + }, + }, + ], + }, + }, + ], + "must": Array [], + "must_not": Array [ + Object { + "match_phrase": Object { + "_id": "assdasdasd", + }, + }, + ], + "should": Array [], + }, + } + `); + }); + + test('should not inject analyze_wildcard if the query does not contain *', () => { + const query = getQuery('test'); + injectAnalyzeWildcard(query); + expect(query).toMatchInlineSnapshot(` + Object { + "bool": Object { + "filter": Array [ + Object { + "bool": Object { + "filter": Array [ + Object { + "bool": Object { + "minimum_should_match": 1, + "should": Array [ + Object { + "query_string": Object { + "fields": Array [ + "kibana.alert.instance.id", + ], + "query": "test", + }, + }, + ], + }, + }, + Object { + "bool": Object { + "minimum_should_match": 1, + "should": Array [ + Object { + "match": Object { + "kibana.alert.action_group": "test", + }, + }, + ], + }, + }, + ], + }, + }, + ], + "must": Array [], + "must_not": Array [ + Object { + "match_phrase": Object { + "_id": "assdasdasd", + }, + }, + ], + "should": Array [], + }, + } + `); + }); +}); diff --git a/x-pack/plugins/alerting/server/alerts_client/lib/inject_analyze_wildcard.ts b/x-pack/plugins/alerting/server/alerts_client/lib/inject_analyze_wildcard.ts new file mode 100644 index 0000000000000..58a4f89948973 --- /dev/null +++ b/x-pack/plugins/alerting/server/alerts_client/lib/inject_analyze_wildcard.ts @@ -0,0 +1,30 @@ +/* + * 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 { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +export const injectAnalyzeWildcard = (query: QueryDslQueryContainer): void => { + if (!query) { + return; + } + + if (Array.isArray(query)) { + return query.forEach((child) => injectAnalyzeWildcard(child)); + } + + if (typeof query === 'object') { + Object.entries(query).forEach(([key, value]) => { + if (key !== 'query_string') { + return injectAnalyzeWildcard(value); + } + + if (typeof value.query === 'string' && value.query.includes('*')) { + value.analyze_wildcard = true; + } + }); + } +}; diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.test.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.test.ts index 6797b4f57d508..e377fb3209d63 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.test.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.test.ts @@ -135,6 +135,21 @@ describe('MaintenanceWindowClient - update', () => { eventEndTime: '2023-03-05T01:00:00.000Z', }) ); + + expect(uiSettings.get).toHaveBeenCalledTimes(3); + expect(uiSettings.get.mock.calls).toMatchInlineSnapshot(` + Array [ + Array [ + "query:allowLeadingWildcards", + ], + Array [ + "query:queryString:options", + ], + Array [ + "courier:ignoreFilterIfFieldNotInIndex", + ], + ] + `); }); it('should not regenerate all events if rrule and duration did not change', async () => { diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.ts index afff024b186c2..cb9d5ded1f7b2 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.ts @@ -10,6 +10,7 @@ import Boom from '@hapi/boom'; import { buildEsQuery, Filter } from '@kbn/es-query'; import type { MaintenanceWindowClientContext } from '../../../../../common'; import { getScopedQueryErrorMessage } from '../../../../../common'; +import { getEsQueryConfig } from '../../../../lib/get_es_query_config'; import type { MaintenanceWindow } from '../../types'; import { generateMaintenanceWindowEvents, @@ -45,9 +46,10 @@ async function updateWithOCC( context: MaintenanceWindowClientContext, params: UpdateMaintenanceWindowParams ): Promise { - const { savedObjectsClient, getModificationMetadata, logger } = context; + const { savedObjectsClient, getModificationMetadata, logger, uiSettings } = context; const { id, data } = params; const { title, enabled, duration, rRule, categoryIds, scopedQuery } = data; + const esQueryConfig = await getEsQueryConfig(uiSettings); try { updateMaintenanceWindowParamsSchema.validate(params); @@ -62,7 +64,8 @@ async function updateWithOCC( buildEsQuery( undefined, [{ query: scopedQuery.kql, language: 'kuery' }], - scopedQuery.filters as Filter[] + scopedQuery.filters as Filter[], + esQueryConfig ) ); scopedQueryWithGeneratedValue = { diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/maintenance_window_scoped_query.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/maintenance_window_scoped_query.ts index 03880f79b5b14..2c43649eb7822 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/maintenance_window_scoped_query.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group3/maintenance_window_scoped_query.ts @@ -245,5 +245,72 @@ export default function maintenanceWindowScopedQueryTests({ getService }: FtrPro retry, }); }); + + it('should associate alerts when scoped query contains wildcards', async () => { + await createMaintenanceWindow({ + supertest, + objectRemover, + overwrites: { + scoped_query: { + kql: 'kibana.alert.rule.name: *test*', + filters: [], + }, + category_ids: ['management'], + }, + }); + + // Create action and rule + const action = await await createAction({ + supertest, + objectRemover, + }); + + const { body: rule } = await supertestWithoutAuth + .post(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + name: 'rule-test-rule', + rule_type_id: 'test.always-firing-alert-as-data', + schedule: { interval: '24h' }, + tags: ['test'], + throttle: undefined, + notify_when: 'onActiveAlert', + params: { + index: alertAsDataIndex, + reference: 'test', + }, + actions: [ + { + id: action.id, + group: 'default', + params: {}, + }, + { + id: action.id, + group: 'recovered', + params: {}, + }, + ], + }) + ) + .expect(200); + + objectRemover.add(Spaces.space1.id, rule.id, 'rule', 'alerting'); + + // Run the first time - active + await getRuleEvents({ + id: rule.id, + activeInstance: 2, + retry, + getService, + }); + + await expectNoActionsFired({ + id: rule.id, + supertest, + retry, + }); + }); }); } From fa775970754b4a598adea64f1756038dd7c46f91 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Sun, 27 Oct 2024 17:38:17 +1100 Subject: [PATCH 055/135] [api-docs] 2024-10-27 Daily api_docs build (#197930) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/873 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 4 +- .../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/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_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.mdx | 2 +- api_docs/data_quality.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_usage.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.devdocs.json | 88 +- api_docs/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 4 +- 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/discover_shared.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.devdocs.json | 192 ++++ 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/entities_data_access.mdx | 2 +- api_docs/entity_manager.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/esql.mdx | 2 +- api_docs/esql_data_grid.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/fields_metadata.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.devdocs.json | 108 +- api_docs/fleet.mdx | 4 +- 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.devdocs.json | 81 +- api_docs/index_management.mdx | 4 +- api_docs/inference.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/integration_assistant.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/inventory.mdx | 2 +- api_docs/investigate.mdx | 2 +- api_docs/investigate_app.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_ai_assistant.devdocs.json | 10 +- api_docs/kbn_ai_assistant.mdx | 2 +- api_docs/kbn_ai_assistant_common.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_comparators.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_grouping.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_collection_utils.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_types.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_avc_banner.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_cbor.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_cloud_security_posture.mdx | 2 +- .../kbn_cloud_security_posture_common.mdx | 2 +- ..._cloud_security_posture_graph.devdocs.json | 449 ++++++++ api_docs/kbn_cloud_security_posture_graph.mdx | 36 + 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 +- ...ent_management_content_insights_public.mdx | 2 +- ...ent_management_content_insights_server.mdx | 2 +- ...bn_content_management_favorites_public.mdx | 2 +- ...bn_content_management_favorites_server.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 +- .../kbn_content_management_user_profiles.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- .../kbn_core_analytics_browser.devdocs.json | 48 + api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- .../kbn_core_analytics_server.devdocs.json | 48 + 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_feature_flags_browser.mdx | 2 +- ...bn_core_feature_flags_browser_internal.mdx | 2 +- .../kbn_core_feature_flags_browser_mocks.mdx | 2 +- api_docs/kbn_core_feature_flags_server.mdx | 2 +- ...kbn_core_feature_flags_server_internal.mdx | 2 +- .../kbn_core_feature_flags_server_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_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.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 +- .../kbn_discover_contextual_components.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_entities_schema.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_editor.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 +- ...common_functional_ui_services.devdocs.json | 6 +- .../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_grid_layout.mdx | 2 +- api_docs/kbn_grouping.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 +- ...index_management_shared_types.devdocs.json | 81 +- .../kbn_index_management_shared_types.mdx | 4 +- api_docs/kbn_inference_integration_flyout.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_investigation_shared.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_ipynb.mdx | 2 +- api_docs/kbn_item_buffer.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_json_schemas.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- api_docs/kbn_language_documentation.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_manifest.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_field_stats_flyout.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_parse_interval.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_ml_validators.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_object_versioning_utils.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_rule_utils.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_observability_logs_overview.mdx | 2 +- ...kbn_observability_synthetics_test_data.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 | 252 +++++ api_docs/kbn_presentation_publishing.mdx | 4 +- api_docs/kbn_product_doc_artifact_builder.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_hooks.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_recently_accessed.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 +- .../kbn_response_ops_feature_flag_service.mdx | 2 +- api_docs/kbn_response_ops_rule_params.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rollup.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_screenshotting_server.mdx | 2 +- api_docs/kbn_search_api_keys_components.mdx | 2 +- api_docs/kbn_search_api_keys_server.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_search_shared_ui.mdx | 2 +- api_docs/kbn_search_types.mdx | 2 +- api_docs/kbn_security_api_key_management.mdx | 2 +- api_docs/kbn_security_authorization_core.mdx | 2 +- ...kbn_security_authorization_core_common.mdx | 2 +- api_docs/kbn_security_form_components.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 +- ..._security_plugin_types_server.devdocs.json | 4 + api_docs/kbn_security_plugin_types_server.mdx | 2 +- .../kbn_security_role_management_model.mdx | 2 +- .../kbn_security_solution_common.devdocs.json | 4 +- api_docs/kbn_security_solution_common.mdx | 2 +- ...kbn_security_solution_distribution_bar.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 +- api_docs/kbn_security_ui_components.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_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 +- .../kbn_server_route_repository_client.mdx | 2 +- .../kbn_server_route_repository_utils.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_table_persist.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_predicates.mdx | 2 +- api_docs/kbn_sse_utils.mdx | 2 +- api_docs/kbn_sse_utils_client.mdx | 2 +- api_docs/kbn_sse_utils_server.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_synthetics_e2e.mdx | 2 +- api_docs/kbn_synthetics_private_location.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_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_transpose_utils.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_try_in_console.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_unsaved_changes_prompt.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.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.devdocs.json | 23 +- 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_data_access.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 | 10 +- 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 | 25 +- 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.devdocs.json | 961 +----------------- api_docs/saved_objects_tagging.mdx | 7 +- .../saved_objects_tagging_oss.devdocs.json | 86 +- api_docs/saved_objects_tagging_oss.mdx | 4 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/search_assistant.mdx | 2 +- api_docs/search_connectors.mdx | 2 +- api_docs/search_homepage.mdx | 2 +- api_docs/search_indices.mdx | 2 +- api_docs/search_inference_endpoints.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.mdx | 2 +- api_docs/security.devdocs.json | 4 + 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.devdocs.json | 31 +- api_docs/task_manager.mdx | 4 +- 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/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 +- 779 files changed, 2084 insertions(+), 2020 deletions(-) create mode 100644 api_docs/kbn_cloud_security_posture_graph.devdocs.json create mode 100644 api_docs/kbn_cloud_security_posture_graph.mdx diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 0e8f3acdf40b0..8a8ae5631dca2 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-10-25 +date: 2024-10-27 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 502eaa848e05f..1ed8c5a686eb9 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; -Contact [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) for questions regarding this plugin. +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index 97bb4414983cf..c14e3705bd2e9 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-10-25 +date: 2024-10-27 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 2c71a66c0921b..1788e8089ee2e 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-10-25 +date: 2024-10-27 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 29ec99ec3dc76..90941040d30c1 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-10-25 +date: 2024-10-27 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 6d05f5f6c6b43..1fec04dcb2f5c 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-10-25 +date: 2024-10-27 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 f2b509a8adb9f..00f34543a83c7 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index e8a6e40a67d61..7be91a6eb8b54 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-10-25 +date: 2024-10-27 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 4482e8b00a06b..72f12df9761b5 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-10-25 +date: 2024-10-27 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 8de6048ddbe5c..f0cc1f51d721e 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-10-25 +date: 2024-10-27 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 ef50f06a0721b..3f5d89a1fb224 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-10-25 +date: 2024-10-27 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 a6e11745aa9a0..ab7d960a8ecd4 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-10-25 +date: 2024-10-27 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 a5f6401ba0a5d..b7333d341f06d 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-10-25 +date: 2024-10-27 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 3a111a23fb7c0..420c49a1726b4 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-10-25 +date: 2024-10-27 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 d0cf6a71eb6b2..f91f25e7aa761 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index f799cad3d0f95..2f6173f82ac01 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-10-25 +date: 2024-10-27 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 b94b5c9da2338..b1fedda3dff27 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-10-25 +date: 2024-10-27 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 e6245443103a4..76bc33b38abf0 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-10-25 +date: 2024-10-27 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 790dbe005ee65..60e7b4cc84811 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-10-25 +date: 2024-10-27 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 d19329fe3ea6b..603fc1cfb35cf 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-10-25 +date: 2024-10-27 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 b954f6a417dc7..711a2a495d177 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-10-25 +date: 2024-10-27 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 7be289077d18a..df047269fcc68 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-10-25 +date: 2024-10-27 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 3ee94254c413f..ebb60eca8749f 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index 1fbb28b6097e0..bb11b03ab4f9d 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 439fed69df251..c1d7c849b9210 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-10-25 +date: 2024-10-27 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 66a4195bfda18..80d16478d471d 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_usage.mdx b/api_docs/data_usage.mdx index 7fd671e4fc336..80340e3a9b68e 100644 --- a/api_docs/data_usage.mdx +++ b/api_docs/data_usage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataUsage title: "dataUsage" image: https://source.unsplash.com/400x175/?github description: API docs for the dataUsage plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataUsage'] --- import dataUsageObj from './data_usage.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 33a037e036db4..e6604fa3479d4 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-10-25 +date: 2024-10-27 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 d9c40b66b8ef7..53c0dba9e0d33 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-10-25 +date: 2024-10-27 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 cf4845bfe9615..0011e4f1d9c59 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-10-25 +date: 2024-10-27 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 9e9d5a4d41216..5358eb04e71a8 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-10-25 +date: 2024-10-27 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 2059562d37d7d..08df37548d007 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.devdocs.json b/api_docs/dataset_quality.devdocs.json index 6ab79f43aaa32..b0a5233462aef 100644 --- a/api_docs/dataset_quality.devdocs.json +++ b/api_docs/dataset_quality.devdocs.json @@ -247,6 +247,46 @@ "DatasetQualityRouteHandlerResources", ", { integrations: ({ name: string; } & { title?: string | undefined; version?: string | undefined; icons?: ({ src: string; } & { path?: string | undefined; size?: string | undefined; title?: string | undefined; type?: string | undefined; })[] | undefined; datasets?: { [x: string]: string; } | undefined; })[]; }, ", "DatasetQualityRouteCreateOptions", + ">; \"POST /internal/dataset_quality/data_streams/{dataStream}/rollover\": ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRoute", + "text": "ServerRoute" + }, + "<\"POST /internal/dataset_quality/data_streams/{dataStream}/rollover\", ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ dataStream: ", + "StringC", + "; }>; }>, ", + "DatasetQualityRouteHandlerResources", + ", { acknowledged: boolean; }, ", + "DatasetQualityRouteCreateOptions", + ">; \"PUT /internal/dataset_quality/data_streams/{dataStream}/update_field_limit\": ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRoute", + "text": "ServerRoute" + }, + "<\"PUT /internal/dataset_quality/data_streams/{dataStream}/update_field_limit\", ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ dataStream: ", + "StringC", + "; }>; body: ", + "TypeC", + "<{ newFieldLimit: ", + "NumberC", + "; }>; }>, ", + "DatasetQualityRouteHandlerResources", + ", { isComponentTemplateUpdated: boolean | undefined; isLatestBackingIndexUpdated: boolean | undefined; customComponentTemplateName: string; } & { error?: string | undefined; }, ", + "DatasetQualityRouteCreateOptions", ">; \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_field/{degradedField}/analyze\": ", { "pluginId": "@kbn/server-route-repository-utils", @@ -269,7 +309,7 @@ "StringC", "; }>; }>, ", "DatasetQualityRouteHandlerResources", - ", { isFieldLimitIssue: boolean; fieldCount: number; totalFieldLimit: number; } & { ignoreMalformed?: boolean | undefined; nestedFieldLimit?: number | undefined; fieldMapping?: { type?: string | undefined; ignore_above?: number | undefined; } | undefined; }, ", + ", { isFieldLimitIssue: boolean; fieldCount: number; totalFieldLimit: number; } & { ignoreMalformed?: boolean | undefined; nestedFieldLimit?: number | undefined; fieldMapping?: { type?: string | undefined; ignore_above?: number | undefined; } | undefined; defaultPipeline?: string | undefined; }, ", "DatasetQualityRouteCreateOptions", ">; \"GET /internal/dataset_quality/data_streams/{dataStream}/settings\": ", { @@ -287,7 +327,7 @@ "StringC", "; }>; }>, ", "DatasetQualityRouteHandlerResources", - ", { lastBackingIndexName: string; } & { createdOn?: number | null | undefined; integration?: string | undefined; datasetUserPrivileges?: ({ canMonitor: boolean; } & { canRead: boolean; canViewIntegrations: boolean; }) | undefined; }, ", + ", { lastBackingIndexName?: string | undefined; indexTemplate?: string | undefined; createdOn?: number | null | undefined; integration?: string | undefined; datasetUserPrivileges?: ({ canMonitor: boolean; } & { canRead: boolean; canViewIntegrations: boolean; }) | undefined; }, ", "DatasetQualityRouteCreateOptions", ">; \"GET /internal/dataset_quality/data_streams/{dataStream}/details\": ", { @@ -548,6 +588,46 @@ "DatasetQualityRouteHandlerResources", ", { integrations: ({ name: string; } & { title?: string | undefined; version?: string | undefined; icons?: ({ src: string; } & { path?: string | undefined; size?: string | undefined; title?: string | undefined; type?: string | undefined; })[] | undefined; datasets?: { [x: string]: string; } | undefined; })[]; }, ", "DatasetQualityRouteCreateOptions", + ">; \"POST /internal/dataset_quality/data_streams/{dataStream}/rollover\": ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRoute", + "text": "ServerRoute" + }, + "<\"POST /internal/dataset_quality/data_streams/{dataStream}/rollover\", ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ dataStream: ", + "StringC", + "; }>; }>, ", + "DatasetQualityRouteHandlerResources", + ", { acknowledged: boolean; }, ", + "DatasetQualityRouteCreateOptions", + ">; \"PUT /internal/dataset_quality/data_streams/{dataStream}/update_field_limit\": ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRoute", + "text": "ServerRoute" + }, + "<\"PUT /internal/dataset_quality/data_streams/{dataStream}/update_field_limit\", ", + "TypeC", + "<{ path: ", + "TypeC", + "<{ dataStream: ", + "StringC", + "; }>; body: ", + "TypeC", + "<{ newFieldLimit: ", + "NumberC", + "; }>; }>, ", + "DatasetQualityRouteHandlerResources", + ", { isComponentTemplateUpdated: boolean | undefined; isLatestBackingIndexUpdated: boolean | undefined; customComponentTemplateName: string; } & { error?: string | undefined; }, ", + "DatasetQualityRouteCreateOptions", ">; \"GET /internal/dataset_quality/data_streams/{dataStream}/degraded_field/{degradedField}/analyze\": ", { "pluginId": "@kbn/server-route-repository-utils", @@ -570,7 +650,7 @@ "StringC", "; }>; }>, ", "DatasetQualityRouteHandlerResources", - ", { isFieldLimitIssue: boolean; fieldCount: number; totalFieldLimit: number; } & { ignoreMalformed?: boolean | undefined; nestedFieldLimit?: number | undefined; fieldMapping?: { type?: string | undefined; ignore_above?: number | undefined; } | undefined; }, ", + ", { isFieldLimitIssue: boolean; fieldCount: number; totalFieldLimit: number; } & { ignoreMalformed?: boolean | undefined; nestedFieldLimit?: number | undefined; fieldMapping?: { type?: string | undefined; ignore_above?: number | undefined; } | undefined; defaultPipeline?: string | undefined; }, ", "DatasetQualityRouteCreateOptions", ">; \"GET /internal/dataset_quality/data_streams/{dataStream}/settings\": ", { @@ -588,7 +668,7 @@ "StringC", "; }>; }>, ", "DatasetQualityRouteHandlerResources", - ", { lastBackingIndexName: string; } & { createdOn?: number | null | undefined; integration?: string | undefined; datasetUserPrivileges?: ({ canMonitor: boolean; } & { canRead: boolean; canViewIntegrations: boolean; }) | undefined; }, ", + ", { lastBackingIndexName?: string | undefined; indexTemplate?: string | undefined; createdOn?: number | null | undefined; integration?: string | undefined; datasetUserPrivileges?: ({ canMonitor: boolean; } & { canRead: boolean; canViewIntegrations: boolean; }) | undefined; }, ", "DatasetQualityRouteCreateOptions", ">; \"GET /internal/dataset_quality/data_streams/{dataStream}/details\": ", { diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index 6db559a156159..018c9c211cbd2 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-10-25 +date: 2024-10-27 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 7c89950343798..6f14cde250d0d 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 6cd00c7d52e93..310f956f64ed0 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -1371,7 +1371,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode)+ 7 more | 8.8.0 | | | [get_is_alert_suppression_active.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.ts#:~:text=license%24), [create_threat_signals.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signals.ts#:~:text=license%24), [query.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts#:~:text=license%24), [threshold.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.ts#:~:text=license%24), [get_is_alert_suppression_active.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.test.ts#:~:text=license%24), [get_is_alert_suppression_active.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.test.ts#:~:text=license%24), [get_is_alert_suppression_active.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.test.ts#:~:text=license%24) | 8.8.0 | | | [route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts#:~:text=authc) | - | -| | [suggest_user_profiles_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts#:~:text=userProfiles), [suggest_user_profiles_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts#:~:text=userProfiles) | - | +| | [suggest_user_profiles_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts#:~:text=userProfiles), [get_notes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts#:~:text=userProfiles), [suggest_user_profiles_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts#:~:text=userProfiles), [get_notes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts#:~:text=userProfiles) | - | | | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedCellValueElementProps), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedCellValueElementProps) | - | | | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedRowRenderer), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedRowRenderer) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=BeatFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=BeatFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=BeatFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=BeatFields) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 6b62d0edd3a04..890f5374f7487 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index aeb50204b8302..703b8da396eb3 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-10-25 +date: 2024-10-27 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 e25fe1fca4c00..8f01412ab0e32 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-10-25 +date: 2024-10-27 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 a19a9d1d910cb..ad57874c2a8db 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index 8cf6d5811c890..8f9f97b245402 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 22fc7f08a3c74..cae52eca2f54b 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-10-25 +date: 2024-10-27 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 509f4864481db..03ecd7c62185c 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-10-25 +date: 2024-10-27 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 07af1a6da01b0..f462c063c1dfc 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -6106,6 +6106,198 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "embeddable", + "id": "def-public.Embeddable.hasLockedHoverActions$", + "type": "Object", + "tags": [], + "label": "hasLockedHoverActions$", + "description": [], + "signature": [ + "{ source: ", + "Observable", + " | undefined; readonly value: boolean; error: (err: any) => void; forEach: { (next: (value: boolean) => void): Promise; (next: (value: boolean) => void, promiseCtor: PromiseConstructorLike): Promise; }; complete: () => void; getValue: () => boolean; closed: boolean; pipe: { (): ", + "Observable", + ";
(op1: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + ", op8: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + ", op8: ", + "OperatorFunction", + ", op9: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + ", op8: ", + "OperatorFunction", + ", op9: ", + "OperatorFunction", + ", ...operations: ", + "OperatorFunction", + "[]): ", + "Observable", + "; }; operator: ", + "Operator", + " | undefined; lift: (operator: ", + "Operator", + ") => ", + "Observable", + "; subscribe: { (observerOrNext?: Partial<", + "Observer", + "> | ((value: boolean) => void) | undefined): ", + "Subscription", + "; (next?: ((value: boolean) => void) | null | undefined, error?: ((error: any) => void) | null | undefined, complete?: (() => void) | null | undefined): ", + "Subscription", + "; }; toPromise: { (): Promise; (PromiseCtor: PromiseConstructor): Promise; (PromiseCtor: PromiseConstructorLike): Promise; }; observers: ", + "Observer", + "[]; isStopped: boolean; hasError: boolean; thrownError: any; unsubscribe: () => void; readonly observed: boolean; asObservable: () => ", + "Observable", + "; }" + ], + "path": "src/plugins/embeddable/public/lib/embeddables/embeddable.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "embeddable", + "id": "def-public.Embeddable.lockHoverActions", + "type": "Function", + "tags": [], + "label": "lockHoverActions", + "description": [], + "signature": [ + "(lock: boolean) => void" + ], + "path": "src/plugins/embeddable/public/lib/embeddables/embeddable.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "embeddable", + "id": "def-public.Embeddable.lockHoverActions.$1", + "type": "boolean", + "tags": [], + "label": "lock", + "description": [], + "path": "packages/presentation/presentation_publishing/interfaces/can_lock_hover_actions.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, { "parentPluginId": "embeddable", "id": "def-public.Embeddable.getEditHref", diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 91996d48362d7..d76b9fb13d3e0 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-10-25 +date: 2024-10-27 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 | |-------------------|-----------|------------------------|-----------------| -| 575 | 1 | 465 | 9 | +| 578 | 1 | 468 | 9 | ## Client diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index efccd7663a031..da083fcc66ff5 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-10-25 +date: 2024-10-27 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 9aed88578c119..7ad2ea023d040 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-10-25 +date: 2024-10-27 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 bf3f296cc486d..113e77b819835 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entities_data_access.mdx b/api_docs/entities_data_access.mdx index b02c7a918d491..3ed72f153f33a 100644 --- a/api_docs/entities_data_access.mdx +++ b/api_docs/entities_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entitiesDataAccess title: "entitiesDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the entitiesDataAccess plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entitiesDataAccess'] --- import entitiesDataAccessObj from './entities_data_access.devdocs.json'; diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index 39af0d3afddde..5fbb8b2b79322 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index c3b53d34b2a8e..f27429f129e5c 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx index 836841fabf53e..1307f79a40e7c 100644 --- a/api_docs/esql.mdx +++ b/api_docs/esql.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esql title: "esql" image: https://source.unsplash.com/400x175/?github description: API docs for the esql plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] --- import esqlObj from './esql.devdocs.json'; diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index 2b2a7808e9152..9d32ba9cc36d4 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index bc3bb187fd016..48b9e810f4c29 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-10-25 +date: 2024-10-27 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 8f6294f23a1c7..db018d3ed1588 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-10-25 +date: 2024-10-27 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 e2ec68ef82e07..f4930f61cd501 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-10-25 +date: 2024-10-27 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 1a3d2a96b6669..4259ca677457c 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-10-25 +date: 2024-10-27 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 af9e6ebeddb45..da6c0ce1be16d 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-10-25 +date: 2024-10-27 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 ae49b77013d00..010826abc4e78 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-10-25 +date: 2024-10-27 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 8e32a8a630c47..e99a4fef12965 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-10-25 +date: 2024-10-27 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 ef905b8669834..461cc9a2e29b1 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-10-25 +date: 2024-10-27 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 80f8f1d5b18a9..c6b69200387e7 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-10-25 +date: 2024-10-27 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 ac4d8b408de5d..520df905ef1ea 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-10-25 +date: 2024-10-27 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 eee54e1648ee7..7b9bb574c506e 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-10-25 +date: 2024-10-27 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 bbfe62e67bb37..b2b478387650c 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-10-25 +date: 2024-10-27 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 012a05f5085da..1131fae437abc 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-10-25 +date: 2024-10-27 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 aae29be9303ab..f6a56adebe9bd 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-10-25 +date: 2024-10-27 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 5a7ac495b4a3f..73bcf450885e2 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-10-25 +date: 2024-10-27 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 038f9bf9dac65..d18450bdcbde1 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-10-25 +date: 2024-10-27 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 f32b1411e2272..5726eb26f5d92 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-10-25 +date: 2024-10-27 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 c1446d09c2d48..57eff52602fbc 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-10-25 +date: 2024-10-27 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 f13916cc4a223..614484c4e6093 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-10-25 +date: 2024-10-27 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 a469fcd55f650..b3846ad3c59d0 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index a78dac4200a5f..d757a535ea450 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] --- import fieldsMetadataObj from './fields_metadata.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 2c37d2e76dbec..bed6b4d91996c 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-10-25 +date: 2024-10-27 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 ad4882b5bbc90..8c071917c5de8 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-10-25 +date: 2024-10-27 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 df2e6d24ea945..41953bc2408cf 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index a0ccb47e00b5e..7fee0ab161b3f 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -11646,41 +11646,9 @@ "label": "runExternalCallbacks", "description": [], "signature": [ - "(externalCallbackType: A, packagePolicy: A extends \"packagePolicyDelete\" ? ", - "DeletePackagePoliciesResponse", - " : A extends \"packagePolicyPostDelete\" ? ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.PostDeletePackagePoliciesResponse", - "text": "PostDeletePackagePoliciesResponse" - }, - " : A extends \"packagePolicyPostCreate\" ? ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.PackagePolicy", - "text": "PackagePolicy" - }, - " : A extends \"packagePolicyUpdate\" ? ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.UpdatePackagePolicy", - "text": "UpdatePackagePolicy" - }, - " : ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.NewPackagePolicy", - "text": "NewPackagePolicy" - }, - ", soClient: ", + "(externalCallbackType: A, packagePolicy: ", + "RunExternalCallbacksPackagePolicyArgument", + ", soClient: ", { "pluginId": "@kbn/core-saved-objects-api-server", "scope": "server", @@ -11712,31 +11680,9 @@ "section": "def-server.KibanaRequest", "text": "KibanaRequest" }, - " | undefined) => Promise" + " | undefined) => Promise<", + "RunExternalCallbacksPackagePolicyResponse", + ">" ], "path": "x-pack/plugins/fleet/server/services/package_policy_service.ts", "deprecated": false, @@ -11765,40 +11711,8 @@ "label": "packagePolicy", "description": [], "signature": [ - "A extends \"packagePolicyDelete\" ? ", - "DeletePackagePoliciesResponse", - " : A extends \"packagePolicyPostDelete\" ? ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.PostDeletePackagePoliciesResponse", - "text": "PostDeletePackagePoliciesResponse" - }, - " : A extends \"packagePolicyPostCreate\" ? ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.PackagePolicy", - "text": "PackagePolicy" - }, - " : A extends \"packagePolicyUpdate\" ? ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.UpdatePackagePolicy", - "text": "UpdatePackagePolicy" - }, - " : ", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.NewPackagePolicy", - "text": "NewPackagePolicy" - } + "RunExternalCallbacksPackagePolicyArgument", + "" ], "path": "x-pack/plugins/fleet/server/services/package_policy_service.ts", "deprecated": false, @@ -12633,9 +12547,13 @@ " | ", "ExternalCallbackUpdate", " | ", + "ExternalCallbackPostUpdate", + " | ", "ExternalCallbackAgentPolicyCreate", " | ", - "ExternalCallbackAgentPolicyUpdate" + "ExternalCallbackAgentPolicyUpdate", + " | ", + "ExternalCallbackAgentPolicyPostUpdate" ], "path": "x-pack/plugins/fleet/server/types/extensions.ts", "deprecated": false, diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 1b9bed79143eb..45ad662189be7 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1426 | 5 | 1301 | 76 | +| 1426 | 5 | 1301 | 80 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 1b946c28aa6c1..78226015972a6 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-10-25 +date: 2024-10-27 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 f0cce41a5cf8a..e9532f412b8ca 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-10-25 +date: 2024-10-27 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 65cc10185309d..7c3ba61f8bec4 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-10-25 +date: 2024-10-27 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 2024262876c0a..5f2df53dbc4f7 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-10-25 +date: 2024-10-27 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 b6b938d38fee8..f2f195bf61fe1 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.devdocs.json b/api_docs/index_management.devdocs.json index 0b00cab28949e..ae73ce8dc81a9 100644 --- a/api_docs/index_management.devdocs.json +++ b/api_docs/index_management.devdocs.json @@ -347,65 +347,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "indexManagement", - "id": "def-public.IndexManagementLocatorParams", - "type": "Interface", - "tags": [], - "label": "IndexManagementLocatorParams", - "description": [], - "signature": [ - { - "pluginId": "@kbn/index-management-shared-types", - "scope": "common", - "docId": "kibKbnIndexManagementSharedTypesPluginApi", - "section": "def-common.IndexManagementLocatorParams", - "text": "IndexManagementLocatorParams" - }, - " extends ", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.SerializableRecord", - "text": "SerializableRecord" - } - ], - "path": "x-pack/packages/index-management/index_management_shared_types/src/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "indexManagement", - "id": "def-public.IndexManagementLocatorParams.page", - "type": "string", - "tags": [], - "label": "page", - "description": [], - "signature": [ - "\"data_streams_details\"" - ], - "path": "x-pack/packages/index-management/index_management_shared_types/src/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "indexManagement", - "id": "def-public.IndexManagementLocatorParams.dataStreamName", - "type": "string", - "tags": [], - "label": "dataStreamName", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "x-pack/packages/index-management/index_management_shared_types/src/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "indexManagement", "id": "def-public.IndexMappingProps", @@ -472,6 +413,28 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "indexManagement", + "id": "def-public.IndexManagementLocatorParams", + "type": "Type", + "tags": [], + "label": "IndexManagementLocatorParams", + "description": [], + "signature": [ + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + " & ({ page: \"data_streams_details\"; dataStreamName?: string | undefined; } | { page: \"index_template\"; indexTemplate: string; } | { page: \"component_template\"; componentTemplate: string; })" + ], + "path": "x-pack/packages/index-management/index_management_shared_types/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "objects": [], diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 365c1d0d4c5b9..13cb91f0a3580 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kiban | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 252 | 0 | 247 | 1 | +| 250 | 0 | 245 | 1 | ## Client diff --git a/api_docs/inference.mdx b/api_docs/inference.mdx index dc6b9385358be..6b61097f329a0 100644 --- a/api_docs/inference.mdx +++ b/api_docs/inference.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inference title: "inference" image: https://source.unsplash.com/400x175/?github description: API docs for the inference plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inference'] --- import inferenceObj from './inference.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 92065c50ce107..d1547ef030726 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-10-25 +date: 2024-10-27 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 3cb617fe3d3f9..795b3cf15cb61 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-10-25 +date: 2024-10-27 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 0b9e3bc75240b..b7bfbef7eef61 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index 2ed577c134c0a..40bb0d65010e5 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 1585a7ece5051..849cdc2e1626b 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/inventory.mdx b/api_docs/inventory.mdx index 877c4fa6083ca..d7773bda894cf 100644 --- a/api_docs/inventory.mdx +++ b/api_docs/inventory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inventory title: "inventory" image: https://source.unsplash.com/400x175/?github description: API docs for the inventory plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inventory'] --- import inventoryObj from './inventory.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index aa0696f8de6dd..f421ba69c9838 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index 23f61a87f42a2..233bffbba8f1f 100644 --- a/api_docs/investigate_app.mdx +++ b/api_docs/investigate_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigateApp title: "investigateApp" image: https://source.unsplash.com/400x175/?github description: API docs for the investigateApp plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index f97fd9a1c7040..5a2a5db134915 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant.devdocs.json b/api_docs/kbn_ai_assistant.devdocs.json index 5940c3c6fe125..fd7ac303da36b 100644 --- a/api_docs/kbn_ai_assistant.devdocs.json +++ b/api_docs/kbn_ai_assistant.devdocs.json @@ -55,7 +55,7 @@ "section": "def-public.FlyoutPositionMode", "text": "FlyoutPositionMode" }, - ") => void) | undefined; navigateToConversation: (conversationId?: string | undefined) => void; }) => React.JSX.Element" + ") => void) | undefined; navigateToConversation?: ((conversationId?: string | undefined) => void) | undefined; }) => React.JSX.Element" ], "path": "x-pack/packages/kbn-ai-assistant/src/chat/chat_body.tsx", "deprecated": false, @@ -311,7 +311,7 @@ "label": "navigateToConversation", "description": [], "signature": [ - "(conversationId?: string | undefined) => void" + "((conversationId?: string | undefined) => void) | undefined" ], "path": "x-pack/packages/kbn-ai-assistant/src/chat/chat_body.tsx", "deprecated": false, @@ -365,7 +365,7 @@ "section": "def-public.FlyoutPositionMode", "text": "FlyoutPositionMode" }, - " | undefined; isOpen: boolean; onClose: () => void; navigateToConversation(conversationId?: string | undefined): void; }) => React.JSX.Element | null" + " | undefined; isOpen: boolean; onClose: () => void; navigateToConversation?: ((conversationId?: string | undefined) => void) | undefined; }) => React.JSX.Element | null" ], "path": "x-pack/packages/kbn-ai-assistant/src/chat/chat_flyout.tsx", "deprecated": false, @@ -470,7 +470,7 @@ "label": "navigateToConversation", "description": [], "signature": [ - "(conversationId?: string | undefined) => void" + "((conversationId?: string | undefined) => void) | undefined" ], "path": "x-pack/packages/kbn-ai-assistant/src/chat/chat_flyout.tsx", "deprecated": false, @@ -1085,7 +1085,7 @@ "label": "status", "description": [], "signature": [ - "State<{ ready: boolean; error?: any; deployment_state?: ", + "State<{ ready: boolean; enabled: boolean; error?: any; deployment_state?: ", "MlDeploymentState", " | undefined; allocation_state?: ", "MlDeploymentAllocationState", diff --git a/api_docs/kbn_ai_assistant.mdx b/api_docs/kbn_ai_assistant.mdx index 990d8bbd2d734..ae9e295e6bb7d 100644 --- a/api_docs/kbn_ai_assistant.mdx +++ b/api_docs/kbn_ai_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant title: "@kbn/ai-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant'] --- import kbnAiAssistantObj from './kbn_ai_assistant.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant_common.mdx b/api_docs/kbn_ai_assistant_common.mdx index d197535e4585d..6a87de32285e9 100644 --- a/api_docs/kbn_ai_assistant_common.mdx +++ b/api_docs/kbn_ai_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant-common title: "@kbn/ai-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant-common plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant-common'] --- import kbnAiAssistantCommonObj from './kbn_ai_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 14aa0e0c6122d..5139284b6a596 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-10-25 +date: 2024-10-27 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 b5da2892b2201..58fe707f2194f 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-10-25 +date: 2024-10-27 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 db58d88a6f245..dacfdbfba8efa 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-10-25 +date: 2024-10-27 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 34a948b5c2770..11e8b24f702be 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-10-25 +date: 2024-10-27 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_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index 683fee9922359..da7ae06bba25d 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index e01e82dca0d9b..14ddae67360c8 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-10-25 +date: 2024-10-27 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 912223f2c1421..37d15cada2905 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-10-25 +date: 2024-10-27 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 1276310af8c88..762408606bea3 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-10-25 +date: 2024-10-27 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_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index 7359a86a5d93d..e087630d70324 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 441ababd03849..3087cd97fc8f7 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-10-25 +date: 2024-10-27 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 f2c3c9661fdbf..39d3552ea9960 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index df74108e64bd5..a541a933ec25f 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 3be4e76bb84a4..a1a6eb1b8a7cd 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-10-25 +date: 2024-10-27 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 86b3747e7ed11..cb55f078d4fd7 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-10-25 +date: 2024-10-27 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 939ebeba7f63c..a4492c0f4eb90 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-10-25 +date: 2024-10-27 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 c3bf780aa4650..9497c4dbd333d 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-10-25 +date: 2024-10-27 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_types.mdx b/api_docs/kbn_apm_types.mdx index a0718445b4fbc..391e87aae1934 100644 --- a/api_docs/kbn_apm_types.mdx +++ b/api_docs/kbn_apm_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-types title: "@kbn/apm-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-types plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-types'] --- import kbnApmTypesObj from './kbn_apm_types.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 8abba56d800d2..a31ece9df542c 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_avc_banner.mdx b/api_docs/kbn_avc_banner.mdx index d34df87175eb0..a57c91c5a047b 100644 --- a/api_docs/kbn_avc_banner.mdx +++ b/api_docs/kbn_avc_banner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-avc-banner title: "@kbn/avc-banner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/avc-banner plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/avc-banner'] --- import kbnAvcBannerObj from './kbn_avc_banner.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index d52483de527a8..5a2622840371f 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-10-25 +date: 2024-10-27 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 0f1ef20d91ed0..6578e3cc9f972 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-10-25 +date: 2024-10-27 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 df6624d352ca6..71004ccf58f6d 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-10-25 +date: 2024-10-27 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 ad5895edfb160..00374e1611ba2 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-10-25 +date: 2024-10-27 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 e1eefe8437602..1ad88d17d2a17 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cbor.mdx b/api_docs/kbn_cbor.mdx index ff0bcc82a7787..f05a8bb05db79 100644 --- a/api_docs/kbn_cbor.mdx +++ b/api_docs/kbn_cbor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cbor title: "@kbn/cbor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cbor plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cbor'] --- import kbnCborObj from './kbn_cbor.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 4276312b74be8..4d2516c7e587b 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-10-25 +date: 2024-10-27 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 b5c8e7e6a4755..d6a6c36ebfe9b 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-10-25 +date: 2024-10-27 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 3da1f513352bf..771ab68836a97 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-10-25 +date: 2024-10-27 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 760cdc0103b9f..2ac3e14e76e8d 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-10-25 +date: 2024-10-27 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 599f9afd8b4e5..e9a921470fb0a 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-10-25 +date: 2024-10-27 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 1f386dd2fff21..18477bb759b79 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-10-25 +date: 2024-10-27 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 72ec880449783..dfd18c243ef05 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture.mdx b/api_docs/kbn_cloud_security_posture.mdx index 5c48a6e0999b9..62b599458ba8f 100644 --- a/api_docs/kbn_cloud_security_posture.mdx +++ b/api_docs/kbn_cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture title: "@kbn/cloud-security-posture" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture'] --- import kbnCloudSecurityPostureObj from './kbn_cloud_security_posture.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_common.mdx b/api_docs/kbn_cloud_security_posture_common.mdx index d2b770b7d4529..b52adcd79efe1 100644 --- a/api_docs/kbn_cloud_security_posture_common.mdx +++ b/api_docs/kbn_cloud_security_posture_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-common title: "@kbn/cloud-security-posture-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-common plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-common'] --- import kbnCloudSecurityPostureCommonObj from './kbn_cloud_security_posture_common.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_graph.devdocs.json b/api_docs/kbn_cloud_security_posture_graph.devdocs.json new file mode 100644 index 0000000000000..18a9900639d04 --- /dev/null +++ b/api_docs/kbn_cloud_security_posture_graph.devdocs.json @@ -0,0 +1,449 @@ +{ + "id": "@kbn/cloud-security-posture-graph", + "client": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.Graph", + "type": "Function", + "tags": [ + "component" + ], + "label": "Graph", + "description": [ + "\nGraph component renders a graph visualization using ReactFlow.\nIt takes nodes and edges as input and provides interactive controls\nfor panning, zooming, and manipulating the graph.\n" + ], + "signature": [ + "({ nodes, edges, interactive, ...rest }: ", + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.GraphProps", + "text": "GraphProps" + }, + ") => React.JSX.Element" + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.Graph.$1", + "type": "Object", + "tags": [], + "label": "{ nodes, edges, interactive, ...rest }", + "description": [], + "signature": [ + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.GraphProps", + "text": "GraphProps" + } + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [ + "The rendered Graph component." + ], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.EdgeViewModel", + "type": "Interface", + "tags": [], + "label": "EdgeViewModel", + "description": [], + "signature": [ + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.EdgeViewModel", + "text": "EdgeViewModel" + }, + " extends Record,Readonly<{} & { source: string; id: string; color: \"warning\" | \"primary\" | \"danger\"; target: string; }>" + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.EntityNodeViewModel", + "type": "Interface", + "tags": [], + "label": "EntityNodeViewModel", + "description": [], + "signature": [ + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.EntityNodeViewModel", + "text": "EntityNodeViewModel" + }, + " extends Record,Readonly<{ label?: string | undefined; icon?: string | undefined; } & { id: string; shape: \"ellipse\" | \"rectangle\" | \"hexagon\" | \"pentagon\" | \"diamond\"; color: \"warning\" | \"primary\" | \"danger\"; }>,BaseNodeDataViewModel" + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.EntityNodeViewModel.expandButtonClick", + "type": "Function", + "tags": [], + "label": "expandButtonClick", + "description": [], + "signature": [ + "((e: React.MouseEvent, node: ", + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.NodeProps", + "text": "NodeProps" + }, + ") => void) | undefined" + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.EntityNodeViewModel.expandButtonClick.$1", + "type": "Object", + "tags": [], + "label": "e", + "description": [], + "signature": [ + "React.MouseEvent" + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.EntityNodeViewModel.expandButtonClick.$2", + "type": "CompoundType", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.NodeProps", + "text": "NodeProps" + } + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.GraphProps", + "type": "Interface", + "tags": [], + "label": "GraphProps", + "description": [], + "signature": [ + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.GraphProps", + "text": "GraphProps" + }, + " extends ", + "CommonProps" + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.GraphProps.nodes", + "type": "Array", + "tags": [], + "label": "nodes", + "description": [], + "signature": [ + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.NodeViewModel", + "text": "NodeViewModel" + }, + "[]" + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.GraphProps.edges", + "type": "Array", + "tags": [], + "label": "edges", + "description": [], + "signature": [ + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.EdgeViewModel", + "text": "EdgeViewModel" + }, + "[]" + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.GraphProps.interactive", + "type": "boolean", + "tags": [], + "label": "interactive", + "description": [], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/graph/graph.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.GroupNodeViewModel", + "type": "Interface", + "tags": [], + "label": "GroupNodeViewModel", + "description": [], + "signature": [ + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.GroupNodeViewModel", + "text": "GroupNodeViewModel" + }, + " extends Record,Readonly<{ label?: string | undefined; icon?: string | undefined; } & { id: string; shape: \"group\"; }>,BaseNodeDataViewModel" + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.LabelNodeViewModel", + "type": "Interface", + "tags": [], + "label": "LabelNodeViewModel", + "description": [], + "signature": [ + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.LabelNodeViewModel", + "text": "LabelNodeViewModel" + }, + " extends Record,Readonly<{ label?: string | undefined; icon?: string | undefined; parentId?: string | undefined; } & { id: string; shape: \"label\"; color: \"warning\" | \"primary\" | \"danger\"; }>,BaseNodeDataViewModel" + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.LabelNodeViewModel.expandButtonClick", + "type": "Function", + "tags": [], + "label": "expandButtonClick", + "description": [], + "signature": [ + "((e: React.MouseEvent, node: ", + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.NodeProps", + "text": "NodeProps" + }, + ") => void) | undefined" + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.LabelNodeViewModel.expandButtonClick.$1", + "type": "Object", + "tags": [], + "label": "e", + "description": [], + "signature": [ + "React.MouseEvent" + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.LabelNodeViewModel.expandButtonClick.$2", + "type": "CompoundType", + "tags": [], + "label": "node", + "description": [], + "signature": [ + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.NodeProps", + "text": "NodeProps" + } + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.NodeProps", + "type": "Type", + "tags": [], + "label": "NodeProps", + "description": [], + "signature": [ + "Pick<", + "Node", + "<", + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.NodeViewModel", + "text": "NodeViewModel" + }, + ", string>, \"id\" | \"draggable\" | \"data\" | \"width\" | \"height\" | \"selectable\" | \"selected\" | \"parentId\" | \"sourcePosition\" | \"targetPosition\" | \"dragHandle\" | \"deletable\"> & Required, \"type\" | \"zIndex\" | \"dragging\">> & { isConnectable: boolean; positionAbsoluteX: number; positionAbsoluteY: number; }" + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/cloud-security-posture-graph", + "id": "def-public.NodeViewModel", + "type": "Type", + "tags": [], + "label": "NodeViewModel", + "description": [], + "signature": [ + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.EntityNodeViewModel", + "text": "EntityNodeViewModel" + }, + " | ", + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.GroupNodeViewModel", + "text": "GroupNodeViewModel" + }, + " | ", + { + "pluginId": "@kbn/cloud-security-posture-graph", + "scope": "public", + "docId": "kibKbnCloudSecurityPostureGraphPluginApi", + "section": "def-public.LabelNodeViewModel", + "text": "LabelNodeViewModel" + } + ], + "path": "x-pack/packages/kbn-cloud-security-posture/graph/src/components/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_cloud_security_posture_graph.mdx b/api_docs/kbn_cloud_security_posture_graph.mdx new file mode 100644 index 0000000000000..092cbbf52336f --- /dev/null +++ b/api_docs/kbn_cloud_security_posture_graph.mdx @@ -0,0 +1,36 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnCloudSecurityPostureGraphPluginApi +slug: /kibana-dev-docs/api/kbn-cloud-security-posture-graph +title: "@kbn/cloud-security-posture-graph" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/cloud-security-posture-graph plugin +date: 2024-10-27 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-graph'] +--- +import kbnCloudSecurityPostureGraphObj from './kbn_cloud_security_posture_graph.devdocs.json'; + + + +Contact [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 18 | 0 | 17 | 0 | + +## Client + +### Functions + + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 908eb9080cd60..5bb62e2641d23 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-10-25 +date: 2024-10-27 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 09595244de2cb..08f4fd4a415fd 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-10-25 +date: 2024-10-27 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 2e80806fadf0e..bdf5dc02d73c4 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-10-25 +date: 2024-10-27 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 b70f71c8e4694..f41e29971de12 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-10-25 +date: 2024-10-27 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 280ddbb9d3d77..0d48dcc6caa96 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-10-25 +date: 2024-10-27 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 b4d34ee9d0884..e3c599e2efbc9 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-10-25 +date: 2024-10-27 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 53924f175150e..ca6d4987b926f 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-10-25 +date: 2024-10-27 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 e8bc80179f1a2..4289f14973e98 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-10-25 +date: 2024-10-27 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_content_insights_public.mdx b/api_docs/kbn_content_management_content_insights_public.mdx index 16ba14cf1421c..d5a2246bcb0bf 100644 --- a/api_docs/kbn_content_management_content_insights_public.mdx +++ b/api_docs/kbn_content_management_content_insights_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-public title: "@kbn/content-management-content-insights-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-public plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-public'] --- import kbnContentManagementContentInsightsPublicObj from './kbn_content_management_content_insights_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_server.mdx b/api_docs/kbn_content_management_content_insights_server.mdx index c22e848ce98c9..e406cda2791d9 100644 --- a/api_docs/kbn_content_management_content_insights_server.mdx +++ b/api_docs/kbn_content_management_content_insights_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-server title: "@kbn/content-management-content-insights-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-server plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-server'] --- import kbnContentManagementContentInsightsServerObj from './kbn_content_management_content_insights_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_public.mdx b/api_docs/kbn_content_management_favorites_public.mdx index df010f9cf1c66..1065600b6d217 100644 --- a/api_docs/kbn_content_management_favorites_public.mdx +++ b/api_docs/kbn_content_management_favorites_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-public title: "@kbn/content-management-favorites-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-public plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-public'] --- import kbnContentManagementFavoritesPublicObj from './kbn_content_management_favorites_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_server.mdx b/api_docs/kbn_content_management_favorites_server.mdx index 7437543f2f848..8e9c35b6a808f 100644 --- a/api_docs/kbn_content_management_favorites_server.mdx +++ b/api_docs/kbn_content_management_favorites_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-server title: "@kbn/content-management-favorites-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-server plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-server'] --- import kbnContentManagementFavoritesServerObj from './kbn_content_management_favorites_server.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 4b1db955ffae0..423bc91c46f89 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-10-25 +date: 2024-10-27 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 d5305bd8deb84..50e6c848420b2 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-10-25 +date: 2024-10-27 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 488e98e1a0788..70896bfd22d14 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-10-25 +date: 2024-10-27 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 ba09425a77101..e09f653d4eb8f 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-10-25 +date: 2024-10-27 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_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index 3f05cd4a2410c..50aa27c992b16 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-user-profiles'] --- import kbnContentManagementUserProfilesObj from './kbn_content_management_user_profiles.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index c3951f0b13008..f04e86f8956af 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-10-25 +date: 2024-10-27 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.devdocs.json b/api_docs/kbn_core_analytics_browser.devdocs.json index d5dec8bb07c0a..92a17abe08595 100644 --- a/api_docs/kbn_core_analytics_browser.devdocs.json +++ b/api_docs/kbn_core_analytics_browser.devdocs.json @@ -1010,6 +1010,22 @@ "plugin": "inventory", "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts" }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts" + }, { "plugin": "observabilityLogsExplorer", "path": "x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/observability_logs_explorer/src/telemetry_events.ts" @@ -1410,6 +1426,38 @@ "plugin": "inventory", "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.test.ts" diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 38ff55655ec8e..73bf73de9a992 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-10-25 +date: 2024-10-27 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 d847b170231e7..db242fb4ac494 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-10-25 +date: 2024-10-27 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 a36c41c26390d..e274e88da9dae 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-10-25 +date: 2024-10-27 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.devdocs.json b/api_docs/kbn_core_analytics_server.devdocs.json index 8cf99c35166ab..32c4147c1080b 100644 --- a/api_docs/kbn_core_analytics_server.devdocs.json +++ b/api_docs/kbn_core_analytics_server.devdocs.json @@ -1018,6 +1018,22 @@ "plugin": "inventory", "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts" }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_client.ts" + }, { "plugin": "observabilityLogsExplorer", "path": "x-pack/plugins/observability_solution/observability_logs_explorer/public/state_machines/observability_logs_explorer/src/telemetry_events.ts" @@ -1418,6 +1434,38 @@ "plugin": "inventory", "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, + { + "plugin": "inventory", + "path": "x-pack/plugins/observability_solution/inventory/public/services/telemetry/telemetry_service.test.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_service.test.ts" diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 552b3c889df2e..9ade080630ca8 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-10-25 +date: 2024-10-27 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 57f1ebeee476f..d99566510d064 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-10-25 +date: 2024-10-27 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 2be7ad246d6d2..173e4a6234a91 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-10-25 +date: 2024-10-27 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 27e5355f0d380..a0d8a209de2a9 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-10-25 +date: 2024-10-27 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 59a7c14a1183f..360c37ae525ea 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-10-25 +date: 2024-10-27 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 2aa4aeaeb0b6a..1d2276e119f5b 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-10-25 +date: 2024-10-27 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 651d0d1cf1be9..32c2ce9434975 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-10-25 +date: 2024-10-27 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 6fa3be391616f..3df2e8c4cf6d2 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-10-25 +date: 2024-10-27 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 3af58c89ed8ac..254419125c204 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-10-25 +date: 2024-10-27 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 5e7d22b0cda8e..b3a2c29bd7275 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-10-25 +date: 2024-10-27 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 de028b6a0a5cf..1bbbaea5ef796 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-10-25 +date: 2024-10-27 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 5e865fd249196..21c6c9bd6531d 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-10-25 +date: 2024-10-27 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 99dbc9056aaf6..bcf6690160a16 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-10-25 +date: 2024-10-27 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 5f6190b4bad24..022d1aa4409d3 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-10-25 +date: 2024-10-27 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 7115d3bb7d62c..35b1775866bd6 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-10-25 +date: 2024-10-27 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 a4cb7c5d24f54..4a2590200e39b 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-10-25 +date: 2024-10-27 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 d3472845a8b14..94faa7b8d31c0 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-10-25 +date: 2024-10-27 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 7b62e26f37d4c..155ae23fda43b 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-10-25 +date: 2024-10-27 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 748ba5e37febe..10e0393885280 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-10-25 +date: 2024-10-27 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 dc0178f1ca9c3..8fa1958253bf4 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-10-25 +date: 2024-10-27 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 36582efd7b78f..ae31155971792 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-10-25 +date: 2024-10-27 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 a918d027cb3d1..2d205d0ca5aeb 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-10-25 +date: 2024-10-27 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 0b57551e3fb79..1644de8fb9c5c 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-10-25 +date: 2024-10-27 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 85ff8336bbbeb..fb88efe9267c8 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-10-25 +date: 2024-10-27 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 dc80d6c66be28..8dfa0c584b7f5 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-10-25 +date: 2024-10-27 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 b11db6dc44dfc..3f75ba13895af 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-10-25 +date: 2024-10-27 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 2b6381208cc18..cfec5a876aec6 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-10-25 +date: 2024-10-27 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 41ba06074bfcc..c3bfa4469565a 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-10-25 +date: 2024-10-27 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 a7c6e52fad558..66612fa7ac72e 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-10-25 +date: 2024-10-27 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 f855a29466080..edca8a8e0cca0 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-10-25 +date: 2024-10-27 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 2f0b975bbcbf6..b88c85e740dfa 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-10-25 +date: 2024-10-27 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 be72e4f6760ad..97b906ab1ad9a 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-10-25 +date: 2024-10-27 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 392e440a5da95..11a42bc17a300 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-10-25 +date: 2024-10-27 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 9c2e69b287516..e2f94c1c89235 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-10-25 +date: 2024-10-27 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 509956cfecce6..bd9e6a835674f 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-10-25 +date: 2024-10-27 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 c4081a26f43b1..222559110dbd2 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-10-25 +date: 2024-10-27 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 1c29760a75995..4c77e10cb484d 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-10-25 +date: 2024-10-27 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 9f4b64a4b5e41..9eb5458f6e807 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-10-25 +date: 2024-10-27 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 4544289280c30..67bad274ee1ae 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-10-25 +date: 2024-10-27 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 ce0a6c58bcee3..93a6a0df97782 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-10-25 +date: 2024-10-27 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 385a3409631f9..7d317c7b95aad 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-10-25 +date: 2024-10-27 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 0fb8dda03687d..b20904e8cfe5e 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-10-25 +date: 2024-10-27 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 89a052cab3b34..d8488ca69eb0f 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-10-25 +date: 2024-10-27 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 4bc81fc43a17c..a8bf9112b2b5c 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-10-25 +date: 2024-10-27 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 59bee3352b8b2..ed6703a0b3c6f 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-10-25 +date: 2024-10-27 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 7d0352b91db05..ae9497fd4f31c 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-10-25 +date: 2024-10-27 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 2566cbfdabccc..e2ec00ac9d8c3 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-10-25 +date: 2024-10-27 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 502276b9844e5..94dd11cad09f7 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-10-25 +date: 2024-10-27 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 82a11dcb24e59..a00375f262fee 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-10-25 +date: 2024-10-27 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 3b6407e6bfcec..42e8157eabd7e 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-10-25 +date: 2024-10-27 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 33eed5a35b2d8..c27d967135568 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-10-25 +date: 2024-10-27 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 98f1e4cf49391..2b2362cb6a40e 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-10-25 +date: 2024-10-27 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 13a1a80f5d362..5928cb3c10c40 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-10-25 +date: 2024-10-27 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 37c5284973860..ad3b6427a32cc 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-10-25 +date: 2024-10-27 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 707bbde3cbcc4..b502612f7616f 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-10-25 +date: 2024-10-27 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_feature_flags_browser.mdx b/api_docs/kbn_core_feature_flags_browser.mdx index 4867bd71d5011..4ca797e8fddb2 100644 --- a/api_docs/kbn_core_feature_flags_browser.mdx +++ b/api_docs/kbn_core_feature_flags_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser title: "@kbn/core-feature-flags-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser'] --- import kbnCoreFeatureFlagsBrowserObj from './kbn_core_feature_flags_browser.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_internal.mdx b/api_docs/kbn_core_feature_flags_browser_internal.mdx index 1d66bf24d83e8..a34f07358ae36 100644 --- a/api_docs/kbn_core_feature_flags_browser_internal.mdx +++ b/api_docs/kbn_core_feature_flags_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-internal title: "@kbn/core-feature-flags-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-internal plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-internal'] --- import kbnCoreFeatureFlagsBrowserInternalObj from './kbn_core_feature_flags_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_mocks.mdx b/api_docs/kbn_core_feature_flags_browser_mocks.mdx index 26c57eab529ef..2ad2d4a3e5d34 100644 --- a/api_docs/kbn_core_feature_flags_browser_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-mocks title: "@kbn/core-feature-flags-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-mocks plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-mocks'] --- import kbnCoreFeatureFlagsBrowserMocksObj from './kbn_core_feature_flags_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server.mdx b/api_docs/kbn_core_feature_flags_server.mdx index c945e0897bd65..85ff30108fd8d 100644 --- a/api_docs/kbn_core_feature_flags_server.mdx +++ b/api_docs/kbn_core_feature_flags_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server title: "@kbn/core-feature-flags-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server'] --- import kbnCoreFeatureFlagsServerObj from './kbn_core_feature_flags_server.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_internal.mdx b/api_docs/kbn_core_feature_flags_server_internal.mdx index 4bd0e16beb684..9906dfd6c0c2e 100644 --- a/api_docs/kbn_core_feature_flags_server_internal.mdx +++ b/api_docs/kbn_core_feature_flags_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-internal title: "@kbn/core-feature-flags-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-internal plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-internal'] --- import kbnCoreFeatureFlagsServerInternalObj from './kbn_core_feature_flags_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_mocks.mdx b/api_docs/kbn_core_feature_flags_server_mocks.mdx index 76ef53a8d04eb..027f784e1c875 100644 --- a/api_docs/kbn_core_feature_flags_server_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-mocks title: "@kbn/core-feature-flags-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-mocks plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-mocks'] --- import kbnCoreFeatureFlagsServerMocksObj from './kbn_core_feature_flags_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index da77d27edace6..3b6d7144b0a2c 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-10-25 +date: 2024-10-27 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 4ff37c536625f..fe55ac816879d 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-10-25 +date: 2024-10-27 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 e819399a30d90..423576608cb73 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-10-25 +date: 2024-10-27 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 b312d444c22d7..7cd117028c127 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-10-25 +date: 2024-10-27 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 a5afe9bc0f1de..9e8f253bc79d2 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-10-25 +date: 2024-10-27 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 82c3dacf2b394..3020b7577df8e 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-10-25 +date: 2024-10-27 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 45c900eb34e0a..8c3e7ee72411c 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-10-25 +date: 2024-10-27 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 d0f55f2cc9fe9..b93ad4a07eb6e 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-10-25 +date: 2024-10-27 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 befb4ad6b3360..dd7a58fe31ee1 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-10-25 +date: 2024-10-27 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 6afe3f87c6622..656f4aef7b74b 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-10-25 +date: 2024-10-27 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 cf4fe8373a025..cf6ce905041c0 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-10-25 +date: 2024-10-27 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 0f129f549cabc..1991474ce4d66 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-10-25 +date: 2024-10-27 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 2c9cda9b414f2..c69e66425959b 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-10-25 +date: 2024-10-27 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 9becf34cf3e54..df26387304bbd 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-10-25 +date: 2024-10-27 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 91278abc3e334..d91608911e97d 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-10-25 +date: 2024-10-27 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 4261103113312..7e78ff2bda98c 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-10-25 +date: 2024-10-27 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 9dda3a9665424..9ca8cec521be5 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-10-25 +date: 2024-10-27 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 7b7a83177657c..2b128e3ed68b6 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-10-25 +date: 2024-10-27 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 26208edaffe76..18184ac586f8b 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-10-25 +date: 2024-10-27 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 5481756a5ffbe..511b5af5c81ec 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-10-25 +date: 2024-10-27 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 e89d0730578a4..3ae8f67276462 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-10-25 +date: 2024-10-27 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 3a858d43adee3..88373dbc1fc6e 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-10-25 +date: 2024-10-27 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 157680a23afea..8c4bd609acbaa 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-10-25 +date: 2024-10-27 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 7b4d793557a5f..ff4a7603d5a46 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-10-25 +date: 2024-10-27 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 0a2fef2f2628f..871e9d487860c 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-10-25 +date: 2024-10-27 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 b0f5a9b868d3a..24d8359993f3a 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-10-25 +date: 2024-10-27 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 3958b5fb088f0..504b210a8db34 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-10-25 +date: 2024-10-27 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 40b54fb602ff3..5cda5b4aeacc0 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-10-25 +date: 2024-10-27 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 39b07dcdb118f..0befa5d18b265 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-10-25 +date: 2024-10-27 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 6a92a0d76e98f..38cff1b884034 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-10-25 +date: 2024-10-27 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 7c880dcfefb89..4fd48b766dd2f 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-10-25 +date: 2024-10-27 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 5328ee4e81fcf..62cdc68a3b4d3 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-10-25 +date: 2024-10-27 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 034f9c42a4dcf..d117b04ed659d 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-10-25 +date: 2024-10-27 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 5e2430d3fc3d3..465f4a56b586f 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-10-25 +date: 2024-10-27 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 8084230e0aa7e..f345a14c5e0be 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-10-25 +date: 2024-10-27 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 e1d68dcacbc91..8e4d9548bc5b4 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-10-25 +date: 2024-10-27 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 15e1b9336ac68..10902f2bb01d8 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-10-25 +date: 2024-10-27 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 733fba5e1c7d9..d625c4bb85dbf 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-10-25 +date: 2024-10-27 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 27ac76878b35e..5370a956886e2 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-10-25 +date: 2024-10-27 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 e6866432f43de..50b07ca70fcec 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-10-25 +date: 2024-10-27 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 1d31ebf2ee934..a56f6431f773d 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-10-25 +date: 2024-10-27 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 884d8a6f5ec44..45b8ee7ac8b52 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-10-25 +date: 2024-10-27 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 dcf26199c458a..5dc099be10f5a 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-10-25 +date: 2024-10-27 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 974aa27ed52b2..90720c6b53572 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-10-25 +date: 2024-10-27 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 ce1c87b69ff8d..1a28652e2d9e0 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-10-25 +date: 2024-10-27 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 520c29279e897..9674bc55d4b9a 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-10-25 +date: 2024-10-27 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 7440908693fac..81acecdf960da 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-10-25 +date: 2024-10-27 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 b9e327d31514d..8703b62c24113 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-10-25 +date: 2024-10-27 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 09f6e57fa9405..3cb304635de3b 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-10-25 +date: 2024-10-27 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 2ed82c4f2d80a..be9c80089d1b0 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-10-25 +date: 2024-10-27 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 ee98e78a69db8..368c645eaf1b5 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-10-25 +date: 2024-10-27 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 506da2bee329e..42200ab582ee9 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-10-25 +date: 2024-10-27 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 5b664c9fea407..ffbd96154ffff 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-10-25 +date: 2024-10-27 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 c024bfbeddc7c..4a314337038f7 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-10-25 +date: 2024-10-27 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 72b72f350f144..e2775ea41720d 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-10-25 +date: 2024-10-27 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 224b3a0ec37c0..c2f6a023c2b62 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-10-25 +date: 2024-10-27 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 80d0828edc829..e49aa9e828130 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-10-25 +date: 2024-10-27 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 47b59bc27bcc7..d6fbc9ce3cc38 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-10-25 +date: 2024-10-27 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 053bc36ab2e89..525282b125499 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-10-25 +date: 2024-10-27 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 a7e9ace76cfc8..9193fe1e03956 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-10-25 +date: 2024-10-27 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 74c8e94e01033..95914df1134dd 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-10-25 +date: 2024-10-27 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 cefd397c25f79..99611f65d09cb 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-10-25 +date: 2024-10-27 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 d51a61c24e73d..1ee5d91b49b1e 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-10-25 +date: 2024-10-27 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 ccbf92cec3456..efac5cbb5c01c 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-10-25 +date: 2024-10-27 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 beb66154c76e1..39430e3f79442 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-10-25 +date: 2024-10-27 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 bd11402aecbee..72b01fd02dc87 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-10-25 +date: 2024-10-27 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 412f66f224c67..3f4f8f5a80485 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-10-25 +date: 2024-10-27 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 631b31671f57a..c8cd357835396 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-10-25 +date: 2024-10-27 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 b5db588cea70c..25e60562b5a9b 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-10-25 +date: 2024-10-27 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 1d81a105baaea..bd1dfa89d6c31 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-10-25 +date: 2024-10-27 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 06c42c5eef4b6..32d8573a245e2 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-10-25 +date: 2024-10-27 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 690299c9f6169..3b4531083204b 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-10-25 +date: 2024-10-27 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 b53dcf86beecb..4fa3920f5092c 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-10-25 +date: 2024-10-27 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 342e63a245624..13b185ee2f903 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-10-25 +date: 2024-10-27 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 118101f884759..fbe4214c49f1e 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-10-25 +date: 2024-10-27 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 34a1beebd0f8b..711e562900042 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-10-25 +date: 2024-10-27 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 4f2a74ca003e0..709f4f9432b10 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-10-25 +date: 2024-10-27 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 eb1e69eec1c5f..8df09caf4d601 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-10-25 +date: 2024-10-27 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 2d76be55d62ca..86b20a396bd72 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-10-25 +date: 2024-10-27 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 0e592f11a44b7..8d1ed38af518b 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-10-25 +date: 2024-10-27 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 167fc0d4768a0..280fc27571727 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-10-25 +date: 2024-10-27 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 64cf0f346da8c..841501ca47db1 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-10-25 +date: 2024-10-27 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 293bad7ac9b40..80b1743e193dd 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-10-25 +date: 2024-10-27 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 9043954847c3d..f8daa373ff338 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-10-25 +date: 2024-10-27 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 86bd69b7bd616..ca41f463c2340 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-10-25 +date: 2024-10-27 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 3ed61484f2f7e..ebd1fdff1208b 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-10-25 +date: 2024-10-27 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 31973ea45aa86..d17f932db0d36 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-10-25 +date: 2024-10-27 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 a6c1da6e38a94..59e8341cdcde5 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-10-25 +date: 2024-10-27 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 1ab880f8f6a35..0417c15301b2e 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-10-25 +date: 2024-10-27 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 9820ab3cb3165..7309180f9292d 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-10-25 +date: 2024-10-27 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 af15198a4e010..6e0fdd63926a9 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-10-25 +date: 2024-10-27 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 61c3fb6ad11cb..a3cbdcdb75b48 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-10-25 +date: 2024-10-27 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 808c35883891e..c8deec261bacd 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-10-25 +date: 2024-10-27 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 16d999498587d..f25b124b83ced 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-10-25 +date: 2024-10-27 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 5c81b517dd4bc..4eb82f6f629ba 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-10-25 +date: 2024-10-27 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 117707111955e..39d26d8af1bf1 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-10-25 +date: 2024-10-27 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 71522e93920ab..a341dbb6120d5 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-10-25 +date: 2024-10-27 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 e47c382c2eded..acbb218ff0531 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-10-25 +date: 2024-10-27 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 2e1c8f89f8bcd..ad0d61920a4fe 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-10-25 +date: 2024-10-27 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 ad53f3bc01ce9..3a7472f429fd3 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-10-25 +date: 2024-10-27 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 78a75d3e84cf1..b95738b8abadc 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-10-25 +date: 2024-10-27 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 eadd313d92375..480a8bf3fe862 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-10-25 +date: 2024-10-27 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 f4ac5dc3e9bf8..3dc617cf5b84e 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-10-25 +date: 2024-10-27 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 c52e538d5fdb9..b489caf8f40f7 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-10-25 +date: 2024-10-27 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 42bd15e5a53cd..c886985e31f74 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-10-25 +date: 2024-10-27 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_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index 20a020e788b7e..95cf9afe24c32 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index e1b87c3eb8e7f..c3522e361e101 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index eee10551db541..57a322449779f 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index bc9a34486f712..e50de032d9728 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index 37676f3e30a09..1fb96a835ef0a 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index fd33971ae59e7..d90e9aacfa50b 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index d02d813e6b893..a203357595940 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_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 cbbd484348bf3..6c5cda9952b7b 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-10-25 +date: 2024-10-27 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_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 3d9f24b401d27..6433a16bb8002 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-10-25 +date: 2024-10-27 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 e08941938cfff..11aec2219e8de 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-10-25 +date: 2024-10-27 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 7821769fc9433..e73503bc3c226 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-10-25 +date: 2024-10-27 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 b7559cadccfed..a3de38b615406 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-10-25 +date: 2024-10-27 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 566186b6a0add..019b392ae302a 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-10-25 +date: 2024-10-27 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 5f7ccbb6cedb8..692e415d3a070 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-10-25 +date: 2024-10-27 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 e55be5f3ce3e4..2480f6eb09d6b 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-10-25 +date: 2024-10-27 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 61477da487d59..8aa2f1e4617d2 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-10-25 +date: 2024-10-27 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 83ad4f7a30151..7d5893cac7591 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-10-25 +date: 2024-10-27 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 d5c26b7229efc..08694d2038960 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-10-25 +date: 2024-10-27 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 53a8c087280b1..6facc64146d9c 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-10-25 +date: 2024-10-27 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 2eb233e083455..3f6a289270612 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-10-25 +date: 2024-10-27 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 58ec9fc9db98b..d889789678017 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-10-25 +date: 2024-10-27 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 d4e26ed2b3fd8..98189fe7bb303 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-10-25 +date: 2024-10-27 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 d7bbe21013ebf..00e5f81d6906d 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-10-25 +date: 2024-10-27 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 a6378a819d7c7..4a139e9dc49c7 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-10-25 +date: 2024-10-27 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 c5dfeb09e5b39..43e66dadfd989 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-10-25 +date: 2024-10-27 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 d72d29877b369..da09e0ebd5069 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-10-25 +date: 2024-10-27 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 f5c99a50635bb..e41fed17bb523 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-10-25 +date: 2024-10-27 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 d84485e163776..1ec9652a30541 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-10-25 +date: 2024-10-27 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 3beda1c97aaba..03d758d15ecd3 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-10-25 +date: 2024-10-27 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 833402a621001..5b04e0915d5da 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-10-25 +date: 2024-10-27 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 f7ffc888e932a..515055e4b004f 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-10-25 +date: 2024-10-27 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 8192bb865a9ed..130f937efc4d8 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-10-25 +date: 2024-10-27 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 0be01879092b3..7826c372fe719 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-10-25 +date: 2024-10-27 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 87cdfb552eaa6..89a2477547e74 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-10-25 +date: 2024-10-27 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 57fc632d581e2..cddc033ed5da6 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-10-25 +date: 2024-10-27 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 42783b7c5e50b..d628383c8fd38 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_contextual_components.mdx b/api_docs/kbn_discover_contextual_components.mdx index f871112fe2bb2..3cf9e355ced6c 100644 --- a/api_docs/kbn_discover_contextual_components.mdx +++ b/api_docs/kbn_discover_contextual_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-contextual-components title: "@kbn/discover-contextual-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-contextual-components plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-contextual-components'] --- import kbnDiscoverContextualComponentsObj from './kbn_discover_contextual_components.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 10ec6e859d318..c7b040df30949 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-10-25 +date: 2024-10-27 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 13e09364b3cd5..e0ba05c31b675 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-10-25 +date: 2024-10-27 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 9b173b0d346eb..6bfb12dcd779b 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-10-25 +date: 2024-10-27 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 72ddaf0b2e5f3..9f216ffbf00d6 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-10-25 +date: 2024-10-27 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 782221793ba6f..099e5b6a7a514 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-10-25 +date: 2024-10-27 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 eb5ed51b104fb..cfb4c7e45a66b 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-10-25 +date: 2024-10-27 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 42fbfb0bd0a17..f2b58d89bc604 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-10-25 +date: 2024-10-27 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 fe27e860436a9..e09026131e14a 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-10-25 +date: 2024-10-27 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 1c61735c5d90c..da66810e74d5a 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index 421b1ed14a799..0a046ebc80424 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index ecd91a632b60f..554e27deba0f6 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-10-25 +date: 2024-10-27 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 fe45478f29a0c..9d66d0055f569 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-10-25 +date: 2024-10-27 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 3129cbb435063..cdf9afe000144 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-10-25 +date: 2024-10-27 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 4c257f0fbdf40..ac764937fa5d7 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-10-25 +date: 2024-10-27 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 ec6bbb652b0b1..3ea57f4b33c65 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-10-25 +date: 2024-10-27 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 cc4f89070d784..f242cef826098 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-10-25 +date: 2024-10-27 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 1b6b1edf1a988..9b4fdb9e57ad3 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_editor.mdx b/api_docs/kbn_esql_editor.mdx index 1409e7d9da87f..016c5d44f3038 100644 --- a/api_docs/kbn_esql_editor.mdx +++ b/api_docs/kbn_esql_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-editor title: "@kbn/esql-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-editor plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-editor'] --- import kbnEsqlEditorObj from './kbn_esql_editor.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 7be3a7ab1705f..e0023cb151f93 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-10-25 +date: 2024-10-27 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 8fad3f8784a8c..e1016d0c08ec5 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-10-25 +date: 2024-10-27 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 b951b786d4521..cddea3ed1b069 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-10-25 +date: 2024-10-27 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 11c650bcd9f43..f0d9de5016870 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-10-25 +date: 2024-10-27 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 f6d11d4461046..5c9215aa93d02 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-10-25 +date: 2024-10-27 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 e902fa17bcedf..f6cde69d707c9 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-10-25 +date: 2024-10-27 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 fc317182455ef..9c00ce5011d07 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-10-25 +date: 2024-10-27 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 59e819b16728e..1764a67f9f947 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-10-25 +date: 2024-10-27 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 4b8160ff489d0..233ad79c47855 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-10-25 +date: 2024-10-27 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 3046218767b28..472fd81fc2ad1 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-10-25 +date: 2024-10-27 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.devdocs.json b/api_docs/kbn_ftr_common_functional_ui_services.devdocs.json index 9dc0cc6adbf11..048e3d908e3f5 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.devdocs.json +++ b/api_docs/kbn_ftr_common_functional_ui_services.devdocs.json @@ -2885,7 +2885,7 @@ "\nMoves the remote environment’s mouse cursor to the current element with optional offset\nhttps://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/input_exports_Actions.html#move" ], "signature": [ - "(options?: { xOffset: number; yOffset: number; }) => Promise" + "({ xOffset, yOffset, topOffset }?: { xOffset?: number | undefined; yOffset?: number | undefined; topOffset?: number | undefined; }) => Promise" ], "path": "packages/kbn-ftr-common-functional-ui-services/services/web_element_wrapper/web_element_wrapper.ts", "deprecated": false, @@ -2896,10 +2896,10 @@ "id": "def-common.WebElementWrapper.moveMouseTo.$1", "type": "Object", "tags": [], - "label": "options", + "label": "{ xOffset = 0, yOffset = 0, topOffset = 0 }", "description": [], "signature": [ - "{ xOffset: number; yOffset: number; }" + "{ xOffset?: number | undefined; yOffset?: number | undefined; topOffset?: number | undefined; }" ], "path": "packages/kbn-ftr-common-functional-ui-services/services/web_element_wrapper/web_element_wrapper.ts", "deprecated": false, diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 581c52131c378..064fde25c4e34 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-10-25 +date: 2024-10-27 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 7a2bad84b1315..54c6e77e62b4b 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-10-25 +date: 2024-10-27 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 374fe7901ed4c..412a4f53672e0 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-10-25 +date: 2024-10-27 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 f933a8338f91f..92774a04ec411 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grid_layout.mdx b/api_docs/kbn_grid_layout.mdx index adf471b5feef3..1ae6f14af6b6a 100644 --- a/api_docs/kbn_grid_layout.mdx +++ b/api_docs/kbn_grid_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grid-layout title: "@kbn/grid-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grid-layout plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grid-layout'] --- import kbnGridLayoutObj from './kbn_grid_layout.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index 5309134ccf8d0..fb6daa2992d67 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 54ee126becf5b..1045e21a0e2e3 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-10-25 +date: 2024-10-27 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 667b48db81445..4d0784ab958b6 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-10-25 +date: 2024-10-27 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 45730b7212c56..91e9ddd460c74 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-10-25 +date: 2024-10-27 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 4dcb5020eb81b..688277092aae8 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-10-25 +date: 2024-10-27 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 f3d1028bee0d7..aad2dba40369b 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-10-25 +date: 2024-10-27 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 a307ee6e52d21..249cf308b507b 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-10-25 +date: 2024-10-27 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 5bb93c3d44187..a4c94f002d786 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-10-25 +date: 2024-10-27 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 8e465b481a286..49e78f3fbbd76 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-10-25 +date: 2024-10-27 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 2a19c27cfdbba..34e0773929f1e 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management_shared_types.devdocs.json b/api_docs/kbn_index_management_shared_types.devdocs.json index 532c3a1bdcda9..34b0baa513dcf 100644 --- a/api_docs/kbn_index_management_shared_types.devdocs.json +++ b/api_docs/kbn_index_management_shared_types.devdocs.json @@ -1314,65 +1314,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "@kbn/index-management-shared-types", - "id": "def-common.IndexManagementLocatorParams", - "type": "Interface", - "tags": [], - "label": "IndexManagementLocatorParams", - "description": [], - "signature": [ - { - "pluginId": "@kbn/index-management-shared-types", - "scope": "common", - "docId": "kibKbnIndexManagementSharedTypesPluginApi", - "section": "def-common.IndexManagementLocatorParams", - "text": "IndexManagementLocatorParams" - }, - " extends ", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.SerializableRecord", - "text": "SerializableRecord" - } - ], - "path": "x-pack/packages/index-management/index_management_shared_types/src/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/index-management-shared-types", - "id": "def-common.IndexManagementLocatorParams.page", - "type": "string", - "tags": [], - "label": "page", - "description": [], - "signature": [ - "\"data_streams_details\"" - ], - "path": "x-pack/packages/index-management/index_management_shared_types/src/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "@kbn/index-management-shared-types", - "id": "def-common.IndexManagementLocatorParams.dataStreamName", - "type": "string", - "tags": [], - "label": "dataStreamName", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "x-pack/packages/index-management/index_management_shared_types/src/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "@kbn/index-management-shared-types", "id": "def-common.IndexManagementPluginSetup", @@ -2173,6 +2114,28 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/index-management-shared-types", + "id": "def-common.IndexManagementLocatorParams", + "type": "Type", + "tags": [], + "label": "IndexManagementLocatorParams", + "description": [], + "signature": [ + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.SerializableRecord", + "text": "SerializableRecord" + }, + " & ({ page: \"data_streams_details\"; dataStreamName?: string | undefined; } | { page: \"index_template\"; indexTemplate: string; } | { page: \"component_template\"; componentTemplate: string; })" + ], + "path": "x-pack/packages/index-management/index_management_shared_types/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "objects": [] diff --git a/api_docs/kbn_index_management_shared_types.mdx b/api_docs/kbn_index_management_shared_types.mdx index 9902a95586dea..e1f1f804339d9 100644 --- a/api_docs/kbn_index_management_shared_types.mdx +++ b/api_docs/kbn_index_management_shared_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management-shared-types title: "@kbn/index-management-shared-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management-shared-types plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management-shared-types'] --- import kbnIndexManagementSharedTypesObj from './kbn_index_management_shared_types.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kiban | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 126 | 3 | 126 | 0 | +| 124 | 3 | 124 | 0 | ## Common diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 8e95c5959784c..4a0982a3846fe 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-10-25 +date: 2024-10-27 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 7decfdca2c478..c3003f3a2844b 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-10-25 +date: 2024-10-27 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 1dd2226abf4cb..ec797b96c31ce 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_investigation_shared.mdx b/api_docs/kbn_investigation_shared.mdx index c5bd54e8374b2..4dec7130cba4e 100644 --- a/api_docs/kbn_investigation_shared.mdx +++ b/api_docs/kbn_investigation_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-investigation-shared title: "@kbn/investigation-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/investigation-shared plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/investigation-shared'] --- import kbnInvestigationSharedObj from './kbn_investigation_shared.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index cf51181704dd9..11ab47207d65c 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-10-25 +date: 2024-10-27 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 f89bc85826c7c..cfb78d10bdda7 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_item_buffer.mdx b/api_docs/kbn_item_buffer.mdx index ed03e400a21b9..96201cec92f87 100644 --- a/api_docs/kbn_item_buffer.mdx +++ b/api_docs/kbn_item_buffer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-item-buffer title: "@kbn/item-buffer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/item-buffer plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/item-buffer'] --- import kbnItemBufferObj from './kbn_item_buffer.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 718fcf966ced6..bdc8d6484ce02 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-10-25 +date: 2024-10-27 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 5cde98628f4fc..b23f888aeb0f6 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-10-25 +date: 2024-10-27 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 eb061414a8b8d..df4dadf4ee6b3 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_json_schemas.mdx b/api_docs/kbn_json_schemas.mdx index 6128d220c1066..e32289eaeb00a 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-schemas'] --- import kbnJsonSchemasObj from './kbn_json_schemas.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 564d38cf64ba0..b246069833c34 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-10-25 +date: 2024-10-27 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.mdx b/api_docs/kbn_language_documentation.mdx index 40b2661ac1191..387ff58816bab 100644 --- a/api_docs/kbn_language_documentation.mdx +++ b/api_docs/kbn_language_documentation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation title: "@kbn/language-documentation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation'] --- import kbnLanguageDocumentationObj from './kbn_language_documentation.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index e9e7d4b8d37ea..9f0af310e192a 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-10-25 +date: 2024-10-27 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 e443971960cc6..d41996f61eec7 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-10-25 +date: 2024-10-27 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 18262df1c99f6..71cf77392c2ce 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-10-25 +date: 2024-10-27 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 87f81cfa1701c..b378630d53634 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-10-25 +date: 2024-10-27 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 156a29789cf9f..eae19ebcc109c 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-10-25 +date: 2024-10-27 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 903c451d69cc1..528ba0c3fc560 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-10-25 +date: 2024-10-27 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 24d3f45b0e09b..40580e69a1b28 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-10-25 +date: 2024-10-27 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 d6217af2a9ce1..3a842eec49a5a 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-10-25 +date: 2024-10-27 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 0a8a72ec52299..2b1714db84e49 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-10-25 +date: 2024-10-27 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 706a888e336d3..85d8a9d007c9c 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-10-25 +date: 2024-10-27 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 f6df4194023b3..183e524fb65fa 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-10-25 +date: 2024-10-27 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 4b0a63da5cac4..af63a3fef1ffc 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-10-25 +date: 2024-10-27 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 9ceeb594828fc..be923de7e3b48 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-10-25 +date: 2024-10-27 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 9573d05bbd967..36d340fd38aac 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-10-25 +date: 2024-10-27 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 93344ca090a73..5faf47d6af726 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-10-25 +date: 2024-10-27 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 590c1c4615da8..099ca6464689f 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-10-25 +date: 2024-10-27 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 2286f1792e48f..e18ca498bc0aa 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-10-25 +date: 2024-10-27 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 5030148051d49..733c20df1b72b 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_manifest.mdx b/api_docs/kbn_manifest.mdx index defcb3fb78c19..520fa60ae7b58 100644 --- a/api_docs/kbn_manifest.mdx +++ b/api_docs/kbn_manifest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-manifest title: "@kbn/manifest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/manifest plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/manifest'] --- import kbnManifestObj from './kbn_manifest.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index d76af270abf3e..d25022e0fa505 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-10-25 +date: 2024-10-27 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 77f8b5f688e22..e19bf793905dd 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-10-25 +date: 2024-10-27 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 4052a7e5184f8..01d2284dfd351 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-10-25 +date: 2024-10-27 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 e28f1fc92c187..d83c4f98a3438 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-10-25 +date: 2024-10-27 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 61f8a944c0892..726ab1978a324 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-10-25 +date: 2024-10-27 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 76e19d40a636e..a74ad9715ef19 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-10-25 +date: 2024-10-27 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 5aa3570bcfae5..e07b5cd8ffe4f 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-10-25 +date: 2024-10-27 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 b4fcf7ab8f0c2..bf7af1b0f75d3 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-10-25 +date: 2024-10-27 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 b101733529e2e..c392a37f05beb 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-10-25 +date: 2024-10-27 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 73c4fe3a72aa2..3249a4c76ac81 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-10-25 +date: 2024-10-27 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 45c95511f5090..d98911d9ac573 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-10-25 +date: 2024-10-27 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 d383bd3b2df7a..0826f16aa5e39 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-10-25 +date: 2024-10-27 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_field_stats_flyout.mdx b/api_docs/kbn_ml_field_stats_flyout.mdx index c534ea37f9794..38165556eb3a0 100644 --- a/api_docs/kbn_ml_field_stats_flyout.mdx +++ b/api_docs/kbn_ml_field_stats_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-field-stats-flyout title: "@kbn/ml-field-stats-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-field-stats-flyout plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-field-stats-flyout'] --- import kbnMlFieldStatsFlyoutObj from './kbn_ml_field_stats_flyout.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 17f3001836a0a..d1cdeefff655b 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-10-25 +date: 2024-10-27 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 0b0a0d0a64fac..ff4e9fae7d13e 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-10-25 +date: 2024-10-27 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 6d94ff686a9ae..8f3ead8f09344 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-10-25 +date: 2024-10-27 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 b48fa9d764cdb..9d71f439e09f6 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-10-25 +date: 2024-10-27 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 636e25e819407..942114d6975fe 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-10-25 +date: 2024-10-27 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 e45673e76502a..3cf91b7bc50cb 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-10-25 +date: 2024-10-27 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 345472ed17925..711c51c242d40 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-10-25 +date: 2024-10-27 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_parse_interval.mdx b/api_docs/kbn_ml_parse_interval.mdx index 5e839b98de318..6f9d72cfbf251 100644 --- a/api_docs/kbn_ml_parse_interval.mdx +++ b/api_docs/kbn_ml_parse_interval.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-parse-interval title: "@kbn/ml-parse-interval" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-parse-interval plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-parse-interval'] --- import kbnMlParseIntervalObj from './kbn_ml_parse_interval.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 0ee1aa66f6c0e..251f1297f32ec 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-10-25 +date: 2024-10-27 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 87f1f04b3af0e..d6933dfadcab1 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-10-25 +date: 2024-10-27 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 7b745db75a7c6..d6595fe833ba2 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-10-25 +date: 2024-10-27 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 67f62124cb887..d5d0087f7cc36 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-10-25 +date: 2024-10-27 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 6a5644d94fb88..410c709a09828 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-10-25 +date: 2024-10-27 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 718d146361bcf..156b05d355bef 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-10-25 +date: 2024-10-27 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 8cfd0f206aad3..7863bf2460474 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-10-25 +date: 2024-10-27 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 2a8141166f14d..018fa30f34ee6 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-10-25 +date: 2024-10-27 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 76a494713f894..df43b9d06aad0 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_ml_validators.mdx b/api_docs/kbn_ml_validators.mdx index d0c0b165f58ad..b349289c0eaf2 100644 --- a/api_docs/kbn_ml_validators.mdx +++ b/api_docs/kbn_ml_validators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-validators title: "@kbn/ml-validators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-validators plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-validators'] --- import kbnMlValidatorsObj from './kbn_ml_validators.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index bb3ed1181d1a2..1ac838aa88296 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-10-25 +date: 2024-10-27 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 1ed0a07d3fc0a..4bdd1074dc378 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-10-25 +date: 2024-10-27 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 c22c7c8691581..7e8e879e6f970 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_object_versioning_utils.mdx b/api_docs/kbn_object_versioning_utils.mdx index 262d2dc8cc2f4..579d7b84f6083 100644 --- a/api_docs/kbn_object_versioning_utils.mdx +++ b/api_docs/kbn_object_versioning_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning-utils title: "@kbn/object-versioning-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning-utils plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning-utils'] --- import kbnObjectVersioningUtilsObj from './kbn_object_versioning_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 5865ccb841455..b76e7a6b5e687 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-10-25 +date: 2024-10-27 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_rule_utils.mdx b/api_docs/kbn_observability_alerting_rule_utils.mdx index 138124da68d34..fee87f132ca33 100644 --- a/api_docs/kbn_observability_alerting_rule_utils.mdx +++ b/api_docs/kbn_observability_alerting_rule_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-rule-utils title: "@kbn/observability-alerting-rule-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-rule-utils plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-rule-utils'] --- import kbnObservabilityAlertingRuleUtilsObj from './kbn_observability_alerting_rule_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 7b178f99c2fa2..3f084446d4ecf 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-10-25 +date: 2024-10-27 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 19a62d9f06c06..45fb8a24b90b1 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-10-25 +date: 2024-10-27 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_observability_logs_overview.mdx b/api_docs/kbn_observability_logs_overview.mdx index 5fe22eaae5415..29057a81147a4 100644 --- a/api_docs/kbn_observability_logs_overview.mdx +++ b/api_docs/kbn_observability_logs_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-logs-overview title: "@kbn/observability-logs-overview" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-logs-overview plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-logs-overview'] --- import kbnObservabilityLogsOverviewObj from './kbn_observability_logs_overview.devdocs.json'; diff --git a/api_docs/kbn_observability_synthetics_test_data.mdx b/api_docs/kbn_observability_synthetics_test_data.mdx index 9dd17bd7a5a88..550eab7d447c0 100644 --- a/api_docs/kbn_observability_synthetics_test_data.mdx +++ b/api_docs/kbn_observability_synthetics_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-synthetics-test-data title: "@kbn/observability-synthetics-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-synthetics-test-data plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-synthetics-test-data'] --- import kbnObservabilitySyntheticsTestDataObj from './kbn_observability_synthetics_test_data.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index daf8ee5ca9312..0a09d82135081 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-10-25 +date: 2024-10-27 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 147dddf3bd965..6fa4210c4e4ae 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-10-25 +date: 2024-10-27 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 d48c9c1a3110f..48cc35f097695 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-10-25 +date: 2024-10-27 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 209b021bb6332..26764f39916e6 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-10-25 +date: 2024-10-27 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 6ee8c445269e0..2cd26372f728b 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-10-25 +date: 2024-10-27 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 64c8c19437ce1..b2079cec21a13 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-10-25 +date: 2024-10-27 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 37548d98c61bc..f378d9a4f7f46 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-10-25 +date: 2024-10-27 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 b7f27290b864f..4d2608559a8ea 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-10-25 +date: 2024-10-27 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 106022fe20fea..b3a01e63f898a 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-10-25 +date: 2024-10-27 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 5ab0261f37aa3..0e9616f4fc7b5 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-10-25 +date: 2024-10-27 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 652d217f5d493..711ed185d9444 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-10-25 +date: 2024-10-27 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 2d485ab66d69e..59b096c6077e7 100644 --- a/api_docs/kbn_presentation_publishing.devdocs.json +++ b/api_docs/kbn_presentation_publishing.devdocs.json @@ -45,6 +45,46 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-public.apiCanLockHoverActions", + "type": "Function", + "tags": [], + "label": "apiCanLockHoverActions", + "description": [], + "signature": [ + "(api: unknown) => api is ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.CanLockHoverActions", + "text": "CanLockHoverActions" + } + ], + "path": "packages/presentation/presentation_publishing/interfaces/can_lock_hover_actions.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-public.apiCanLockHoverActions.$1", + "type": "Unknown", + "tags": [], + "label": "api", + "description": [], + "signature": [ + "unknown" + ], + "path": "packages/presentation/presentation_publishing/interfaces/can_lock_hover_actions.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/presentation-publishing", "id": "def-public.apiHasAppContext", @@ -2498,6 +2538,218 @@ } ], "interfaces": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-public.CanLockHoverActions", + "type": "Interface", + "tags": [], + "label": "CanLockHoverActions", + "description": [ + "\nThis API can lock hover actions" + ], + "path": "packages/presentation/presentation_publishing/interfaces/can_lock_hover_actions.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-public.CanLockHoverActions.hasLockedHoverActions$", + "type": "Object", + "tags": [], + "label": "hasLockedHoverActions$", + "description": [], + "signature": [ + "{ source: ", + "Observable", + " | undefined; readonly value: boolean; error: (err: any) => void; forEach: { (next: (value: boolean) => void): Promise; (next: (value: boolean) => void, promiseCtor: PromiseConstructorLike): Promise; }; complete: () => void; getValue: () => boolean; closed: boolean; pipe: { (): ", + "Observable", + "; (op1: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + ", op8: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + ", op8: ", + "OperatorFunction", + ", op9: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + ", op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + ", op8: ", + "OperatorFunction", + ", op9: ", + "OperatorFunction", + ", ...operations: ", + "OperatorFunction", + "[]): ", + "Observable", + "; }; operator: ", + "Operator", + " | undefined; lift: (operator: ", + "Operator", + ") => ", + "Observable", + "; subscribe: { (observerOrNext?: Partial<", + "Observer", + "> | ((value: boolean) => void) | undefined): ", + "Subscription", + "; (next?: ((value: boolean) => void) | null | undefined, error?: ((error: any) => void) | null | undefined, complete?: (() => void) | null | undefined): ", + "Subscription", + "; }; toPromise: { (): Promise; (PromiseCtor: PromiseConstructor): Promise; (PromiseCtor: PromiseConstructorLike): Promise; }; observers: ", + "Observer", + "[]; isStopped: boolean; hasError: boolean; thrownError: any; unsubscribe: () => void; readonly observed: boolean; asObservable: () => ", + "Observable", + "; }" + ], + "path": "packages/presentation/presentation_publishing/interfaces/can_lock_hover_actions.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-public.CanLockHoverActions.lockHoverActions", + "type": "Function", + "tags": [], + "label": "lockHoverActions", + "description": [], + "signature": [ + "(lock: boolean) => void" + ], + "path": "packages/presentation/presentation_publishing/interfaces/can_lock_hover_actions.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-public.CanLockHoverActions.lockHoverActions.$1", + "type": "boolean", + "tags": [], + "label": "lock", + "description": [], + "signature": [ + "boolean" + ], + "path": "packages/presentation/presentation_publishing/interfaces/can_lock_hover_actions.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/presentation-publishing", "id": "def-public.EmbeddableApiContext", diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index 5f6b2108f36da..4bc460dafe929 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-10-25 +date: 2024-10-27 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 | |-------------------|-----------|------------------------|-----------------| -| 218 | 0 | 183 | 6 | +| 224 | 0 | 188 | 6 | ## Client diff --git a/api_docs/kbn_product_doc_artifact_builder.mdx b/api_docs/kbn_product_doc_artifact_builder.mdx index 518e0604a0377..ae6c0f66d2029 100644 --- a/api_docs/kbn_product_doc_artifact_builder.mdx +++ b/api_docs/kbn_product_doc_artifact_builder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-product-doc-artifact-builder title: "@kbn/product-doc-artifact-builder" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/product-doc-artifact-builder plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/product-doc-artifact-builder'] --- import kbnProductDocArtifactBuilderObj from './kbn_product_doc_artifact_builder.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index ba3643b36fccc..7815f8b3c82db 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-10-25 +date: 2024-10-27 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 179df1e7802f4..51f248162ec0b 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-10-25 +date: 2024-10-27 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 52e5a8f8e42c3..346309262c12f 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index eed47c302931c..236de89c826c9 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index fc031d2c6dbb1..6ec1233422388 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-10-25 +date: 2024-10-27 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 50c7b26242190..bfd6aef779fcd 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-10-25 +date: 2024-10-27 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 b699c7a5eacd2..f027ec5d68187 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-10-25 +date: 2024-10-27 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 5fbe47b8ecc78..043cca26c038a 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-10-25 +date: 2024-10-27 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 9fec1092fc09b..81d0136f54147 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-10-25 +date: 2024-10-27 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 26ea4ec39cc10..d4d8910e044ed 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx index 5145ce0100674..cb551275ede77 100644 --- a/api_docs/kbn_recently_accessed.mdx +++ b/api_docs/kbn_recently_accessed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-recently-accessed title: "@kbn/recently-accessed" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/recently-accessed plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] --- import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 777dc475f1316..2b0d1427a91a6 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-10-25 +date: 2024-10-27 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 9f9d4402db837..5bd45c93a5a6e 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-10-25 +date: 2024-10-27 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 c3f5229d16b8b..271c6912d9cc2 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-10-25 +date: 2024-10-27 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 161eea6aa904d..07e447d6bd584 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-10-25 +date: 2024-10-27 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 b98e8752ba075..d377e6dbc6563 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-10-25 +date: 2024-10-27 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 d2ee5c2cf9775..226e01ee00406 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-10-25 +date: 2024-10-27 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 98433d7ffc6a1..4969dac08b64e 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-10-25 +date: 2024-10-27 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 a25391affc31f..6217f6bc674c5 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-10-25 +date: 2024-10-27 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 ee400bc3d1d15..39762efe1ccbd 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-10-25 +date: 2024-10-27 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 c387b153beef1..ee6f50d73c595 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-10-25 +date: 2024-10-27 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 d598f7aa96cc4..19bef68062f30 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-10-25 +date: 2024-10-27 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 4b4c80984dffd..47f72fe1b4021 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-10-25 +date: 2024-10-27 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 531f5834c0502..73e176bc3fefd 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-10-25 +date: 2024-10-27 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 0a6870e601248..552055f40c24b 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-10-25 +date: 2024-10-27 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 ae4e9007d5dca..0721baeec518e 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-10-25 +date: 2024-10-27 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 7f50cea37fe5a..1cdc3adc2167c 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_response_ops_feature_flag_service.mdx b/api_docs/kbn_response_ops_feature_flag_service.mdx index 70a1959803c8a..360fdf742d397 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_response_ops_rule_params.mdx b/api_docs/kbn_response_ops_rule_params.mdx index 9104bde74f7a4..2b26cc2529dfb 100644 --- a/api_docs/kbn_response_ops_rule_params.mdx +++ b/api_docs/kbn_response_ops_rule_params.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-rule-params title: "@kbn/response-ops-rule-params" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-rule-params plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-rule-params'] --- import kbnResponseOpsRuleParamsObj from './kbn_response_ops_rule_params.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 354f825ba512e..14210ee22155d 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index 4fb97db26f75b..ebc34e8148696 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rollup'] --- import kbnRollupObj from './kbn_rollup.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index a2c32e9592167..39ee3e791d96a 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-10-25 +date: 2024-10-27 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 825439d5afd8e..c2495df29a4da 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-10-25 +date: 2024-10-27 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 c2ab6baa4e106..96dcc1e02c95e 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-10-25 +date: 2024-10-27 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 825f9480ae0c9..bcda1a42e488a 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-10-25 +date: 2024-10-27 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 d9f78298097a2..21f70877d8ca7 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_screenshotting_server.mdx b/api_docs/kbn_screenshotting_server.mdx index 089926a228478..60f27f058f3ab 100644 --- a/api_docs/kbn_screenshotting_server.mdx +++ b/api_docs/kbn_screenshotting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-screenshotting-server title: "@kbn/screenshotting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/screenshotting-server plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/screenshotting-server'] --- import kbnScreenshottingServerObj from './kbn_screenshotting_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_components.mdx b/api_docs/kbn_search_api_keys_components.mdx index 928a5315021db..9f501d9e2f51d 100644 --- a/api_docs/kbn_search_api_keys_components.mdx +++ b/api_docs/kbn_search_api_keys_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-components title: "@kbn/search-api-keys-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-components plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-components'] --- import kbnSearchApiKeysComponentsObj from './kbn_search_api_keys_components.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_server.mdx b/api_docs/kbn_search_api_keys_server.mdx index c5c33b39fbcab..3e09efc45233f 100644 --- a/api_docs/kbn_search_api_keys_server.mdx +++ b/api_docs/kbn_search_api_keys_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-server title: "@kbn/search-api-keys-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-server plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-server'] --- import kbnSearchApiKeysServerObj from './kbn_search_api_keys_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 38a2c78aadebb..c1a0296dd31f2 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-10-25 +date: 2024-10-27 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 c4da56c56cb12..472dc4048cb33 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-10-25 +date: 2024-10-27 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 ad21eef5ab11c..58ebe1745f1a1 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-10-25 +date: 2024-10-27 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 bef1354fab895..5c541c6ef0a95 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-10-25 +date: 2024-10-27 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 99097ebc6da24..23377e375b630 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_shared_ui.mdx b/api_docs/kbn_search_shared_ui.mdx index 7cc87cdeb0226..2114610871ad9 100644 --- a/api_docs/kbn_search_shared_ui.mdx +++ b/api_docs/kbn_search_shared_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-shared-ui title: "@kbn/search-shared-ui" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-shared-ui plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-shared-ui'] --- import kbnSearchSharedUiObj from './kbn_search_shared_ui.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index 23094c67584bc..50877fec4a190 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx index 24d77665f0b1a..8ce4299354c83 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-api-key-management title: "@kbn/security-api-key-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-api-key-management plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] --- import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core.mdx b/api_docs/kbn_security_authorization_core.mdx index 3966037b09c1d..4aeef79856333 100644 --- a/api_docs/kbn_security_authorization_core.mdx +++ b/api_docs/kbn_security_authorization_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core title: "@kbn/security-authorization-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core'] --- import kbnSecurityAuthorizationCoreObj from './kbn_security_authorization_core.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core_common.mdx b/api_docs/kbn_security_authorization_core_common.mdx index 4687d5ed6ebfc..8620271ed5a3b 100644 --- a/api_docs/kbn_security_authorization_core_common.mdx +++ b/api_docs/kbn_security_authorization_core_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core-common title: "@kbn/security-authorization-core-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core-common plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core-common'] --- import kbnSecurityAuthorizationCoreCommonObj from './kbn_security_authorization_core_common.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index 9266b8dadce38..091a234031919 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-form-components title: "@kbn/security-form-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-form-components plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] --- import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 07620e7a90d21..fc722c3f7628b 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-10-25 +date: 2024-10-27 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 d89d0ebef21be..a2cfe471c75e6 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-10-25 +date: 2024-10-27 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 527ced0963d2c..1a29b2120bc54 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-10-25 +date: 2024-10-27 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.devdocs.json b/api_docs/kbn_security_plugin_types_server.devdocs.json index 279dae1d55066..4f11b25ee54f1 100644 --- a/api_docs/kbn_security_plugin_types_server.devdocs.json +++ b/api_docs/kbn_security_plugin_types_server.devdocs.json @@ -5040,6 +5040,10 @@ { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts" } ] } diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 729078564a46f..d5042ae5de3fc 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-10-25 +date: 2024-10-27 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_role_management_model.mdx b/api_docs/kbn_security_role_management_model.mdx index bb007a8bd2060..4edca359a63f3 100644 --- a/api_docs/kbn_security_role_management_model.mdx +++ b/api_docs/kbn_security_role_management_model.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-role-management-model title: "@kbn/security-role-management-model" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-role-management-model plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-role-management-model'] --- import kbnSecurityRoleManagementModelObj from './kbn_security_role_management_model.devdocs.json'; diff --git a/api_docs/kbn_security_solution_common.devdocs.json b/api_docs/kbn_security_solution_common.devdocs.json index ec70d3e9c476e..f8b99bbd6dd3d 100644 --- a/api_docs/kbn_security_solution_common.devdocs.json +++ b/api_docs/kbn_security_solution_common.devdocs.json @@ -277,7 +277,7 @@ "\nWrapper component that is composed of a header section and a content section.\nThe header can display an icon, a title (that can be a link), and an optional content section on the right.\nThe content section can display a loading spinner, an error message, or any other content.\nThe component can be expanded or collapsed by clicking on the chevron icon on the left of the title." ], "signature": [ - "{ ({ header: { title, link, iconType, headerContent }, content: { loading, error }, expand: { expandable, expandedOnFirstRender }, \"data-test-subj\": dataTestSubj, children, }: React.PropsWithChildren<", + "{ ({ header: { title, link, iconType, headerContent }, content: { loading, error, paddingSize: contentPaddingSize }, expand: { expandable, expandedOnFirstRender }, \"data-test-subj\": dataTestSubj, children, }: React.PropsWithChildren<", "ExpandablePanelPanelProps", ">): React.JSX.Element; displayName: string | undefined; }" ], @@ -290,7 +290,7 @@ "id": "def-public.ExpandablePanel.$1", "type": "CompoundType", "tags": [], - "label": "{\n header: { title, link, iconType, headerContent },\n content: { loading, error } = { loading: false, error: false },\n expand: { expandable, expandedOnFirstRender } = {\n expandable: false,\n expandedOnFirstRender: false,\n },\n 'data-test-subj': dataTestSubj,\n children,\n}", + "label": "{\n header: { title, link, iconType, headerContent },\n content: { loading, error, paddingSize: contentPaddingSize } = {\n loading: false,\n error: false,\n paddingSize: 'm',\n },\n expand: { expandable, expandedOnFirstRender } = {\n expandable: false,\n expandedOnFirstRender: false,\n },\n 'data-test-subj': dataTestSubj,\n children,\n}", "description": [], "signature": [ "React.PropsWithChildren<", diff --git a/api_docs/kbn_security_solution_common.mdx b/api_docs/kbn_security_solution_common.mdx index 77ba68e966f36..cfe7a3ecea7b6 100644 --- a/api_docs/kbn_security_solution_common.mdx +++ b/api_docs/kbn_security_solution_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-common title: "@kbn/security-solution-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-common plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-common'] --- import kbnSecuritySolutionCommonObj from './kbn_security_solution_common.devdocs.json'; diff --git a/api_docs/kbn_security_solution_distribution_bar.mdx b/api_docs/kbn_security_solution_distribution_bar.mdx index 07ded1ff38392..f63a4fcf98fc3 100644 --- a/api_docs/kbn_security_solution_distribution_bar.mdx +++ b/api_docs/kbn_security_solution_distribution_bar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-distribution-bar title: "@kbn/security-solution-distribution-bar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-distribution-bar plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-distribution-bar'] --- import kbnSecuritySolutionDistributionBarObj from './kbn_security_solution_distribution_bar.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index ecade49ff9859..2dc68a0a45668 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-10-25 +date: 2024-10-27 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 34c5bca405704..fb93fa0ce8328 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-10-25 +date: 2024-10-27 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 2456edd014414..95e033aa2e159 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-10-25 +date: 2024-10-27 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 f49e7390ab54d..64b44332fbdd2 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-10-25 +date: 2024-10-27 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_security_ui_components.mdx b/api_docs/kbn_security_ui_components.mdx index ddd5969386c2c..7e63cb6ebd03c 100644 --- a/api_docs/kbn_security_ui_components.mdx +++ b/api_docs/kbn_security_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-ui-components title: "@kbn/security-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-ui-components plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-ui-components'] --- import kbnSecurityUiComponentsObj from './kbn_security_ui_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 2f5e1d0eed4dc..921740ebf4797 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-10-25 +date: 2024-10-27 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 a4395ac31906c..6f5faa575d5d3 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-10-25 +date: 2024-10-27 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 8f8ab6f2ba1f8..ec867a95b99ed 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-10-25 +date: 2024-10-27 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 60d29238037d6..01b2fe6d63f97 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-10-25 +date: 2024-10-27 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 83a63361ca5f4..bf93f9a8284b4 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-10-25 +date: 2024-10-27 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_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 621319c46584a..03159840deb06 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-10-25 +date: 2024-10-27 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 b6c0ad0938187..61cb517969ea4 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-10-25 +date: 2024-10-27 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 5e339b3dff21f..0e15477470937 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-10-25 +date: 2024-10-27 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 00caf5c58b688..8a0d1fcab1f21 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-10-25 +date: 2024-10-27 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 9fe5e2683256d..9eca190f7fbda 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-10-25 +date: 2024-10-27 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 cc89b5d37b8f8..f327d24b2cd90 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-10-25 +date: 2024-10-27 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 20f3ee19f391c..757fcb277d5fb 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-10-25 +date: 2024-10-27 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 b157d31dfc713..26c49b9ac76ef 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-10-25 +date: 2024-10-27 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 9a24e42b4c094..8dc56e6a9763e 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-10-25 +date: 2024-10-27 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 026598b3bbd44..d6b0d16594daf 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-10-25 +date: 2024-10-27 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 5e00aa68744b5..1b4d9fbd78866 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-10-25 +date: 2024-10-27 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 6c5ffd40097d2..511acb83e6dee 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-10-25 +date: 2024-10-27 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 01bfe64008c4f..9f2e93b647e68 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-10-25 +date: 2024-10-27 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 48c827079d4c9..101b4f7551e2b 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_client.mdx b/api_docs/kbn_server_route_repository_client.mdx index df3dd4e7ef1a6..98d42388a9301 100644 --- a/api_docs/kbn_server_route_repository_client.mdx +++ b/api_docs/kbn_server_route_repository_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-client title: "@kbn/server-route-repository-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-client plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-client'] --- import kbnServerRouteRepositoryClientObj from './kbn_server_route_repository_client.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_utils.mdx b/api_docs/kbn_server_route_repository_utils.mdx index 219d20e06fdc1..e1d27de6477e6 100644 --- a/api_docs/kbn_server_route_repository_utils.mdx +++ b/api_docs/kbn_server_route_repository_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-utils title: "@kbn/server-route-repository-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-utils plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-utils'] --- import kbnServerRouteRepositoryUtilsObj from './kbn_server_route_repository_utils.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 6718c9fe68043..d308d1560020d 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-10-25 +date: 2024-10-27 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 8918e33e3072e..32a02192268cc 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-10-25 +date: 2024-10-27 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 2f5cd7f1ee59c..013fbb2018b4f 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-10-25 +date: 2024-10-27 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 fb0f2a164cc46..f5b6f1c073dd9 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-10-25 +date: 2024-10-27 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 0ba4832f8f822..32c30cc423ded 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-10-25 +date: 2024-10-27 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 475055266cfa3..c3e9ab8b254b5 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-10-25 +date: 2024-10-27 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 fea2785a4e36e..da350b292d2ac 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-10-25 +date: 2024-10-27 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 0eb8e8b77c0d1..2bb79085c3763 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-10-25 +date: 2024-10-27 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 776e90985f11d..158ee878ec0ce 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-10-25 +date: 2024-10-27 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 8d2f988acb993..a3bc602f459b5 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-10-25 +date: 2024-10-27 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 a457331f12046..15c043f74b6bc 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-10-25 +date: 2024-10-27 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 d6a1185ac5cac..0fbbdea618589 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-10-25 +date: 2024-10-27 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 298906c5672b8..c7ca512238429 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-10-25 +date: 2024-10-27 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 345cb99e8e3a4..350c298c15089 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-10-25 +date: 2024-10-27 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 1d4da8757b09f..9833e61908302 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-10-25 +date: 2024-10-27 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 da5dbddd59a1c..25305fe7606cd 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-10-25 +date: 2024-10-27 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 8962455c1e734..b680a8216d054 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-10-25 +date: 2024-10-27 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 fc971eb7e23ed..3dafe7817685d 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-10-25 +date: 2024-10-27 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 fe2af0946b720..1aa228ec5ac50 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-10-25 +date: 2024-10-27 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 5b704a756a9f0..4e61fa18e7837 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-10-25 +date: 2024-10-27 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 a01de092f0d27..930eb0f9056f5 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-10-25 +date: 2024-10-27 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 9013f3ff4680f..1cb1035f333b8 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-10-25 +date: 2024-10-27 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 1cb1d6f05a3f5..858d68e7c5ed9 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-10-25 +date: 2024-10-27 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 7de1d9071c1b3..4512dffce97db 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-10-25 +date: 2024-10-27 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 b9709319635e1..9ca9dc39d4930 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-10-25 +date: 2024-10-27 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 e0b04fd59253c..65d4a0042c2df 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-10-25 +date: 2024-10-27 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 26947ab8a9807..be8377c9dfea7 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-10-25 +date: 2024-10-27 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 ffeedb2f55028..89a97a0c7126e 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-10-25 +date: 2024-10-27 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 1893fbf6bfec4..dc6f7fdaa96c1 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-10-25 +date: 2024-10-27 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 44a27539fd84c..bbce8fac91fcb 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-10-25 +date: 2024-10-27 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 1882a3e06cf4e..4a8ab15fe7373 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-10-25 +date: 2024-10-27 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 094ac671bf5a0..6227613502ed1 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-10-25 +date: 2024-10-27 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 e56c3b05d3661..352966d6b44d3 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-10-25 +date: 2024-10-27 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 1dd9923407c78..29cc1a95c93e1 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-10-25 +date: 2024-10-27 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 58007fe4eda51..0a2d6db51036b 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-10-25 +date: 2024-10-27 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 c6c446c5078a7..8e06087e8040d 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-10-25 +date: 2024-10-27 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 7a63b4c99cfbd..22f6406a288bd 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-10-25 +date: 2024-10-27 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 1dac2749c63c8..c4a1916f5c513 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-10-25 +date: 2024-10-27 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 f9303ffe209eb..e6a85b01a91a3 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-10-25 +date: 2024-10-27 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 86bee58915a67..19d2d50bca51a 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-10-25 +date: 2024-10-27 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 501cf0f6df841..f9096e050b2e0 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-10-25 +date: 2024-10-27 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 d880fada8f33f..b426498ab2c39 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-10-25 +date: 2024-10-27 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 3d8b56b475ab1..20df2b7b9a7db 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-10-25 +date: 2024-10-27 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 3d758e4d42b7a..2a80e83c88cee 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-10-25 +date: 2024-10-27 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 824750cd9eba8..6e919b34fa752 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-10-25 +date: 2024-10-27 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_table_persist.mdx b/api_docs/kbn_shared_ux_table_persist.mdx index db003d9bc2e75..3ce693e46ff4c 100644 --- a/api_docs/kbn_shared_ux_table_persist.mdx +++ b/api_docs/kbn_shared_ux_table_persist.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-table-persist title: "@kbn/shared-ux-table-persist" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-table-persist plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-table-persist'] --- import kbnSharedUxTablePersistObj from './kbn_shared_ux_table_persist.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 5592cedafe191..9790d6bd2c2af 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-10-25 +date: 2024-10-27 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 459b672c7d901..db2defa4abd19 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 5750ee5bad7f1..3165ab57985b6 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-10-25 +date: 2024-10-27 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 c738658afabda..193424cb8f2cc 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_sse_utils.mdx b/api_docs/kbn_sse_utils.mdx index 92a6969399ccf..1e314023fedba 100644 --- a/api_docs/kbn_sse_utils.mdx +++ b/api_docs/kbn_sse_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils title: "@kbn/sse-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils'] --- import kbnSseUtilsObj from './kbn_sse_utils.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_client.mdx b/api_docs/kbn_sse_utils_client.mdx index e60a4b03794e9..d89fc40c3c391 100644 --- a/api_docs/kbn_sse_utils_client.mdx +++ b/api_docs/kbn_sse_utils_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-client title: "@kbn/sse-utils-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-client plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-client'] --- import kbnSseUtilsClientObj from './kbn_sse_utils_client.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_server.mdx b/api_docs/kbn_sse_utils_server.mdx index d78aeb2afba50..cd054acab1cc4 100644 --- a/api_docs/kbn_sse_utils_server.mdx +++ b/api_docs/kbn_sse_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-server title: "@kbn/sse-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-server plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-server'] --- import kbnSseUtilsServerObj from './kbn_sse_utils_server.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 1273349a1f7e8..97589351d2a6a 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-10-25 +date: 2024-10-27 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 dffda67527183..45cf70edeadf0 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-10-25 +date: 2024-10-27 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 af78a4a8cc9f0..fb690dff7f5ce 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_synthetics_e2e.mdx b/api_docs/kbn_synthetics_e2e.mdx index 4f2b1ab687a51..4c1e5f206bea2 100644 --- a/api_docs/kbn_synthetics_e2e.mdx +++ b/api_docs/kbn_synthetics_e2e.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-e2e title: "@kbn/synthetics-e2e" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-e2e plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-e2e'] --- import kbnSyntheticsE2eObj from './kbn_synthetics_e2e.devdocs.json'; diff --git a/api_docs/kbn_synthetics_private_location.mdx b/api_docs/kbn_synthetics_private_location.mdx index f8f61aef9772d..d9b869a6b632d 100644 --- a/api_docs/kbn_synthetics_private_location.mdx +++ b/api_docs/kbn_synthetics_private_location.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-private-location title: "@kbn/synthetics-private-location" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-private-location plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-private-location'] --- import kbnSyntheticsPrivateLocationObj from './kbn_synthetics_private_location.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 9c7c8fe29101e..3ddd87fc5cf21 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-10-25 +date: 2024-10-27 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 39410cab15250..79a83b98ec40d 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-10-25 +date: 2024-10-27 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 142898e0e6c55..816646fef8953 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-10-25 +date: 2024-10-27 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 6914792e26917..8039de4026492 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-10-25 +date: 2024-10-27 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 306475a2fdefb..15dd37e46dac3 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index 80c5a764632d7..f27c18987c977 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-10-25 +date: 2024-10-27 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 e68a201d844ae..122f5e5e558fa 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_transpose_utils.mdx b/api_docs/kbn_transpose_utils.mdx index ee37aecc12c0a..537b4b2d977a7 100644 --- a/api_docs/kbn_transpose_utils.mdx +++ b/api_docs/kbn_transpose_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-transpose-utils title: "@kbn/transpose-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/transpose-utils plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/transpose-utils'] --- import kbnTransposeUtilsObj from './kbn_transpose_utils.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index e6d094147a15e..b838ded1ee99f 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-10-25 +date: 2024-10-27 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_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index 987f45ee38df4..61d2d9aa98a9c 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 5ec77e2a06e07..9f792e4913a1b 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-10-25 +date: 2024-10-27 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 5a5289b6cb2ae..155e4604b67fd 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-10-25 +date: 2024-10-27 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 d71283b636a38..d17cf0be1a635 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-10-25 +date: 2024-10-27 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 471dc6005706e..d6836492e6f1b 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-10-25 +date: 2024-10-27 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 499acfa51ffcc..d79d29085b115 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-10-25 +date: 2024-10-27 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 dbde5de2a9249..b66d425ac7820 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-10-25 +date: 2024-10-27 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 823164c970adb..686fe0b085753 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-10-25 +date: 2024-10-27 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 c8765f73d5594..169d25414c62a 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-10-25 +date: 2024-10-27 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 0ed9d524f0d19..f900c622d1066 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index c5d4a02e9ba62..b12c33f70b5ea 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] --- import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 29ed5875748a2..50e81626dad79 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-10-25 +date: 2024-10-27 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 e968891699024..eacc472bdad86 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-10-25 +date: 2024-10-27 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 ebeaae075a431..6ce5b5bb1e3da 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-10-25 +date: 2024-10-27 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 9bb52295063b3..145f518501d87 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-10-25 +date: 2024-10-27 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 c366526745baa..297390b23c88e 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-10-25 +date: 2024-10-27 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 eb515ec4ae82c..d116550505dbf 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-10-25 +date: 2024-10-27 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 bc5e2f54a73d5..1e9eb13a01513 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-10-25 +date: 2024-10-27 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 840e46e49eabc..632ef783b8aa2 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-10-25 +date: 2024-10-27 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 d9545969d2fa0..0cbb0bc6a9675 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-10-25 +date: 2024-10-27 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.mdx b/api_docs/kbn_zod.mdx index 16aff3c1e9584..95c3748135fde 100644 --- a/api_docs/kbn_zod.mdx +++ b/api_docs/kbn_zod.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod title: "@kbn/zod" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod'] --- import kbnZodObj from './kbn_zod.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 0791b1759db0c..a9bcfe80b9f95 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-10-25 +date: 2024-10-27 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 4d71a4dc33e76..7ef09dd89e61a 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-10-25 +date: 2024-10-27 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 62b96df12b69f..8fc874e9f7b96 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-10-25 +date: 2024-10-27 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 b2563e3613201..aabedd032b36e 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-10-25 +date: 2024-10-27 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 461b933e6dcf9..ced61c9881d0a 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 27e7e0a324279..cb14f93bdc64d 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -764,19 +764,18 @@ }, { "parentPluginId": "lens", - "id": "def-public.Embeddable.canViewUnderlyingData", - "type": "Function", + "id": "def-public.Embeddable.canViewUnderlyingData$", + "type": "Object", "tags": [], - "label": "canViewUnderlyingData", + "label": "canViewUnderlyingData$", "description": [], "signature": [ - "() => Promise" + "BehaviorSubject", + "" ], "path": "x-pack/plugins/lens/public/embeddable/embeddable.tsx", "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] + "trackAdoption": false }, { "parentPluginId": "lens", @@ -11401,7 +11400,15 @@ "section": "def-public.LensSavedObjectAttributes", "text": "LensSavedObjectAttributes" }, - " | undefined>; canViewUnderlyingData: () => Promise; getViewUnderlyingDataArgs: () => ", + " | undefined>; canViewUnderlyingData$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "; getViewUnderlyingDataArgs: () => ", "ViewUnderlyingDataArgs", "; getFullAttributes: () => ", { diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 7e00249d1c4a9..a36071cda95cd 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-10-25 +date: 2024-10-27 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 45ee50d90bb29..22d2fc78a57ad 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-10-25 +date: 2024-10-27 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 35235fc313ec9..e49c3963b8eed 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-10-25 +date: 2024-10-27 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 c3e88c4f56aed..ccd464668d052 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-10-25 +date: 2024-10-27 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 6fcfed1836120..92680f5ed66f3 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-10-25 +date: 2024-10-27 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 250c0e52f907e..71c8dd5819e1a 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index 893832d32b813..a9e1df0840058 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index 042b42f0acba1..ab51a90676fd3 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-10-25 +date: 2024-10-27 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 4eed158298bc5..e89f97c159fa7 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-10-25 +date: 2024-10-27 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 dd7cdc255be61..7f99a05af1860 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-10-25 +date: 2024-10-27 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 8fc61b422770a..766e1fdf22124 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-10-25 +date: 2024-10-27 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 473061eb99571..b93ad0fc45837 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-10-25 +date: 2024-10-27 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 d88973d983599..2789bf68dd480 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-10-25 +date: 2024-10-27 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 41fa17a04ef93..2970cdd86ac3a 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-10-25 +date: 2024-10-27 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 b0ecd6defef27..583e0bd5a96d6 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-10-25 +date: 2024-10-27 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 f63f4ff6eff9d..92566fcbb484a 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-10-25 +date: 2024-10-27 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 aac666ff72e30..3a56ad7865de1 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-10-25 +date: 2024-10-27 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 0ecb0e676ad05..493edf216126c 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-10-25 +date: 2024-10-27 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 9c73243df6850..c8dc309b5b549 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-10-25 +date: 2024-10-27 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 8e09cfae38518..4a3f6fecf176a 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-10-25 +date: 2024-10-27 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 65fdff4b1242b..d57ab31eb93b3 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-10-25 +date: 2024-10-27 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 524e954236a24..339d237ab38c3 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-10-25 +date: 2024-10-27 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 8515f9c86f398..eed6ed85438f3 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -2394,7 +2394,7 @@ }, "<\"GET /internal/observability_ai_assistant/kb/status\", undefined, ", "ObservabilityAIAssistantRouteHandlerResources", - ", { ready: boolean; error?: any; deployment_state?: ", + ", { enabled: boolean; ready: boolean; error?: any; deployment_state?: ", "MlDeploymentState", " | undefined; allocation_state?: ", "MlDeploymentAllocationState", @@ -3256,7 +3256,7 @@ }, "<\"GET /internal/observability_ai_assistant/kb/status\", undefined, ", "ObservabilityAIAssistantRouteHandlerResources", - ", { ready: boolean; error?: any; deployment_state?: ", + ", { enabled: boolean; ready: boolean; error?: any; deployment_state?: ", "MlDeploymentState", " | undefined; allocation_state?: ", "MlDeploymentAllocationState", @@ -4839,7 +4839,7 @@ }, "<\"GET /internal/observability_ai_assistant/kb/status\", undefined, ", "ObservabilityAIAssistantRouteHandlerResources", - ", { ready: boolean; error?: any; deployment_state?: ", + ", { enabled: boolean; ready: boolean; error?: any; deployment_state?: ", "MlDeploymentState", " | undefined; allocation_state?: ", "MlDeploymentAllocationState", @@ -5944,7 +5944,7 @@ }, "<\"GET /internal/observability_ai_assistant/kb/status\", undefined, ", "ObservabilityAIAssistantRouteHandlerResources", - ", { ready: boolean; error?: any; deployment_state?: ", + ", { enabled: boolean; ready: boolean; error?: any; deployment_state?: ", "MlDeploymentState", " | undefined; allocation_state?: ", "MlDeploymentAllocationState", @@ -7566,7 +7566,7 @@ }, "<\"GET /internal/observability_ai_assistant/kb/status\", undefined, ", "ObservabilityAIAssistantRouteHandlerResources", - ", { ready: boolean; error?: any; deployment_state?: ", + ", { enabled: boolean; ready: boolean; error?: any; deployment_state?: ", "MlDeploymentState", " | undefined; allocation_state?: ", "MlDeploymentAllocationState", diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 1c4817a258856..a83c5ea1b5a87 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-10-25 +date: 2024-10-27 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 92ef3362fae29..f76e79e7f413d 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-10-25 +date: 2024-10-27 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 94db91d595d8e..b595620789c91 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-10-25 +date: 2024-10-27 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 5bfb65e5dcdc3..a3bd4c1024435 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-10-25 +date: 2024-10-27 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 4589bf3c678cc..23560841a20c4 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-10-25 +date: 2024-10-27 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 8e364a4fde118..aaa6bebc3c572 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-10-25 +date: 2024-10-27 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 d8ba4c4ac9964..afd9dbd1ef85c 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-10-25 +date: 2024-10-27 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 45487e50b6834..b57539e5ff29a 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-10-25 +date: 2024-10-27 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 239a584a6473a..ead64f3f00570 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,20 +15,20 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 878 | 750 | 45 | +| 878 | 751 | 45 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 54116 | 242 | 40691 | 2016 | +| 54090 | 242 | 40663 | 2019 | ## 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) | - | 322 | 0 | 316 | 37 | -| | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 2 | 0 | 2 | 0 | +| | [@elastic/appex-sharedux](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. | 72 | 0 | 8 | 2 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 880 | 1 | 848 | 50 | @@ -70,7 +70,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | A stateful layer to register shared features and provide an access point to discover without a direct dependency | 16 | 0 | 15 | 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 | 52 | 0 | 37 | 2 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 575 | 1 | 465 | 9 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 578 | 1 | 468 | 9 | | | [@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/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Adds dashboards for discovering and managing Enterprise Search products. | 5 | 0 | 5 | 0 | @@ -103,7 +103,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 89 | 0 | 89 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 240 | 0 | 24 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Simple UI for managing files in Kibana | 3 | 0 | 3 | 0 | -| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1426 | 5 | 1301 | 76 | +| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1426 | 5 | 1301 | 80 | | ftrApis | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 72 | 0 | 14 | 5 | | globalSearchBar | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 0 | 0 | 0 | 0 | @@ -114,7 +114,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 149 | 0 | 111 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Image embeddable | 1 | 0 | 1 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 0 | -| | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 252 | 0 | 247 | 1 | +| | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 250 | 0 | 245 | 1 | | | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 49 | 0 | 44 | 15 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions | 24 | 0 | 24 | 5 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 0 | @@ -173,8 +173,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 114 | 2 | 109 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 25 | 0 | 25 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 148 | 0 | 139 | 2 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 89 | 0 | 83 | 3 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 100 | 0 | 53 | 1 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 36 | 0 | 30 | 3 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 105 | 0 | 58 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the definition and helper methods around saved searches, used by discover and visualizations. | 61 | 0 | 60 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 32 | 0 | 13 | 0 | | | [@elastic/kibana-reporting-services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Kibana Screenshotting Plugin | 32 | 0 | 8 | 3 | @@ -201,7 +201,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 25 | 0 | 25 | 3 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 10 | 0 | 10 | 0 | | synthetics | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | This plugin visualizes data from Synthetics and Heartbeat, and integrates with other Observability solutions. | 0 | 0 | 0 | 1 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 109 | 0 | 65 | 7 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 108 | 0 | 64 | 7 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 45 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 31 | 0 | 26 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1 | 0 | 1 | 0 | @@ -279,6 +279,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 88 | 1 | 88 | 0 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 109 | 0 | 107 | 1 | +| | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 18 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 41 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | | | [@elastic/appex-qa](https://github.com/orgs/elastic/teams/appex-qa) | - | 9 | 0 | 4 | 0 | @@ -546,7 +547,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 37 | 0 | 27 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 36 | 0 | 7 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 47 | 0 | 40 | 0 | -| | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 126 | 3 | 126 | 0 | +| | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 124 | 3 | 124 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 7 | 1 | 7 | 1 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 12 | 43 | 0 | @@ -631,7 +632,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) | - | 92 | 0 | 80 | 0 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 218 | 0 | 183 | 6 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 224 | 0 | 188 | 6 | | | [@elastic/appex-ai-infra](https://github.com/orgs/elastic/teams/appex-ai-infra) | - | 1 | 0 | 1 | 0 | | | [@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 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index e36455c81e2d7..c0ce357cee562 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-10-25 +date: 2024-10-27 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 f6792abb29a74..90fcae3f2fa53 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-10-25 +date: 2024-10-27 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 c579fdab20a42..2a4c650ac8605 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-10-25 +date: 2024-10-27 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 5857a7a734a83..bd91c309bf7e5 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-10-25 +date: 2024-10-27 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 e9ad7e476da4f..60fc8442debe6 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-10-25 +date: 2024-10-27 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 e1e38ca53773e..a8ae1e1a2c50e 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-10-25 +date: 2024-10-27 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 99651d71f063d..e986e2ea5a122 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-10-25 +date: 2024-10-27 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 7bd0eb9e450c6..7f41a70d5f3ee 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-10-25 +date: 2024-10-27 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 b3b9f7810d7f1..835e03193ae9a 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-10-25 +date: 2024-10-27 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 63902df405436..c2340e9de47d9 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-10-25 +date: 2024-10-27 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 1e7492c993743..92eb82f15762f 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-10-25 +date: 2024-10-27 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 1fb8d2f192992..cb429154f62f2 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.devdocs.json b/api_docs/saved_objects_tagging.devdocs.json index 13b28479824b2..a3672cfb898d8 100644 --- a/api_docs/saved_objects_tagging.devdocs.json +++ b/api_docs/saved_objects_tagging.devdocs.json @@ -3,77 +3,7 @@ "client": { "classes": [], "functions": [], - "interfaces": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-public.Tag", - "type": "Interface", - "tags": [], - "label": "Tag", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-public.Tag.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-public.Tag.managed", - "type": "boolean", - "tags": [], - "label": "managed", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-public.Tag.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-public.Tag.description", - "type": "string", - "tags": [], - "label": "description", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-public.Tag.color", - "type": "string", - "tags": [], - "label": "color", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - } - ], + "interfaces": [], "enums": [], "misc": [], "objects": [], @@ -171,355 +101,6 @@ } ], "initialIsOpen": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient", - "type": "Interface", - "tags": [], - "label": "ITagsClient", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.create", - "type": "Function", - "tags": [], - "label": "create", - "description": [], - "signature": [ - "(attributes: ", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.TagAttributes", - "text": "TagAttributes" - }, - ", options?: ", - "CreateTagOptions", - " | undefined) => Promise<", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.Tag", - "text": "Tag" - }, - ">" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.create.$1", - "type": "Object", - "tags": [], - "label": "attributes", - "description": [], - "signature": [ - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.TagAttributes", - "text": "TagAttributes" - } - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.create.$2", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - "CreateTagOptions", - " | undefined" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - } - ], - "returnComment": [] - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.get", - "type": "Function", - "tags": [], - "label": "get", - "description": [], - "signature": [ - "(id: string) => Promise<", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.Tag", - "text": "Tag" - }, - ">" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.get.$1", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.getAll", - "type": "Function", - "tags": [], - "label": "getAll", - "description": [], - "signature": [ - "(options?: ", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.GetAllTagsOptions", - "text": "GetAllTagsOptions" - }, - " | undefined) => Promise<", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.Tag", - "text": "Tag" - }, - "[]>" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.getAll.$1", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.GetAllTagsOptions", - "text": "GetAllTagsOptions" - }, - " | undefined" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - } - ], - "returnComment": [] - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.findByName", - "type": "Function", - "tags": [], - "label": "findByName", - "description": [], - "signature": [ - "(name: string, options?: { exact?: boolean | undefined; } | undefined) => Promise<", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.Tag", - "text": "Tag" - }, - " | null>" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.findByName.$1", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.findByName.$2", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.findByName.$2.exact", - "type": "CompoundType", - "tags": [], - "label": "exact", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ], - "returnComment": [] - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.delete", - "type": "Function", - "tags": [], - "label": "delete", - "description": [], - "signature": [ - "(id: string) => Promise" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.delete.$1", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.update", - "type": "Function", - "tags": [], - "label": "update", - "description": [], - "signature": [ - "(id: string, attributes: ", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.TagAttributes", - "text": "TagAttributes" - }, - ") => Promise<", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.Tag", - "text": "Tag" - }, - ">" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.update.$1", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-server.ITagsClient.update.$2", - "type": "Object", - "tags": [], - "label": "attributes", - "description": [], - "signature": [ - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.TagAttributes", - "text": "TagAttributes" - } - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false } ], "enums": [], @@ -831,471 +412,6 @@ } ], "interfaces": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient", - "type": "Interface", - "tags": [], - "label": "ITagsClient", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.create", - "type": "Function", - "tags": [], - "label": "create", - "description": [], - "signature": [ - "(attributes: ", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.TagAttributes", - "text": "TagAttributes" - }, - ", options?: ", - "CreateTagOptions", - " | undefined) => Promise<", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.Tag", - "text": "Tag" - }, - ">" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.create.$1", - "type": "Object", - "tags": [], - "label": "attributes", - "description": [], - "signature": [ - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.TagAttributes", - "text": "TagAttributes" - } - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.create.$2", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - "CreateTagOptions", - " | undefined" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - } - ], - "returnComment": [] - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.get", - "type": "Function", - "tags": [], - "label": "get", - "description": [], - "signature": [ - "(id: string) => Promise<", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.Tag", - "text": "Tag" - }, - ">" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.get.$1", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.getAll", - "type": "Function", - "tags": [], - "label": "getAll", - "description": [], - "signature": [ - "(options?: ", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.GetAllTagsOptions", - "text": "GetAllTagsOptions" - }, - " | undefined) => Promise<", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.Tag", - "text": "Tag" - }, - "[]>" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.getAll.$1", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "signature": [ - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.GetAllTagsOptions", - "text": "GetAllTagsOptions" - }, - " | undefined" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - } - ], - "returnComment": [] - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.findByName", - "type": "Function", - "tags": [], - "label": "findByName", - "description": [], - "signature": [ - "(name: string, options?: { exact?: boolean | undefined; } | undefined) => Promise<", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.Tag", - "text": "Tag" - }, - " | null>" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.findByName.$1", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.findByName.$2", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.findByName.$2.exact", - "type": "CompoundType", - "tags": [], - "label": "exact", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ], - "returnComment": [] - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.delete", - "type": "Function", - "tags": [], - "label": "delete", - "description": [], - "signature": [ - "(id: string) => Promise" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.delete.$1", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.update", - "type": "Function", - "tags": [], - "label": "update", - "description": [], - "signature": [ - "(id: string, attributes: ", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.TagAttributes", - "text": "TagAttributes" - }, - ") => Promise<", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.Tag", - "text": "Tag" - }, - ">" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.update.$1", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.ITagsClient.update.$2", - "type": "Object", - "tags": [], - "label": "attributes", - "description": [], - "signature": [ - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.TagAttributes", - "text": "TagAttributes" - } - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.Tag", - "type": "Interface", - "tags": [], - "label": "Tag", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.Tag.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.Tag.managed", - "type": "boolean", - "tags": [], - "label": "managed", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.Tag.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.Tag.description", - "type": "string", - "tags": [], - "label": "description", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.Tag.color", - "type": "string", - "tags": [], - "label": "color", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.TagAttributes", - "type": "Interface", - "tags": [], - "label": "TagAttributes", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.TagAttributes.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.TagAttributes.description", - "type": "string", - "tags": [], - "label": "description", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.TagAttributes.color", - "type": "string", - "tags": [], - "label": "color", - "description": [], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "savedObjectsTagging", "id": "def-common.TagsCapabilities", @@ -1513,36 +629,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.TagSavedObject", - "type": "Type", - "tags": [], - "label": "TagSavedObject", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-saved-objects-common", - "scope": "common", - "docId": "kibKbnCoreSavedObjectsCommonPluginApi", - "section": "def-common.SavedObject", - "text": "SavedObject" - }, - "<", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.TagAttributes", - "text": "TagAttributes" - }, - ">" - ], - "path": "x-pack/plugins/saved_objects_tagging/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "savedObjectsTagging", "id": "def-common.tagSavedObjectTypeName", @@ -1559,51 +645,6 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.TagWithOptionalId", - "type": "Type", - "tags": [], - "label": "TagWithOptionalId", - "description": [], - "signature": [ - "Omit<", - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.Tag", - "text": "Tag" - }, - ", \"id\"> & { id?: string | undefined; }" - ], - "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "savedObjectsTagging", - "id": "def-common.TagWithRelations", - "type": "Type", - "tags": [], - "label": "TagWithRelations", - "description": [], - "signature": [ - { - "pluginId": "savedObjectsTaggingOss", - "scope": "common", - "docId": "kibSavedObjectsTaggingOssPluginApi", - "section": "def-common.Tag", - "text": "Tag" - }, - " & { relationCount: number; }" - ], - "path": "x-pack/plugins/saved_objects_tagging/common/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false } ], "objects": [] diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 0fb0e3ab4bfc5..21f273ba7e76b 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; @@ -21,16 +21,13 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 89 | 0 | 83 | 3 | +| 36 | 0 | 30 | 3 | ## Client ### Start -### Interfaces - - ## Server ### Start diff --git a/api_docs/saved_objects_tagging_oss.devdocs.json b/api_docs/saved_objects_tagging_oss.devdocs.json index 0ee6e295f18b2..3b82d21a21b2c 100644 --- a/api_docs/saved_objects_tagging_oss.devdocs.json +++ b/api_docs/saved_objects_tagging_oss.devdocs.json @@ -1451,6 +1451,76 @@ "classes": [], "functions": [], "interfaces": [ + { + "parentPluginId": "savedObjectsTaggingOss", + "id": "def-common.CreateTagOptions", + "type": "Interface", + "tags": [], + "label": "CreateTagOptions", + "description": [], + "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "savedObjectsTaggingOss", + "id": "def-common.CreateTagOptions.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "savedObjectsTaggingOss", + "id": "def-common.CreateTagOptions.overwrite", + "type": "CompoundType", + "tags": [], + "label": "overwrite", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "savedObjectsTaggingOss", + "id": "def-common.CreateTagOptions.refresh", + "type": "CompoundType", + "tags": [], + "label": "refresh", + "description": [], + "signature": [ + "boolean | \"wait_for\" | undefined" + ], + "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "savedObjectsTaggingOss", + "id": "def-common.CreateTagOptions.managed", + "type": "CompoundType", + "tags": [], + "label": "managed", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "savedObjectsTaggingOss", "id": "def-common.GetAllTagsOptions", @@ -1507,7 +1577,13 @@ "text": "TagAttributes" }, ", options?: ", - "CreateTagOptions", + { + "pluginId": "savedObjectsTaggingOss", + "scope": "common", + "docId": "kibSavedObjectsTaggingOssPluginApi", + "section": "def-common.CreateTagOptions", + "text": "CreateTagOptions" + }, " | undefined) => Promise<", { "pluginId": "savedObjectsTaggingOss", @@ -1551,7 +1627,13 @@ "label": "options", "description": [], "signature": [ - "CreateTagOptions", + { + "pluginId": "savedObjectsTaggingOss", + "scope": "common", + "docId": "kibSavedObjectsTaggingOssPluginApi", + "section": "def-common.CreateTagOptions", + "text": "CreateTagOptions" + }, " | undefined" ], "path": "src/plugins/saved_objects_tagging_oss/common/types.ts", diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index e79c626159bca..5d8b3deb17fa7 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 100 | 0 | 53 | 1 | +| 105 | 0 | 58 | 0 | ## Client diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 0491dfa40fb07..f9d362318a1a7 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-10-25 +date: 2024-10-27 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 3a6f46a1781f8..be96cfa480480 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-10-25 +date: 2024-10-27 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 6c32d66087e2a..d0da6b1e456d4 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_assistant.mdx b/api_docs/search_assistant.mdx index 344bcb84a50a5..161cc5d7f721a 100644 --- a/api_docs/search_assistant.mdx +++ b/api_docs/search_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchAssistant title: "searchAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the searchAssistant plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchAssistant'] --- import searchAssistantObj from './search_assistant.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 62bdb500e93c0..2cbc5eccbff16 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index ca3b5baf13216..0b6bb0cc4cca9 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_indices.mdx b/api_docs/search_indices.mdx index a66160b5502f9..7eba82aa8d0d8 100644 --- a/api_docs/search_indices.mdx +++ b/api_docs/search_indices.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchIndices title: "searchIndices" image: https://source.unsplash.com/400x175/?github description: API docs for the searchIndices plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchIndices'] --- import searchIndicesObj from './search_indices.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index b9328cdd4ffcc..f6b5b635b493d 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 93a3522cb9b8e..7f97b31933c58 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-10-25 +date: 2024-10-27 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 41e9088935d56..5248edf08fff6 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.devdocs.json b/api_docs/security.devdocs.json index a641e9411e347..18274d63075c1 100644 --- a/api_docs/security.devdocs.json +++ b/api_docs/security.devdocs.json @@ -6644,6 +6644,10 @@ { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts" } ] } diff --git a/api_docs/security.mdx b/api_docs/security.mdx index bae120b81c5ef..b01922ad9ab92 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-10-25 +date: 2024-10-27 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 cfeb857bbb82a..275518c9347a9 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -420,7 +420,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"siemMigrationsEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"graphVisualizationInFlyoutEnabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"siemMigrationsEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -500,7 +500,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"siemMigrationsEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsSentinelOneProcessesEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"endpointManagementSpaceAwarenessEnabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewDisabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"disableTimelineSaveTour\" | \"riskEnginePrivilegesRouteEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"responseActionsTelemetryEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"graphVisualizationInFlyoutEnabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | \"dataIngestionHubEnabled\" | \"entityStoreDisabled\" | \"siemMigrationsEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1791,7 +1791,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -2993,7 +2993,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3166,7 +3166,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsSentinelOneProcessesEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly endpointManagementSpaceAwarenessEnabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewDisabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly responseActionsTelemetryEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly graphVisualizationInFlyoutEnabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; readonly dataIngestionHubEnabled: boolean; readonly entityStoreDisabled: boolean; readonly siemMigrationsEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3232,7 +3232,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 excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: true; readonly responseActionsSentinelOneProcessesEnabled: true; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly endpointManagementSpaceAwarenessEnabled: false; readonly securitySolutionNotesEnabled: false; readonly entityAlertPreviewDisabled: false; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly responseActionsTelemetryEnabled: false; readonly jamfDataInAnalyzerEnabled: true; readonly timelineEsqlTabDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly filterProcessDescendantsForEventFiltersEnabled: true; readonly dataIngestionHubEnabled: false; readonly entityStoreDisabled: false; readonly siemMigrationsEnabled: false; }" + "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: true; readonly responseActionsSentinelOneProcessesEnabled: true; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly endpointManagementSpaceAwarenessEnabled: false; readonly securitySolutionNotesEnabled: false; readonly entityAlertPreviewDisabled: false; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly disableTimelineSaveTour: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly responseActionsTelemetryEnabled: false; readonly jamfDataInAnalyzerEnabled: true; readonly timelineEsqlTabDisabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly graphVisualizationInFlyoutEnabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly filterProcessDescendantsForEventFiltersEnabled: true; readonly dataIngestionHubEnabled: false; readonly entityStoreDisabled: false; readonly siemMigrationsEnabled: 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 799d580bc92f1..786a468e240b0 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-10-25 +date: 2024-10-27 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 3bb1db377d6bf..3200fd64958e2 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-10-25 +date: 2024-10-27 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 e6d20157cffb8..336b85229691c 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-10-25 +date: 2024-10-27 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 fb6ee25b16da9..bbe3a99c0e613 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-10-25 +date: 2024-10-27 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 0a39d56a088cf..52d021c6f4343 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-10-25 +date: 2024-10-27 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 e8cc5b79f0430..756c5b8b0c5cc 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-10-25 +date: 2024-10-27 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 e2503457d7cd6..aaa44ef9201a3 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-10-25 +date: 2024-10-27 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 5919a0988b784..98a06f0d34654 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-10-25 +date: 2024-10-27 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 53dcaa9ccd441..ad14c468048db 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-10-25 +date: 2024-10-27 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 364543bcef3e6..d1dfaccfb10c1 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-10-25 +date: 2024-10-27 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 167bd4ba407d2..efeb66af07505 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-10-25 +date: 2024-10-27 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 4e6b8f6db5044..91636172a6851 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-10-25 +date: 2024-10-27 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 ad230c18ae5c4..f1ae68cc3bd4e 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.devdocs.json b/api_docs/task_manager.devdocs.json index 4eec18a6f47c0..88f728716be0e 100644 --- a/api_docs/task_manager.devdocs.json +++ b/api_docs/task_manager.devdocs.json @@ -134,15 +134,7 @@ "section": "def-server.TaskManagerStartContract", "text": "TaskManagerStartContract" }, - ", unknown>, plugins: { cloud?: ", - { - "pluginId": "cloud", - "scope": "server", - "docId": "kibCloudPluginApi", - "section": "def-server.CloudSetup", - "text": "CloudSetup" - }, - " | undefined; usageCollection?: ", + ", unknown>, plugins: { usageCollection?: ", { "pluginId": "usageCollection", "scope": "server", @@ -204,27 +196,6 @@ "deprecated": false, "trackAdoption": false, "children": [ - { - "parentPluginId": "taskManager", - "id": "def-server.TaskManagerPlugin.setup.$2.cloud", - "type": "Object", - "tags": [], - "label": "cloud", - "description": [], - "signature": [ - { - "pluginId": "cloud", - "scope": "server", - "docId": "kibCloudPluginApi", - "section": "def-server.CloudSetup", - "text": "CloudSetup" - }, - " | undefined" - ], - "path": "x-pack/plugins/task_manager/server/plugin.ts", - "deprecated": false, - "trackAdoption": false - }, { "parentPluginId": "taskManager", "id": "def-server.TaskManagerPlugin.setup.$2.usageCollection", diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 5a5f0f87ca35f..6d4b70d1e856d 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.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 | |-------------------|-----------|------------------------|-----------------| -| 109 | 0 | 65 | 7 | +| 108 | 0 | 64 | 7 | ## Server diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index f402acf45c06f..86a749fdc07b2 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-10-25 +date: 2024-10-27 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 611519f28dd38..ffd53bd61abaa 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-10-25 +date: 2024-10-27 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 08bcd82d4751c..525fbb74ac9e3 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-10-25 +date: 2024-10-27 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 578ede36f50fe..bb4b9f0bf18f2 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 16c8b51601af5..6b562ff29555e 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-10-25 +date: 2024-10-27 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 63ef6479c8745..2f53d06d5037d 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-10-25 +date: 2024-10-27 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 70c2bb6e660e3..d7fb4a184ad08 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-10-25 +date: 2024-10-27 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 a331cc99a2476..d3fa8ec54739b 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-10-25 +date: 2024-10-27 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 3b6848a87016c..03fcb22399e4b 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-10-25 +date: 2024-10-27 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 280f694f36b66..4e8b8b1301e94 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-10-25 +date: 2024-10-27 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 3b782f0785a09..0be838c5e4933 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-10-25 +date: 2024-10-27 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 b5a4445640eab..fd26be77f8800 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-10-25 +date: 2024-10-27 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 100b60e87605b..0e123243a9f62 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-10-25 +date: 2024-10-27 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 3fc6f67275a87..8dcce2b1ab86e 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-10-25 +date: 2024-10-27 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 34573796bb3af..55af80ab23aaa 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-10-25 +date: 2024-10-27 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 b3329138f61a8..d9c9ff108aa0a 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-10-25 +date: 2024-10-27 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 7bc577aa729de..a57f3e33baa86 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-10-25 +date: 2024-10-27 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 9e3366bb305dc..f4d71ab01f85c 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-10-25 +date: 2024-10-27 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 2496dfbc96e48..558adeae30271 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-10-25 +date: 2024-10-27 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 5264dea7092c5..8747ba2842373 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-10-25 +date: 2024-10-27 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 5c10e69ade3c1..97f5c9fb1fa18 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-10-25 +date: 2024-10-27 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 7f9475ba64793..3b2593c03f0a2 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-10-25 +date: 2024-10-27 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 876c30ba6d62f..dcebfd87749aa 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-10-25 +date: 2024-10-27 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 6425e01e09e75..555cafee7bc25 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-10-25 +date: 2024-10-27 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 ff46daef026ad..16f64245c2303 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-10-25 +date: 2024-10-27 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 03500f2fb8b8f..3cc2ba78c3a18 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-10-25 +date: 2024-10-27 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 cff1b9359f925..118052e4ba715 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-10-25 +date: 2024-10-27 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 2305809f08236..ebf14c56847a1 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-10-25 +date: 2024-10-27 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 4ffa3d6ca8856..b3a0a1f575137 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -6976,7 +6976,15 @@ "section": "def-public.PublishesViewMode", "text": "PublishesViewMode" }, - ">) | undefined; disableTriggers: boolean; timeRange$: ", + ">) | undefined; hasLockedHoverActions$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "; lockHoverActions: (lock: boolean) => void; disableTriggers: boolean; timeRange$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 5d8fbb1f4fa01..ea8a18adaf9d2 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-10-25 +date: 2024-10-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 37a4691ab6b33886b20126b54120f37002f26125 Mon Sep 17 00:00:00 2001 From: Rickyanto Ang Date: Sun, 27 Oct 2024 23:47:01 +0700 Subject: [PATCH 056/135] [Cloud Security] Clicking on Contextual Flyout popout Icon now opens page in new tab (#196763) ## Summary Currently when user clicks on Popout icon on Misconfiguration or Vulnerabilities Contextual flyout, user gets redirected to Findings page but in the same tab. Popout Icon implies that it should navigate user to other page on separate Tabs as such the current behaviour is not right. This PR addresses that issue --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../public/index.ts | 2 +- .../hooks/use_get_navigation_url_params.ts | 33 ++++++ .../public/src/hooks/use_navigate_findings.ts | 60 ++-------- .../public/src/utils/query_utils.test.ts | 107 ++++++++++++++++++ .../public/src/utils/query_utils.ts | 62 ++++++++++ .../public/tsconfig.json | 1 + .../dashboard_sections/benchmarks_section.tsx | 2 +- .../dashboard_sections/summary_section.tsx | 2 +- .../vulnerability_table_panel_section.tsx | 2 +- ...isconfiguration_findings_details_table.tsx | 45 +++++--- ...vulnerabilities_findings_details_table.tsx | 60 ++++++---- 11 files changed, 280 insertions(+), 96 deletions(-) create mode 100644 x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_get_navigation_url_params.ts create mode 100644 x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.test.ts diff --git a/x-pack/packages/kbn-cloud-security-posture/public/index.ts b/x-pack/packages/kbn-cloud-security-posture/public/index.ts index c39a86f5ec64b..bf4bccda2816e 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/index.ts +++ b/x-pack/packages/kbn-cloud-security-posture/public/index.ts @@ -8,7 +8,7 @@ export * from './src/types'; export * from './src/constants/component_constants'; export * from './src/constants/navigation'; -export type { NavFilter } from './src/hooks/use_navigate_findings'; +export type { NavFilter } from './src/utils/query_utils'; export { showErrorToast } from './src/utils/show_error_toast'; export { encodeQuery, decodeQuery } from './src/utils/query_utils'; export { CspEvaluationBadge } from './src/components/csp_evaluation_badge'; diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_get_navigation_url_params.ts b/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_get_navigation_url_params.ts new file mode 100644 index 0000000000000..792ac7b9c5a35 --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_get_navigation_url_params.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 { CoreStart } from '@kbn/core-lifecycle-browser'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { useCallback } from 'react'; +import { CspClientPluginStartDeps } from '../types'; +import { NavFilter, encodeQueryUrl, composeQueryFilters } from '../utils/query_utils'; + +export const useGetNavigationUrlParams = () => { + const { services } = useKibana(); + + const getNavUrlParams = useCallback( + ( + filterParams: NavFilter = {}, + findingsType?: 'configurations' | 'vulnerabilities', + groupBy?: string[] + ) => { + const filters = composeQueryFilters(filterParams); + + const searchParams = new URLSearchParams(encodeQueryUrl(services.data, filters, groupBy)); + + return `${findingsType ? findingsType : ''}?${searchParams.toString()}`; + }, + [services.data] + ); + + return getNavUrlParams; +}; diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts b/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts index 454c9a0056a58..5028b53b90ec9 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts +++ b/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts @@ -7,74 +7,28 @@ import { useCallback } from 'react'; import { useHistory } from 'react-router-dom'; -import { Filter } from '@kbn/es-query'; -import { - SECURITY_DEFAULT_DATA_VIEW_ID, - CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX, -} from '@kbn/cloud-security-posture-common'; +import { CDR_MISCONFIGURATIONS_DATA_VIEW_ID_PREFIX } from '@kbn/cloud-security-posture-common'; import type { CoreStart } from '@kbn/core/public'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { findingsNavigation } from '../constants/navigation'; import { useDataView } from './use_data_view'; import { CspClientPluginStartDeps } from '../..'; -import { encodeQuery } from '../utils/query_utils'; +import { NavFilter, encodeQueryUrl, composeQueryFilters } from '../utils/query_utils'; -interface NegatedValue { - value: string | number; - negate: boolean; -} - -type FilterValue = string | number | NegatedValue; - -export type NavFilter = Record; - -const createFilter = (key: string, filterValue: FilterValue, dataViewId: string): Filter => { - let negate = false; - let value = filterValue; - if (typeof filterValue === 'object') { - negate = filterValue.negate; - value = filterValue.value; - } - // If the value is '*', we want to create an exists filter - if (value === '*') { - return { - query: { exists: { field: key } }, - meta: { type: 'exists', index: dataViewId }, - }; - } - return { - meta: { - alias: null, - negate, - disabled: false, - type: 'phrase', - key, - index: dataViewId, - }, - query: { match_phrase: { [key]: value } }, - }; -}; -const useNavigate = (pathname: string, dataViewId = SECURITY_DEFAULT_DATA_VIEW_ID) => { +const useNavigate = (pathname: string, dataViewId?: string) => { const history = useHistory(); - const { services } = useKibana(); + const { services } = useKibana(); return useCallback( (filterParams: NavFilter = {}, groupBy?: string[]) => { - const filters = Object.entries(filterParams).map(([key, filterValue]) => - createFilter(key, filterValue, dataViewId) - ); + const filters = composeQueryFilters(filterParams, dataViewId); history.push({ pathname, - search: encodeQuery({ - // Set query language from user's preference - query: services.data.query.queryString.getDefaultQuery(), - filters, - ...(groupBy && { groupBy }), - }), + search: encodeQueryUrl(services.data, filters, groupBy), }); }, - [history, pathname, services.data.query.queryString, dataViewId] + [dataViewId, history, pathname, services.data] ); }; diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.test.ts b/x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.test.ts new file mode 100644 index 0000000000000..1302702b54287 --- /dev/null +++ b/x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.test.ts @@ -0,0 +1,107 @@ +/* + * 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 { encodeQueryUrl, composeQueryFilters } from './query_utils'; +import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; + +const DEFAULT_DATA_VIEW_ID = 'security-solution-default'; + +describe('composeQueryFilters', () => { + it('Should return correct filters given some filterParams', () => { + const testFilterParams = { + test_field: 'test_value', + }; + const testResult = [ + { + meta: { + alias: null, + negate: false, + disabled: false, + type: 'phrase', + key: 'test_field', + index: DEFAULT_DATA_VIEW_ID, + }, + query: { match_phrase: { test_field: 'test_value' } }, + }, + ]; + expect(composeQueryFilters(testFilterParams)).toEqual(testResult); + }); + + it('Should return empty filters given empty filterParams', () => { + expect(composeQueryFilters({})).toEqual([]); + }); + + it('Should return correct filters given some filterParams and dataviewId', () => { + const testFilterParams = { + test_field: 'test_value', + }; + const testResult = [ + { + meta: { + alias: null, + negate: false, + disabled: false, + type: 'phrase', + key: 'test_field', + index: 'test-data-view', + }, + query: { match_phrase: { test_field: 'test_value' } }, + }, + ]; + expect(composeQueryFilters(testFilterParams, 'test-data-view')).toEqual(testResult); + }); +}); + +describe('encodeQueryUrl', () => { + const getServicesMock = () => ({ + data: dataPluginMock.createStartContract(), + }); + + it('Should return correct URL given empty filters', () => { + const result = 'cspq=(filters:!())'; + expect(encodeQueryUrl(getServicesMock().data, [])).toEqual(result); + }); + + it('should return correct URL given filters', () => { + const filter = [ + { + meta: { + alias: null, + negate: false, + disabled: false, + type: 'phrase', + key: 'test_field', + index: DEFAULT_DATA_VIEW_ID, + }, + query: { match_phrase: { test_field: 'test_value' } }, + }, + ]; + const result = + 'cspq=(filters:!((meta:(alias:!n,disabled:!f,index:security-solution-default,key:test_field,negate:!f,type:phrase),query:(match_phrase:(test_field:test_value)))))'; + expect(encodeQueryUrl(getServicesMock().data, filter)).toEqual(result); + }); + + it('should return correct URL given filters and group by', () => { + const filter = [ + { + meta: { + alias: null, + negate: false, + disabled: false, + type: 'phrase', + key: 'test_field', + index: DEFAULT_DATA_VIEW_ID, + }, + query: { match_phrase: { test_field: 'test_value' } }, + }, + ]; + const groupByFilter = ['filterA']; + const result = + 'cspq=(filters:!((meta:(alias:!n,disabled:!f,index:security-solution-default,key:test_field,negate:!f,type:phrase),query:(match_phrase:(test_field:test_value)))),groupBy:!(filterA))'; + expect(encodeQueryUrl(getServicesMock().data, filter, groupByFilter)).toEqual(result); + }); +}); diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.ts b/x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.ts index 3a051456733a6..6cb5c1384e732 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.ts +++ b/x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.ts @@ -4,8 +4,21 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import { encode, decode } from '@kbn/rison'; import type { LocationDescriptorObject } from 'history'; +import { Filter } from '@kbn/es-query'; +import { SECURITY_DEFAULT_DATA_VIEW_ID } from '@kbn/cloud-security-posture-common'; +import { DataPublicPluginStart } from '@kbn/data-plugin/public'; + +interface NegatedValue { + value: string | number; + negate: boolean; +} + +type FilterValue = string | number | NegatedValue; + +export type NavFilter = Record; const encodeRison = (v: any): string | undefined => { try { @@ -38,3 +51,52 @@ export const decodeQuery = (search?: string): Partial | un if (!risonQuery) return; return decodeRison(risonQuery); }; + +export const encodeQueryUrl = ( + servicesStart: DataPublicPluginStart, + filters: Filter[], + groupBy?: string[] +): any => { + return encodeQuery({ + query: servicesStart.query.queryString.getDefaultQuery(), + filters, + ...(groupBy && { groupBy }), + }); +}; + +// dataViewId is used to prevent FilterManager from falling back to the default in the sorcerer (logs-*) +export const composeQueryFilters = ( + filterParams: NavFilter = {}, + dataViewId = SECURITY_DEFAULT_DATA_VIEW_ID +): Filter[] => { + return Object.entries(filterParams).map(([key, filterValue]) => + createFilter(key, filterValue, dataViewId) + ); +}; + +export const createFilter = (key: string, filterValue: FilterValue, dataViewId: string): Filter => { + let negate = false; + let value = filterValue; + if (typeof filterValue === 'object') { + negate = filterValue.negate; + value = filterValue.value; + } + // If the value is '*', we want to create an exists filter + if (value === '*') { + return { + query: { exists: { field: key } }, + meta: { type: 'exists', index: dataViewId }, + }; + } + return { + meta: { + alias: null, + negate, + disabled: false, + type: 'phrase', + key, + index: dataViewId, + }, + query: { match_phrase: { [key]: value } }, + }; +}; diff --git a/x-pack/packages/kbn-cloud-security-posture/public/tsconfig.json b/x-pack/packages/kbn-cloud-security-posture/public/tsconfig.json index e7f69a99c5199..8c950553c7cde 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/tsconfig.json +++ b/x-pack/packages/kbn-cloud-security-posture/public/tsconfig.json @@ -35,5 +35,6 @@ "@kbn/ui-theme", "@kbn/i18n-react", "@kbn/rison", + "@kbn/core-lifecycle-browser", ] } diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx index 4a4d4b6c1b193..f4cc7a5ba0028 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/benchmarks_section.tsx @@ -13,7 +13,7 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; import { useNavigateFindings } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; -import type { NavFilter } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; +import type { NavFilter } from '@kbn/cloud-security-posture/src/utils/query_utils'; import type { BenchmarkData, ComplianceDashboardDataV2, diff --git a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx index 9cb41910f8f83..e5ea0a9139a7e 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/compliance_dashboard/dashboard_sections/summary_section.tsx @@ -16,7 +16,7 @@ import { import { i18n } from '@kbn/i18n'; import { css } from '@emotion/react'; import { CSPM_POLICY_TEMPLATE, KSPM_POLICY_TEMPLATE } from '@kbn/cloud-security-posture-common'; -import type { NavFilter } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; +import type { NavFilter } from '@kbn/cloud-security-posture/src/utils/query_utils'; import { useNavigateFindings } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; import { useCspIntegrationLink } from '../../../common/navigation/use_csp_integration_link'; import { DASHBOARD_COUNTER_CARDS, DASHBOARD_SUMMARY_CONTAINER } from '../test_subjects'; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel_section.tsx b/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel_section.tsx index 28012e3e8e438..a4e3dd38b28a1 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel_section.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel_section.tsx @@ -16,7 +16,7 @@ import { useEuiTheme, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import type { NavFilter } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; +import type { NavFilter } from '@kbn/cloud-security-posture/src/utils/query_utils'; import { useNavigateVulnerabilities } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; import type { VulnSeverity } from '@kbn/cloud-security-posture-common'; import { CVSScoreBadge, SeverityStatusBadge } from '@kbn/cloud-security-posture'; diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/misconfiguration_findings_details_table.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/misconfiguration_findings_details_table.tsx index c03dc319952b5..8d4088b19f9b6 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/misconfiguration_findings_details_table.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/misconfiguration_findings_details_table.tsx @@ -7,14 +7,13 @@ import React, { memo, useEffect, useState } from 'react'; import type { Criteria, EuiBasicTableColumn } from '@elastic/eui'; -import { EuiSpacer, EuiIcon, EuiPanel, EuiLink, EuiText, EuiBasicTable } from '@elastic/eui'; +import { EuiSpacer, EuiPanel, EuiText, EuiBasicTable, EuiIcon } from '@elastic/eui'; import { useMisconfigurationFindings } from '@kbn/cloud-security-posture/src/hooks/use_misconfiguration_findings'; import { i18n } from '@kbn/i18n'; import type { CspFinding, CspFindingResult } from '@kbn/cloud-security-posture-common'; import { buildEntityFlyoutPreviewQuery } from '@kbn/cloud-security-posture-common'; import { euiThemeVars } from '@kbn/ui-theme'; import { DistributionBar } from '@kbn/security-solution-distribution-bar'; -import { useNavigateFindings } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; import type { CspBenchmarkRuleMetadata } from '@kbn/cloud-security-posture-common/schema/rules/latest'; import { CspEvaluationBadge } from '@kbn/cloud-security-posture'; import { @@ -24,6 +23,9 @@ import { uiMetricService, } from '@kbn/cloud-security-posture-common/utils/ui_metrics'; import { METRIC_TYPE } from '@kbn/analytics'; +import { useGetNavigationUrlParams } from '@kbn/cloud-security-posture/src/hooks/use_get_navigation_url_params'; +import { SecurityPageName } from '@kbn/deeplinks-security'; +import { SecuritySolutionLinkAnchor } from '../../../common/components/links'; type MisconfigurationFindingDetailFields = Pick; @@ -114,18 +116,14 @@ export const MisconfigurationFindingsDetailsTable = memo( } }; - const navToFindings = useNavigateFindings(); + const getNavUrlParams = useGetNavigationUrlParams(); - const navToFindingsByRuleAndResourceId = (ruleId: string, resourceId: string) => { - navToFindings({ 'rule.id': ruleId, 'resource.id': resourceId }); + const getFindingsPageUrlFilteredByRuleAndResourceId = (ruleId: string, resourceId: string) => { + return getNavUrlParams({ 'rule.id': ruleId, 'resource.id': resourceId }, 'configurations'); }; - const navToFindingsByName = (name: string, queryField: 'host.name' | 'user.name') => { - uiMetricService.trackUiMetric( - METRIC_TYPE.CLICK, - NAV_TO_FINDINGS_BY_RULE_NAME_FRPOM_ENTITY_FLYOUT - ); - navToFindings({ [queryField]: name }, ['rule.name']); + const getFindingsPageUrl = (name: string, queryField: 'host.name' | 'user.name') => { + return getNavUrlParams({ [queryField]: name }, 'configurations', ['rule.name']); }; const columns: Array> = [ @@ -134,13 +132,23 @@ export const MisconfigurationFindingsDetailsTable = memo( name: '', width: '5%', render: (rule: CspBenchmarkRuleMetadata, finding: MisconfigurationFindingDetailFields) => ( - { - navToFindingsByRuleAndResourceId(rule?.id, finding?.resource?.id); + uiMetricService.trackUiMetric( + METRIC_TYPE.CLICK, + NAV_TO_FINDINGS_BY_RULE_NAME_FRPOM_ENTITY_FLYOUT + ); }} > - + ), }, { @@ -170,13 +178,16 @@ export const MisconfigurationFindingsDetailsTable = memo( return ( <> - { uiMetricService.trackUiMetric( METRIC_TYPE.CLICK, NAV_TO_FINDINGS_BY_HOST_NAME_FRPOM_ENTITY_FLYOUT ); - navToFindingsByName(queryName, fieldName); }} > {i18n.translate( @@ -186,7 +197,7 @@ export const MisconfigurationFindingsDetailsTable = memo( } )} - + diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/vulnerabilities_findings_details_table.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/vulnerabilities_findings_details_table.tsx index f3422564186ed..82c5f91bf4250 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/vulnerabilities_findings_details_table.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/components/csp_details/vulnerabilities_findings_details_table.tsx @@ -7,12 +7,11 @@ import React, { memo, useEffect, useState } from 'react'; import type { Criteria, EuiBasicTableColumn } from '@elastic/eui'; -import { EuiSpacer, EuiIcon, EuiPanel, EuiLink, EuiText, EuiBasicTable } from '@elastic/eui'; +import { EuiSpacer, EuiPanel, EuiText, EuiBasicTable, EuiIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import type { VulnSeverity } from '@kbn/cloud-security-posture-common'; import { buildEntityFlyoutPreviewQuery } from '@kbn/cloud-security-posture-common'; import { DistributionBar } from '@kbn/security-solution-distribution-bar'; -import { useNavigateVulnerabilities } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; import { useVulnerabilitiesFindings } from '@kbn/cloud-security-posture/src/hooks/use_vulnerabilities_findings'; import type { CspVulnerabilityFinding, @@ -29,6 +28,9 @@ import { uiMetricService, } from '@kbn/cloud-security-posture-common/utils/ui_metrics'; import { METRIC_TYPE } from '@kbn/analytics'; +import { SecurityPageName } from '@kbn/deeplinks-security'; +import { useGetNavigationUrlParams } from '@kbn/cloud-security-posture/src/hooks/use_get_navigation_url_params'; +import { SecuritySolutionLinkAnchor } from '../../../common/components/links'; type VulnerabilitiesFindingDetailFields = Pick< CspVulnerabilityFinding, @@ -38,6 +40,7 @@ type VulnerabilitiesFindingDetailFields = Pick< interface VulnerabilitiesPackage extends Vulnerability { package: { name: string; + version: string; }; } @@ -94,20 +97,27 @@ export const VulnerabilitiesFindingsDetailsTable = memo(({ queryName }: { queryN } }; - const navToVulnerabilities = useNavigateVulnerabilities(); + const getNavUrlParams = useGetNavigationUrlParams(); - const navToVulnerabilitiesByName = (name: string, queryField: 'host.name' | 'user.name') => { - navToVulnerabilities({ [queryField]: name }); + const getVulnerabilityUrl = (name: string, queryField: 'host.name' | 'user.name') => { + return getNavUrlParams({ [queryField]: name }, 'vulnerabilities'); }; - const navToVulnerabilityByVulnerabilityAndResourceId = ( + const getVulnerabilityUrlFilteredByVulnerabilityAndResourceId = ( vulnerabilityId: string, - resourceId: string + resourceId: string, + vulnerabilityPackageName: string, + vulnerabilityPackageVersion: string ) => { - navToVulnerabilities({ - 'vulnerability.id': vulnerabilityId, - 'resource.id': resourceId, - }); + return getNavUrlParams( + { + 'vulnerability.id': vulnerabilityId, + 'resource.id': resourceId, + 'vulnerability.package.name': vulnerabilityPackageName, + 'vulnerability.package.version': vulnerabilityPackageVersion, + }, + 'vulnerabilities' + ); }; const columns: Array> = [ @@ -119,16 +129,19 @@ export const VulnerabilitiesFindingsDetailsTable = memo(({ queryName }: { queryN vulnerability: VulnerabilitiesPackage, finding: VulnerabilitiesFindingDetailFields ) => ( - { - navToVulnerabilityByVulnerabilityAndResourceId( - vulnerability?.id, - finding?.resource?.id || '' - ); - }} + - + ), }, { @@ -189,20 +202,23 @@ export const VulnerabilitiesFindingsDetailsTable = memo(({ queryName }: { queryN return ( <> - { uiMetricService.trackUiMetric( METRIC_TYPE.CLICK, NAV_TO_FINDINGS_BY_HOST_NAME_FRPOM_ENTITY_FLYOUT ); - navToVulnerabilitiesByName(queryName, 'host.name'); }} > {i18n.translate('xpack.securitySolution.flyout.left.insights.vulnerability.tableTitle', { defaultMessage: 'Vulnerability ', })} - + Date: Mon, 28 Oct 2024 21:01:01 +1100 Subject: [PATCH 057/135] [ES|QL] Update function metadata (#197940) This PR updates the function definitions and inline docs based on the latest metadata from Elasticsearch. --- .../generated/aggregation_functions.ts | 8 ++-- .../definitions/generated/scalar_functions.ts | 40 +++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/generated/aggregation_functions.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/generated/aggregation_functions.ts index 28b4cd4f66443..f73521ddf3a87 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/generated/aggregation_functions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/generated/aggregation_functions.ts @@ -823,7 +823,7 @@ const maxDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, { params: [ @@ -1035,7 +1035,7 @@ const minDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, { params: [ @@ -1491,7 +1491,7 @@ const topDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, ], supportedCommands: ['stats', 'inlinestats', 'metrics'], @@ -1590,7 +1590,7 @@ const valuesDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, { params: [ diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/generated/scalar_functions.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/generated/scalar_functions.ts index 2ace3e9ddc537..4b0ea8ee564ed 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/generated/scalar_functions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/generated/scalar_functions.ts @@ -941,7 +941,7 @@ const coalesceDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', minParams: 1, }, { @@ -957,7 +957,7 @@ const coalesceDefinition: FunctionDefinition = { optional: true, }, ], - returnType: 'text', + returnType: 'keyword', minParams: 1, }, { @@ -1973,7 +1973,7 @@ const greatestDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', minParams: 1, }, { @@ -1989,7 +1989,7 @@ const greatestDefinition: FunctionDefinition = { optional: true, }, ], - returnType: 'text', + returnType: 'keyword', minParams: 1, }, { @@ -2484,7 +2484,7 @@ const leastDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', minParams: 1, }, { @@ -2500,7 +2500,7 @@ const leastDefinition: FunctionDefinition = { optional: true, }, ], - returnType: 'text', + returnType: 'keyword', minParams: 1, }, { @@ -3198,7 +3198,7 @@ const ltrimDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, ], supportedCommands: ['stats', 'inlinestats', 'metrics', 'eval', 'where', 'row', 'sort'], @@ -3475,7 +3475,7 @@ const mvAppendDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, { params: [ @@ -3920,7 +3920,7 @@ const mvDedupeDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, { params: [ @@ -4067,7 +4067,7 @@ const mvFirstDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, { params: [ @@ -4224,7 +4224,7 @@ const mvLastDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, { params: [ @@ -4341,7 +4341,7 @@ const mvMaxDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, { params: [ @@ -4583,7 +4583,7 @@ const mvMinDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, { params: [ @@ -5054,7 +5054,7 @@ const mvSliceDefinition: FunctionDefinition = { optional: true, }, ], - returnType: 'text', + returnType: 'keyword', }, { params: [ @@ -5221,7 +5221,7 @@ const mvSortDefinition: FunctionDefinition = { acceptedValues: ['asc', 'desc'], }, ], - returnType: 'text', + returnType: 'keyword', }, { params: [ @@ -6131,7 +6131,7 @@ const reverseDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, ], supportedCommands: ['stats', 'inlinestats', 'metrics', 'eval', 'where', 'row', 'sort'], @@ -6323,7 +6323,7 @@ const rtrimDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, ], supportedCommands: ['stats', 'inlinestats', 'metrics', 'eval', 'where', 'row', 'sort'], @@ -8597,7 +8597,7 @@ const toLowerDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, ], supportedCommands: ['stats', 'inlinestats', 'metrics', 'eval', 'where', 'row', 'sort'], @@ -8995,7 +8995,7 @@ const toUpperDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, ], supportedCommands: ['stats', 'inlinestats', 'metrics', 'eval', 'where', 'row', 'sort'], @@ -9077,7 +9077,7 @@ const trimDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'text', + returnType: 'keyword', }, ], supportedCommands: ['stats', 'inlinestats', 'metrics', 'eval', 'where', 'row', 'sort'], From a8048ddf6b3f6623c87236c875a0ef1506a39fe2 Mon Sep 17 00:00:00 2001 From: Luke Gmys <11671118+lgestc@users.noreply.github.com> Date: Mon, 28 Oct 2024 12:11:00 +0100 Subject: [PATCH 058/135] [Security Solution] Remove index pattern field from Sourcerer (#190113) ## Summary This PR removes index pattern field from the sourcerer model, replacing it with direct access to data view spec. The end goal for the sourcerer is to just utilize platform wide Data View Types, instead of some custom abstractions / containers such as indexPattern field which is effectively a DataViewSpec, just packed up differently. --- .../top_values_popover/top_values_popover.tsx | 4 +- .../common/components/events_viewer/index.tsx | 9 ++- .../markdown_editor/plugins/insight/index.tsx | 6 +- .../plugins/insight/use_insight_query.ts | 6 +- .../common/components/top_n/index.test.tsx | 4 +- .../public/common/components/top_n/index.tsx | 8 +-- .../common/components/top_n/top_n.test.tsx | 4 +- .../public/common/components/top_n/top_n.tsx | 7 ++- .../alerts/alerts_by_status_donut.test.ts | 1 + .../common/alerts/alerts_histogram.test.ts | 1 + .../common/alerts/alerts_table.test.ts | 1 + .../common/alerts/rule_preview.test.ts | 1 + .../common/authentication.test.ts | 1 + .../lens_attributes/common/event.test.ts | 1 + .../common/external_alert.test.ts | 1 + .../hosts/kpi_host_area.test.ts | 1 + .../hosts/kpi_host_metric.test.ts | 1 + .../hosts/kpi_unique_ips_area.test.ts | 1 + .../hosts/kpi_unique_ips_bar.test.ts | 1 + .../kpi_unique_ips_destination_metric.test.ts | 1 + .../kpi_unique_ips_source_metric.test.ts | 1 + .../network/dns_top_domains.test.ts | 1 + .../network/kpi_dns_queries.test.ts | 1 + .../network/kpi_network_events.test.ts | 1 + .../network/kpi_tls_handshakes.test.ts | 1 + .../network/kpi_unique_flow_ids.test.ts | 1 + .../kpi_unique_private_ips_area.test.ts | 1 + .../kpi_unique_private_ips_bar.test.ts | 1 + ...que_private_ips_destination_metric.test.ts | 1 + ...i_unique_private_ips_source_metric.test.ts | 1 + .../users/kpi_total_users_area.test.ts | 1 + .../users/kpi_total_users_metric.test.ts | 1 + ...user_authentication_metric_failure.test.ts | 1 + .../kpi_user_authentications_area.test.ts | 1 + .../kpi_user_authentications_bar.test.ts | 1 + ...ser_authentications_metric_success.test.ts | 1 + .../use_lens_attributes.test.tsx | 5 ++ .../public/common/lib/kuery/index.test.ts | 6 +- .../public/common/lib/kuery/index.ts | 17 ++++-- .../public/common/mock/index_pattern.ts | 5 ++ .../execution_log_table.test.tsx | 2 +- .../execution_log_table.tsx | 36 ++++++----- .../pages/rule_details/index.tsx | 2 +- .../alerts_kpis/chart_panels/index.test.tsx | 1 + .../alerts_table/alerts_grouping.test.tsx | 1 + .../alerts_table/alerts_grouping.tsx | 8 ++- .../alerts_table/alerts_sub_grouping.tsx | 8 +-- .../components/alerts_table/index.tsx | 16 ++--- .../use_add_bulk_to_timeline.tsx | 7 +-- .../detection_engine_filters.test.tsx | 4 +- .../detection_engine_filters.tsx | 9 ++- .../render_cell_value.test.tsx | 1 + .../rules/use_rule_from_timeline.test.ts | 1 + .../use_persistent_controls.test.tsx | 1 + .../use_persistent_controls.tsx | 8 ++- .../detection_engine.test.tsx | 5 +- .../detection_engine/detection_engine.tsx | 16 +++-- .../api/hooks/use_preview_risk_scores.ts | 60 +++++++++++-------- .../components/risk_score_preview_section.tsx | 41 +++++++------ .../index.tsx | 2 +- .../lens_attributes/risk_score_donut.test.ts | 1 + .../risk_score_over_time_area.test.ts | 1 + .../risk_score_summary.test.ts | 1 + .../hosts/pages/details/details_tabs.test.tsx | 41 +++++++------ .../hosts/pages/details/details_tabs.tsx | 2 +- .../explore/hosts/pages/details/index.tsx | 10 ++-- .../explore/hosts/pages/details/types.ts | 5 +- .../public/explore/hosts/pages/hosts.tsx | 11 ++-- .../network/pages/details/index.test.tsx | 4 ++ .../explore/network/pages/details/index.tsx | 12 ++-- .../pages/navigation/network_routes.tsx | 9 ++- .../explore/network/pages/navigation/types.ts | 5 +- .../explore/network/pages/network.test.tsx | 1 + .../public/explore/network/pages/network.tsx | 11 ++-- .../explore/users/pages/details/index.tsx | 10 ++-- .../explore/users/pages/details/types.ts | 5 +- .../public/explore/users/pages/users.tsx | 11 ++-- .../left/components/entities_details.test.tsx | 4 +- .../left/components/host_details.test.tsx | 4 +- .../left/components/session_view.test.tsx | 3 +- .../left/components/user_details.test.tsx | 4 +- .../use_threat_intelligence_details.test.ts | 3 +- .../hooks/use_threat_intelligence_details.ts | 2 +- .../shared/hooks/use_event_details.test.tsx | 3 +- .../shared/hooks/use_event_details.ts | 8 +-- .../components/network_details.tsx | 4 +- .../public/kubernetes/pages/index.tsx | 9 +-- .../utils/data_view_spec_to_index_pattern.ts | 15 +++++ .../components/event_counts/index.test.tsx | 4 +- .../components/event_counts/index.tsx | 16 ++--- .../components/events_by_dataset/index.tsx | 11 ++-- .../public/overview/pages/overview.tsx | 7 +-- .../components/alerts_sourcerer.test.tsx | 1 + .../public/sourcerer/components/index.tsx | 4 +- .../components/sourcerer_integration.test.tsx | 1 + .../components/timeline_sourcerer.test.tsx | 1 + .../use_get_sourcerer_data_view.test.ts | 4 +- .../use_get_sourcerer_data_view.tsx | 2 +- .../sourcerer/containers/hooks.test.tsx | 7 +-- .../public/sourcerer/containers/index.tsx | 4 +- .../public/sourcerer/containers/mocks.ts | 13 ---- .../public/sourcerer/store/model.ts | 8 +-- .../actions/open_timeline_button.test.tsx | 6 +- .../components/modal/header/index.test.tsx | 3 + .../components/modal/header/index.tsx | 14 ++++- .../components/timeline/kpi/kpi_container.tsx | 6 +- .../timeline/query_bar/eql/index.tsx | 42 ++++++------- .../components/timeline/query_bar/index.tsx | 16 ++++- .../timeline/search_or_filter/index.tsx | 27 ++++----- .../components/timeline/tabs/eql/index.tsx | 2 +- .../components/timeline/tabs/pinned/index.tsx | 2 +- .../components/timeline/tabs/query/index.tsx | 7 +-- .../timelines/pages/timelines_page.test.tsx | 2 + .../query_bar/hooks/use_filter_in_out.ts | 4 +- .../threat_intelligence/public/types.ts | 2 +- 115 files changed, 436 insertions(+), 317 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/kubernetes/pages/utils/data_view_spec_to_index_pattern.ts diff --git a/x-pack/plugins/security_solution/public/app/components/top_values_popover/top_values_popover.tsx b/x-pack/plugins/security_solution/public/app/components/top_values_popover/top_values_popover.tsx index f03be50f39660..3f7842c4a2e92 100644 --- a/x-pack/plugins/security_solution/public/app/components/top_values_popover/top_values_popover.tsx +++ b/x-pack/plugins/security_solution/public/app/components/top_values_popover/top_values_popover.tsx @@ -16,7 +16,7 @@ import { useKibana } from '../../../common/lib/kibana'; export const TopValuesPopover = React.memo(() => { const { pathname } = useLocation(); - const { browserFields, indexPattern } = useSourcererDataView(getScopeFromPath(pathname)); + const { browserFields, sourcererDataView } = useSourcererDataView(getScopeFromPath(pathname)); const { services: { topValuesPopover }, } = useKibana(); @@ -44,7 +44,7 @@ export const TopValuesPopover = React.memo(() => { showLegend scopeId={data.scopeId} toggleTopN={onClose} - indexPattern={indexPattern} + dataViewSpec={sourcererDataView} browserFields={browserFields} /> diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx b/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx index e251370c7e4d3..b86f65e020a11 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx @@ -180,9 +180,8 @@ const StatefulEventsViewerComponent: React.FC) => { const isEditMode = node != null; - const { indexPattern } = useSourcererDataView(SourcererScopeName.default); + const { sourcererDataView } = useSourcererDataView(SourcererScopeName.default); const { unifiedSearch: { ui: { FiltersBuilderLazy }, @@ -400,7 +400,7 @@ const InsightEditorComponent = ({ ); }, [labelController.field.value, providers, dataView]); const filtersStub = useMemo(() => { - const index = indexPattern && indexPattern.getName ? indexPattern.getName() : '*'; + const index = sourcererDataView.name ?? '*'; return [ { $state: { @@ -414,7 +414,7 @@ const InsightEditorComponent = ({ }, }, ]; - }, [indexPattern]); + }, [sourcererDataView]); const isPlatinum = useLicense().isAtLeast('platinum'); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_query.ts b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_query.ts index 43323a6b62f7a..a88485237e21c 100644 --- a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_query.ts +++ b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/insight/use_insight_query.ts @@ -41,7 +41,7 @@ export const useInsightQuery = ({ }: UseInsightQuery): UseInsightQueryResult => { const { uiSettings } = useKibana().services; const esQueryConfig = useMemo(() => getEsQueryConfig(uiSettings), [uiSettings]); - const { browserFields, selectedPatterns, indexPattern, dataViewId } = useSourcererDataView( + const { browserFields, selectedPatterns, sourcererDataView, dataViewId } = useSourcererDataView( SourcererScopeName.timeline ); const [hasError, setHasError] = useState(false); @@ -51,7 +51,7 @@ export const useInsightQuery = ({ const parsedCombinedQueries = combineQueries({ config: esQueryConfig, dataProviders, - indexPattern, + indexPattern: sourcererDataView, browserFields, filters, kqlQuery: { @@ -66,7 +66,7 @@ export const useInsightQuery = ({ setHasError(true); return null; } - }, [browserFields, dataProviders, esQueryConfig, hasError, indexPattern, filters]); + }, [browserFields, dataProviders, esQueryConfig, hasError, sourcererDataView, filters]); const [dataLoadingState, { events, totalCount }] = useTimelineEvents({ dataViewId, 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 6c45faf63e566..2359aed5d6949 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 @@ -10,7 +10,7 @@ import { mount } from 'enzyme'; import React from 'react'; import { waitFor } from '@testing-library/react'; import { mockBrowserFields } from '../../containers/source/mock'; -import { mockGlobalState, TestProviders, mockIndexPattern, createMockStore } from '../../mock'; +import { mockGlobalState, TestProviders, createMockStore, mockDataViewSpec } from '../../mock'; import type { State } from '../../store'; import type { Props } from './top_n'; @@ -145,7 +145,7 @@ const store = createMockStore(state); const testProps = { browserFields: mockBrowserFields, field, - indexPattern: mockIndexPattern, + indexPattern: mockDataViewSpec, scopeId: TableId.hostsPageEvents, toggleTopN: jest.fn(), onFilterAdded: jest.fn(), 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 cdad88b247f2d..11ec06908afe7 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 @@ -9,8 +9,8 @@ import React, { useMemo } from 'react'; import type { ConnectedProps } from 'react-redux'; import { connect } from 'react-redux'; -import type { DataViewBase, Filter, Query } from '@kbn/es-query'; -import { getEsQueryConfig } from '@kbn/data-plugin/common'; +import type { Filter, Query } from '@kbn/es-query'; +import { type DataViewSpec, getEsQueryConfig } from '@kbn/data-plugin/common'; import { isActiveTimeline } from '../../../helpers'; import { InputsModelId } from '../../store/inputs/constants'; import { useGlobalTime } from '../../containers/use_global_time'; @@ -77,7 +77,7 @@ const connector = connect(makeMapStateToProps); export interface OwnProps { browserFields: BrowserFields; field: string; - indexPattern: DataViewBase; + dataViewSpec?: DataViewSpec; scopeId?: string; toggleTopN: () => void; onFilterAdded?: () => void; @@ -97,7 +97,7 @@ const StatefulTopNComponent: React.FC = ({ browserFields, dataProviders, field, - indexPattern, + dataViewSpec: indexPattern, globalFilters = EMPTY_FILTERS, globalQuery = EMPTY_QUERY, kqlMode, diff --git a/x-pack/plugins/security_solution/public/common/components/top_n/top_n.test.tsx b/x-pack/plugins/security_solution/public/common/components/top_n/top_n.test.tsx index 79ab897e34bfc..73086e2d584be 100644 --- a/x-pack/plugins/security_solution/public/common/components/top_n/top_n.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/top_n/top_n.test.tsx @@ -10,7 +10,7 @@ import { mount } from 'enzyme'; import React from 'react'; import { waitFor } from '@testing-library/react'; -import { TestProviders, mockIndexPattern } from '../../mock'; +import { TestProviders, mockDataViewSpec } from '../../mock'; import { allEvents, defaultOptions } from './helpers'; import type { Props as TopNProps } from './top_n'; @@ -107,7 +107,7 @@ describe('TopN', () => { field, filters: [], from: '2020-04-14T00:31:47.695Z', - indexPattern: mockIndexPattern, + indexPattern: mockDataViewSpec, options: defaultOptions, query, setAbsoluteRangeDatePickerTarget: InputsModelId.global, 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 48386a71a07fc..5c3cecfe3fce3 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 @@ -9,7 +9,8 @@ import { EuiButtonIcon, EuiSuperSelect } from '@elastic/eui'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import styled from 'styled-components'; -import type { DataViewBase, Filter, Query } from '@kbn/es-query'; +import type { Filter, Query } from '@kbn/es-query'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import type { GlobalTimeArgs } from '../../containers/use_global_time'; import { EventsByDataset } from '../../../overview/components/events_by_dataset'; import { SignalsByCategory } from '../../../overview/components/signals_by_category'; @@ -48,7 +49,7 @@ export interface Props extends Pick = ({ filters={applicableFilters} from={from} headerChildren={headerChildren} - indexPattern={indexPattern} + dataViewSpec={indexPattern} onlyField={field} paddingSize={paddingSize} query={query} diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_by_status_donut.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_by_status_donut.test.ts index 98f64ab00152a..7240f1de35ac6 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_by_status_donut.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_by_status_donut.test.ts @@ -20,6 +20,7 @@ jest.mock('../../../../../../sourcerer/containers', () => ({ dataViewId: 'security-solution-my-test', indicesExist: true, selectedPatterns: ['signal-index'], + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_histogram.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_histogram.test.ts index dd4b7050632e0..d712f69a295a1 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_histogram.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_histogram.test.ts @@ -20,6 +20,7 @@ jest.mock('../../../../../../sourcerer/containers', () => ({ dataViewId: 'security-solution-my-test', indicesExist: true, selectedPatterns: ['signal-index'], + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_table.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_table.test.ts index 399bf374bb707..cec804e090f10 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_table.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/alerts_table.test.ts @@ -32,6 +32,7 @@ jest.mock('../../../../../../sourcerer/containers', () => ({ dataViewId: 'security-solution-my-test', indicesExist: true, selectedPatterns: ['signal-index'], + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/rule_preview.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/rule_preview.test.ts index 6c704ae9e532f..73f871def8ee9 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/rule_preview.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/alerts/rule_preview.test.ts @@ -22,6 +22,7 @@ jest.mock('../../../../../../sourcerer/containers', () => ({ dataViewId: 'security-solution-my-test', indicesExist: true, selectedPatterns: ['signal-index'], + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/authentication.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/authentication.test.ts index 1abba440af95c..6d2b510da4897 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/authentication.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/authentication.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/event.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/event.test.ts index a7855ff7367bd..b29b10f8b9b4e 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/event.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/event.test.ts @@ -22,6 +22,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/external_alert.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/external_alert.test.ts index 5c4998a03524c..8fd7c0a57cc6e 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/external_alert.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/common/external_alert.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_area.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_area.test.ts index 9c7ff9e3acf7b..6ab9c4b599057 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_area.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_area.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_metric.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_metric.test.ts index d2714b44c2930..0a146fae457ef 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_metric.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_host_metric.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_area.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_area.test.ts index 3a591a1eb2b1a..003176c784c17 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_area.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_area.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_bar.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_bar.test.ts index fa3f49f7b1054..5121aab8bf8bf 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_bar.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_bar.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_destination_metric.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_destination_metric.test.ts index a2ae91e0c0422..eff175a0b5466 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_destination_metric.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_destination_metric.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_source_metric.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_source_metric.test.ts index e94efb88b58ad..cd9f68d632478 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_source_metric.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/hosts/kpi_unique_ips_source_metric.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/dns_top_domains.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/dns_top_domains.test.ts index e398b33f0570b..bb0d0cb5c9012 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/dns_top_domains.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/dns_top_domains.test.ts @@ -19,6 +19,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_dns_queries.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_dns_queries.test.ts index 9e766f03163d8..6c0cb3d3d8198 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_dns_queries.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_dns_queries.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_network_events.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_network_events.test.ts index ef921e3601373..6e2a66567f1e0 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_network_events.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_network_events.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_tls_handshakes.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_tls_handshakes.test.ts index d6c4eb3fadc25..f0b87c0ee221a 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_tls_handshakes.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_tls_handshakes.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_flow_ids.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_flow_ids.test.ts index ba0cd4f60fe99..414bc1263e93e 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_flow_ids.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_flow_ids.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_area.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_area.test.ts index 7a19fa5e024fc..9ac8d9733d157 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_area.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_area.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_bar.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_bar.test.ts index 9b4cd751ee54b..25fc271e7ef62 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_bar.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_bar.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_destination_metric.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_destination_metric.test.ts index 5c3479c53c410..a7fd2208bec47 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_destination_metric.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_destination_metric.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_source_metric.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_source_metric.test.ts index a076dc40a46e4..6208d5c97bdc9 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_source_metric.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/network/kpi_unique_private_ips_source_metric.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_area.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_area.test.ts index 50b72daa8d532..a34e98b70e607 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_area.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_area.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_metric.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_metric.test.ts index fae4b63083906..affbdd4a77905 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_metric.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_total_users_metric.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentication_metric_failure.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentication_metric_failure.test.ts index 6c9de837708e6..4c93280dd3b9e 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentication_metric_failure.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentication_metric_failure.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_area.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_area.test.ts index 3f00f93c24875..599ceb9745f53 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_area.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_area.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_bar.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_bar.test.ts index 6a6cd9cc7ad3b..2231459b347ed 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_bar.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_bar.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_metric_success.test.ts b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_metric_success.test.ts index 367a883e93dec..3ab3de0592d77 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_metric_success.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/lens_attributes/users/kpi_user_authentications_metric_success.test.ts @@ -17,6 +17,7 @@ jest.mock('../../../../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_lens_attributes.test.tsx b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_lens_attributes.test.tsx index 22fa8c774eebe..8ed7d40519ace 100644 --- a/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_lens_attributes.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/visualization_actions/use_lens_attributes.test.tsx @@ -35,6 +35,7 @@ describe('useLensAttributes', () => { dataViewId: 'security-solution-default', indicesExist: true, selectedPatterns: ['auditbeat-*'], + sourcererDataView: {}, }); (useRouteSpy as jest.Mock).mockReturnValue([ { @@ -237,6 +238,7 @@ describe('useLensAttributes', () => { dataViewId: 'security-solution-default', indicesExist: false, selectedPatterns: ['auditbeat-*'], + sourcererDataView: {}, }); const { result } = renderHook( () => @@ -255,6 +257,7 @@ describe('useLensAttributes', () => { dataViewId: 'security-solution-default', indicesExist: false, selectedPatterns: ['auditbeat-*'], + sourcererDataView: {}, }); const { result } = renderHook( () => @@ -273,6 +276,7 @@ describe('useLensAttributes', () => { dataViewId: 'security-solution-default', indicesExist: false, selectedPatterns: ['auditbeat-*'], + sourcererDataView: {}, }); const { result } = renderHook( () => @@ -294,6 +298,7 @@ describe('useLensAttributes', () => { dataViewId: 'security-solution-default', indicesExist: false, selectedPatterns: ['auditbeat-*'], + sourcererDataView: {}, }); const { result } = renderHook( () => diff --git a/x-pack/plugins/security_solution/public/common/lib/kuery/index.test.ts b/x-pack/plugins/security_solution/public/common/lib/kuery/index.test.ts index 095f49d2f1e0e..98c59d415d447 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kuery/index.test.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kuery/index.test.ts @@ -8,7 +8,7 @@ import expect from '@kbn/expect'; import type { DataProvider } from '../../../../common/types/timeline'; import { convertToBuildEsQuery, buildGlobalQuery } from '.'; -import { mockIndexPattern } from '../../mock'; +import { mockDataViewSpec } from '../../mock'; describe('convertToBuildEsQuery', () => { /** @@ -61,7 +61,7 @@ describe('convertToBuildEsQuery', () => { const [converted, _] = convertToBuildEsQuery({ config, queries: queryWithNestedFields, - indexPattern: mockIndexPattern, + dataViewSpec: mockDataViewSpec, filters, }); @@ -176,7 +176,7 @@ describe('convertToBuildEsQuery', () => { const [converted, _] = convertToBuildEsQuery({ config: configWithOverride, queries: queryWithNestedFields, - indexPattern: mockIndexPattern, + dataViewSpec: mockDataViewSpec, filters, }); diff --git a/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts b/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts index b3f98a8483f30..c3ae79dd80e95 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts @@ -14,6 +14,7 @@ import { } from '@kbn/es-query'; import { get, isEmpty } from 'lodash/fp'; import memoizeOne from 'memoize-one'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import { prepareKQLParam } from '../../../../common/utils/kql'; import type { BrowserFields } from '../../../../common/search_strategy'; import type { DataProvider, DataProvidersAnd } from '../../../../common/types'; @@ -29,7 +30,7 @@ export type PrimitiveOrArrayOfPrimitives = export interface CombineQueries { config: EsQueryConfig; dataProviders: DataProvider[]; - indexPattern: DataViewBase; + indexPattern?: DataViewSpec; browserFields: BrowserFields; filters: Filter[]; kqlQuery: Query; @@ -199,14 +200,18 @@ export const isDataProviderEmpty = (dataProviders: DataProvider[]) => { return isEmpty(dataProviders) || isEmpty(dataProviders.filter((d) => d.enabled === true)); }; +export const dataViewSpecToViewBase = (dataViewSpec?: DataViewSpec): DataViewBase => { + return { title: dataViewSpec?.title || '', fields: Object.values(dataViewSpec?.fields || {}) }; +}; + export const convertToBuildEsQuery = ({ config, - indexPattern, + dataViewSpec, queries, filters, }: { config: EsQueryConfig; - indexPattern: DataViewBase | undefined; + dataViewSpec: DataViewSpec | undefined; queries: Query[]; filters: Filter[]; }): [string, undefined] | [undefined, Error] => { @@ -214,7 +219,7 @@ export const convertToBuildEsQuery = ({ return [ JSON.stringify( buildEsQuery( - indexPattern, + dataViewSpecToViewBase(dataViewSpec), queries, filters.filter((f) => f.meta.disabled === false), { @@ -253,7 +258,7 @@ export const combineQueries = ({ const [filterQuery, kqlError] = convertToBuildEsQuery({ config, queries: [kuery], - indexPattern, + dataViewSpec: indexPattern, filters, }); @@ -281,7 +286,7 @@ export const combineQueries = ({ const [filterQuery, kqlError] = convertToBuildEsQuery({ config, queries: [kuery], - indexPattern, + dataViewSpec: indexPattern, filters, }); diff --git a/x-pack/plugins/security_solution/public/common/mock/index_pattern.ts b/x-pack/plugins/security_solution/public/common/mock/index_pattern.ts index cc04177139a89..ec042d0b01e2d 100644 --- a/x-pack/plugins/security_solution/public/common/mock/index_pattern.ts +++ b/x-pack/plugins/security_solution/public/common/mock/index_pattern.ts @@ -110,3 +110,8 @@ export const mockIndexPattern: SecuritySolutionDataViewBase = { }; export const mockIndexNames = ['filebeat-*', 'auditbeat-*', 'packetbeat-*']; + +export const mockDataViewSpec = { + fields: Object.fromEntries(mockIndexPattern.fields.map((f) => [f.name, f])), + title: 'filebeat-*,auditbeat-*,packetbeat-*', +}; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.test.tsx index 3a221836e3a35..4ed02135143ff 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.test.tsx @@ -47,11 +47,11 @@ const coreStart = coreMock.createStart(); const mockUseSourcererDataView = useSourcererDataView as jest.Mock; mockUseSourcererDataView.mockReturnValue({ - indexPattern: { fields: [] }, missingPatterns: {}, selectedPatterns: {}, scopeSelectedPatterns: {}, loading: false, + sourcererDataView: {}, }); const mockUseRuleExecutionEvents = useExecutionResults as jest.Mock; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx index 048780b259d22..4546e55522ce5 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx @@ -37,6 +37,7 @@ import type { AnalyticsServiceStart } from '@kbn/core-analytics-browser'; import type { I18nStart } from '@kbn/core-i18n-browser'; import type { ThemeServiceStart } from '@kbn/core-theme-browser'; +import { dataViewSpecToViewBase } from '../../../../../common/lib/kuery'; import { InputsModelId } from '../../../../../common/store/inputs/constants'; import { @@ -159,7 +160,7 @@ const ExecutionLogTableComponent: React.FC = ({ } = useRuleDetailsContext(); // Index for `add filter` action and toasts for errors - const { indexPattern } = useSourcererDataView(SourcererScopeName.detections); + const { sourcererDataView } = useSourcererDataView(SourcererScopeName.detections); const { addError, addSuccess, remove } = useAppToasts(); // QueryString, Filters, and TimeRange state @@ -232,9 +233,10 @@ const ExecutionLogTableComponent: React.FC = ({ const maxEvents = events?.total ?? 0; // Cache UUID field from data view as it can be expensive to iterate all data view fields - const uuidDataViewField = useMemo(() => { - return indexPattern.fields.find((f) => f.name === EXECUTION_UUID_FIELD_NAME); - }, [indexPattern]); + const uuidDataViewField = useMemo( + () => sourcererDataView.fields?.[EXECUTION_UUID_FIELD_NAME], + [sourcererDataView] + ); // Callbacks const onTableChangeCallback = useCallback( @@ -299,12 +301,18 @@ const ExecutionLogTableComponent: React.FC = ({ const onFilterByExecutionIdCallback = useCallback( (executionId: string, executionStart: string) => { - if (uuidDataViewField != null) { + const dataViewAsViewBase = dataViewSpecToViewBase(sourcererDataView); + + if ( + uuidDataViewField != null && + typeof uuidDataViewField !== 'undefined' && + dataViewAsViewBase + ) { // Update cached global query state with current state as a rollback point cachedGlobalQueryState.current = { filters, query, timerange }; // Create filter & daterange constraints const filter = buildFilter( - indexPattern, + dataViewAsViewBase, uuidDataViewField, FILTERS.PHRASE, false, @@ -350,18 +358,18 @@ const ExecutionLogTableComponent: React.FC = ({ } }, [ - addError, - addSuccess, - dispatch, - filterManager, + uuidDataViewField, filters, - indexPattern, query, - resetGlobalQueryState, - selectAlertsTab, timerange, - uuidDataViewField, + sourcererDataView, + dispatch, + filterManager, + selectAlertsTab, + addSuccess, + resetGlobalQueryState, startServices, + addError, ] ); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx index 91ba4276a79b2..851d219ad43d3 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/index.tsx @@ -759,7 +759,7 @@ const RuleDetailsPageComponent: React.FC = ({ hasIndexWrite={hasIndexWrite ?? false} loading={loading} renderChildComponent={renderGroupedAlertTable} - runtimeMappings={sourcererDataView?.runtimeFieldMap as RunTimeMappings} + runtimeMappings={sourcererDataView.runtimeFieldMap as RunTimeMappings} signalIndexName={signalIndexName} tableId={TableId.alertsOnRuleDetailsPage} to={to} diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/index.test.tsx index 668f323d147cb..38d68f2af0ad6 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/chart_panels/index.test.tsx @@ -156,6 +156,7 @@ describe('ChartPanels', () => { indicesExist: true, indexPattern: {}, browserFields: mockBrowserFields, + sourcererDataView: {}, }); (useAlertsLocalStorage as jest.Mock).mockReturnValue({ diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.test.tsx index 17c7ce8195c0c..cf57c9d59b080 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.test.tsx @@ -159,6 +159,7 @@ describe('GroupedAlertsTable', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ ...sourcererDataView, selectedPatterns: ['myFakebeat-*'], + sourcererDataView: {}, }); mockUseQueryAlerts.mockImplementation((i) => { if (i.skip) { diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.tsx index 8b02530fec07a..a1cbdc8004727 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.tsx @@ -67,7 +67,9 @@ const useStorage = (storage: Storage, tableId: string) => const GroupedAlertsTableComponent: React.FC = (props) => { const dispatch = useDispatch(); - const { indexPattern, selectedPatterns } = useSourcererDataView(SourcererScopeName.detections); + const { sourcererDataView, selectedPatterns } = useSourcererDataView( + SourcererScopeName.detections + ); const { services: { storage, telemetry }, @@ -102,6 +104,8 @@ const GroupedAlertsTableComponent: React.FC = (props) [dispatch, props.tableId] ); + const fields = useMemo(() => Object.values(sourcererDataView.fields || {}), [sourcererDataView]); + const { getGrouping, selectedGroups, setSelectedGroups } = useGrouping({ componentProps: { groupPanelRenderer: renderGroupPanel, @@ -110,7 +114,7 @@ const GroupedAlertsTableComponent: React.FC = (props) unit: defaultUnit, }, defaultGroupingOptions: getDefaultGroupingOptions(props.tableId), - fields: indexPattern.fields, + fields, groupingId: props.tableId, maxGroupingLevels: MAX_GROUPING_LEVELS, onGroupChange, diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_sub_grouping.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_sub_grouping.tsx index 4b8c912c61a65..c941f5ecf46ed 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_sub_grouping.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_sub_grouping.tsx @@ -91,15 +91,15 @@ export const GroupedSubLevelComponent: React.FC = ({ const { services: { uiSettings }, } = useKibana(); - const { browserFields, indexPattern } = useSourcererDataView(SourcererScopeName.detections); + const { browserFields, sourcererDataView } = useSourcererDataView(SourcererScopeName.detections); const getGlobalQuery = useCallback( (customFilters: Filter[]) => { - if (browserFields != null && indexPattern != null) { + if (browserFields != null && sourcererDataView) { return combineQueries({ config: getEsQueryConfig(uiSettings), dataProviders: [], - indexPattern, + indexPattern: sourcererDataView, browserFields, filters: [ ...(defaultFilters ?? []), @@ -120,10 +120,10 @@ export const GroupedSubLevelComponent: React.FC = ({ from, globalFilters, globalQuery, - indexPattern, parentGroupingFilter, to, uiSettings, + sourcererDataView, ] ); diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/index.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/index.tsx index 3b637340e01e4..0ca0e99bb7fd0 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/index.tsx @@ -129,11 +129,7 @@ export const AlertsTableComponent: FC = ({ enableIpDetailsFlyout: true, onRuleChange, }); - const { - browserFields, - indexPattern: indexPatterns, - sourcererDataView, - } = useSourcererDataView(sourcererScope); + const { browserFields, sourcererDataView } = useSourcererDataView(sourcererScope); const license = useLicense(); const getGlobalFiltersQuerySelector = useMemo( @@ -167,11 +163,11 @@ export const AlertsTableComponent: FC = ({ } = useShallowEqualSelector((state: State) => eventsViewerSelector(state, tableId)); const combinedQuery = useMemo(() => { - if (browserFields != null && indexPatterns != null) { + if (browserFields != null && sourcererDataView) { return combineQueries({ config: getEsQueryConfig(uiSettings), dataProviders: [], - indexPattern: indexPatterns, + indexPattern: sourcererDataView, browserFields, filters: [...allFilters], kqlQuery: globalQuery, @@ -179,7 +175,7 @@ export const AlertsTableComponent: FC = ({ }); } return null; - }, [browserFields, globalQuery, indexPatterns, uiSettings, allFilters]); + }, [browserFields, globalQuery, sourcererDataView, uiSettings, allFilters]); useInvalidFilterQuery({ id: tableId, @@ -297,13 +293,13 @@ export const AlertsTableComponent: FC = ({ onUpdate: onAlertTableUpdate, cellContext, onLoaded: onLoad, - runtimeMappings: sourcererDataView?.runtimeFieldMap as RunTimeMappings, toolbarVisibility, // if records are too less, we don't want table to be of fixed height. // it should shrink to the content height. // Height setting enables/disables virtualization depending on fixed/undefined height values respectively. height: count >= 20 ? `${DEFAULT_DATA_GRID_HEIGHT}px` : undefined, initialPageSize: 50, + runtimeMappings: sourcererDataView.runtimeFieldMap as RunTimeMappings, }), [ triggersActionsUi.alertsTableConfigurationRegistry, @@ -317,9 +313,9 @@ export const AlertsTableComponent: FC = ({ onAlertTableUpdate, cellContext, onLoad, - sourcererDataView?.runtimeFieldMap, toolbarVisibility, count, + sourcererDataView.runtimeFieldMap, ] ); diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_bulk_to_timeline.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_bulk_to_timeline.tsx index 7399926f7e9a2..0086f40ffa44b 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_bulk_to_timeline.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_bulk_to_timeline.tsx @@ -67,7 +67,6 @@ export const useAddBulkToTimelineAction = ({ const { browserFields, dataViewId, - indexPattern, sourcererDataView, // important to get selectedPatterns from useSourcererDataView // in order to include the exclude filters in the search that are not stored in the timeline @@ -96,13 +95,13 @@ export const useAddBulkToTimelineAction = ({ return combineQueries({ config: esQueryConfig, dataProviders: [], - indexPattern, + indexPattern: sourcererDataView, filters: combinedFilters, kqlQuery: { query: '', language: 'kuery' }, browserFields, kqlMode: 'filter', }); - }, [esQueryConfig, indexPattern, combinedFilters, browserFields]); + }, [esQueryConfig, sourcererDataView, combinedFilters, browserFields]); const filterQuery = useMemo(() => { if (!combinedQuery) return ''; @@ -120,7 +119,7 @@ export const useAddBulkToTimelineAction = ({ sort: timelineQuerySortField, indexNames: selectedPatterns, filterQuery, - runtimeMappings: sourcererDataView?.runtimeFieldMap as RunTimeMappings, + runtimeMappings: sourcererDataView.runtimeFieldMap as RunTimeMappings, limit: Math.min(BULK_ADD_TO_TIMELINE_LIMIT, totalCount), timerangeKind: 'absolute', }); diff --git a/x-pack/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.test.tsx b/x-pack/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.test.tsx index 82d6a4726dbc2..d9683d9de1b04 100644 --- a/x-pack/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.test.tsx @@ -72,9 +72,9 @@ describe('DetectionEngineFilters', () => { }, timeRange: { from: 'now-15m', to: 'now' }, onInit: jest.fn(), - indexPattern: { + dataViewSpec: { title: 'mock-title', - fields: [], + fields: {}, }, }; diff --git a/x-pack/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.tsx b/x-pack/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.tsx index 126c86055aa4c..6c60aec51382e 100644 --- a/x-pack/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/detection_engine_filters/detection_engine_filters.tsx @@ -13,21 +13,24 @@ import { ControlGroupRenderer } from '@kbn/controls-plugin/public'; import type { AlertFilterControlsProps } from '@kbn/alerts-ui-shared/src/alert_filter_controls'; import { AlertFilterControls } from '@kbn/alerts-ui-shared/src/alert_filter_controls'; import { useHistory } from 'react-router-dom'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import { useKibana } from '../../../common/lib/kibana'; import { DEFAULT_DETECTION_PAGE_FILTERS } from '../../../../common/constants'; import { URL_PARAM_KEY } from '../../../common/hooks/use_url_state'; import { useSpaceId } from '../../../common/hooks/use_space_id'; -import type { SecuritySolutionDataViewBase } from '../../../common/types'; import { SECURITY_ALERT_DATA_VIEW } from '../../constants'; export type DetectionEngineFiltersProps = Pick< AlertFilterControlsProps, 'filters' | 'onFiltersChange' | 'query' | 'timeRange' | 'onInit' > & { - indexPattern?: SecuritySolutionDataViewBase; + dataViewSpec?: DataViewSpec; }; -export const DetectionEngineFilters = ({ indexPattern, ...props }: DetectionEngineFiltersProps) => { +export const DetectionEngineFilters = ({ + dataViewSpec: indexPattern, + ...props +}: DetectionEngineFiltersProps) => { const { http, notifications, dataViews } = useKibana().services; const spaceId = useSpaceId(); const history = useHistory(); diff --git a/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/render_cell_value.test.tsx b/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/render_cell_value.test.tsx index 926109d90558d..6057410e1615e 100644 --- a/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/render_cell_value.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/render_cell_value.test.tsx @@ -27,6 +27,7 @@ jest.mock('../../../sourcerer/containers', () => ({ defaultIndex: 'defaultIndex', loading: false, indicesExist: true, + sourcererDataView: {}, }), })); jest.mock('../../../common/components/guided_onboarding_tour/tour_step'); diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts index 7d44864681f0e..ce653c82d7831 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_from_timeline.test.ts @@ -112,6 +112,7 @@ describe('useRuleFromTimeline', () => { ...mockSourcererScope, dataViewId: 'custom-data-view-id', selectedPatterns: ['awesome-*'], + sourcererDataView: {}, }); }); diff --git a/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_persistent_controls.test.tsx b/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_persistent_controls.test.tsx index 7334be4e2a466..d2ca9bd93198a 100644 --- a/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_persistent_controls.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_persistent_controls.test.tsx @@ -74,6 +74,7 @@ describe('usePersistentControls', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ ...sourcererDataView, selectedPatterns: ['myFakebeat-*'], + sourcererDataView: {}, }); }); diff --git a/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_persistent_controls.tsx b/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_persistent_controls.tsx index 1cce1c8a34594..dbd47281c5f2a 100644 --- a/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_persistent_controls.tsx +++ b/x-pack/plugins/security_solution/public/detections/hooks/trigger_actions_alert_table/use_persistent_controls.tsx @@ -35,7 +35,7 @@ export const getPersistentControlsHook = (tableId: TableId) => { services: { telemetry }, } = useKibana(); - const { indexPattern } = useSourcererDataView(SourcererScopeName.detections); + const { sourcererDataView } = useSourcererDataView(SourcererScopeName.detections); const groupId = useMemo(() => groupIdSelector(), []); const { options } = useDeepEqualSelector((state) => groupId(state, tableId)) ?? { options: [], @@ -60,10 +60,14 @@ export const getPersistentControlsHook = (tableId: TableId) => { [dispatch, trackGroupChange] ); + const fields = useMemo(() => { + return Object.values(sourcererDataView.fields || {}); + }, [sourcererDataView.fields]); + const groupSelector = useGetGroupSelectorStateless({ groupingId: tableId, onGroupChange, - fields: indexPattern.fields, + fields, defaultGroupingOptions: options, maxGroupingLevels: 3, }); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx index 18efc5fcbad7f..4f8b8a391ea87 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.test.tsx @@ -212,8 +212,11 @@ describe('DetectionEnginePageComponent', () => { ]); (useSourcererDataView as jest.Mock).mockReturnValue({ indicesExist: true, - indexPattern: {}, browserFields: mockBrowserFields, + sourcererDataView: { + fields: {}, + title: '', + }, }); jest .spyOn(alertFilterControlsPackage, 'AlertFilterControls') diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx index 7784fbb5760c3..01aab96481d5a 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/detection_engine.tsx @@ -151,11 +151,9 @@ const DetectionEnginePageComponent: React.FC = () FilterGroupHandler | undefined >(); - const { - sourcererDataView, - loading: isLoadingIndexPattern, - indexPattern, - } = useSourcererDataView(SourcererScopeName.detections); + const { sourcererDataView, loading: isLoadingIndexPattern } = useSourcererDataView( + SourcererScopeName.detections + ); const { formatUrl } = useFormatUrl(SecurityPageName.rules); @@ -314,10 +312,10 @@ const DetectionEnginePageComponent: React.FC = () mode: 'absolute', }} onInit={setDetectionPageFilterHandler} - indexPattern={indexPattern} + dataViewSpec={sourcererDataView} /> ), - [from, indexPattern, onFilterControlsChange, query, to, topLevelFilters] + [from, sourcererDataView, onFilterControlsChange, query, to, topLevelFilters] ); const renderAlertTable = useCallback( @@ -419,7 +417,7 @@ const DetectionEnginePageComponent: React.FC = () alertsDefaultFilters={alertsDefaultFilters} isLoadingIndexPattern={isChartPanelLoading} query={query} - runtimeMappings={sourcererDataView?.runtimeFieldMap as RunTimeMappings} + runtimeMappings={sourcererDataView.runtimeFieldMap as RunTimeMappings} signalIndexName={signalIndexName} updateDateRangeCallback={updateDateRangeCallback} /> @@ -435,7 +433,7 @@ const DetectionEnginePageComponent: React.FC = () hasIndexWrite={hasIndexWrite ?? false} loading={isAlertTableLoading} renderChildComponent={renderAlertTable} - runtimeMappings={sourcererDataView?.runtimeFieldMap as RunTimeMappings} + runtimeMappings={sourcererDataView.runtimeFieldMap as RunTimeMappings} signalIndexName={signalIndexName} tableId={TableId.alertsOnAlertsPage} to={to} diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_preview_risk_scores.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_preview_risk_scores.ts index 837358aa96170..96a4453815125 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_preview_risk_scores.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/hooks/use_preview_risk_scores.ts @@ -9,38 +9,50 @@ import dateMath from '@kbn/datemath'; import type { RiskScoresPreviewRequest } from '../../../../common/api/entity_analytics/risk_engine/preview_route.gen'; import { useEntityAnalyticsRoutes } from '../api'; +export type UseRiskScorePreviewParams = Omit & { + data_view_id?: string; +}; + export const useRiskScorePreview = ({ data_view_id: dataViewId, range, filter, -}: RiskScoresPreviewRequest) => { +}: UseRiskScorePreviewParams) => { const { fetchRiskScorePreview } = useEntityAnalyticsRoutes(); - return useQuery(['POST', 'FETCH_PREVIEW_RISK_SCORE', range, filter], async ({ signal }) => { - const params: RiskScoresPreviewRequest = { data_view_id: dataViewId }; - if (range) { - const startTime = dateMath.parse(range.start)?.utc().toISOString(); - const endTime = dateMath - .parse(range.end, { - roundUp: true, - }) - ?.utc() - .toISOString(); - - if (startTime && endTime) { - params.range = { - start: startTime, - end: endTime, - }; + return useQuery( + ['POST', 'FETCH_PREVIEW_RISK_SCORE', range, filter], + async ({ signal }) => { + if (!dataViewId) { + return; + } + + const params: RiskScoresPreviewRequest = { data_view_id: dataViewId }; + if (range) { + const startTime = dateMath.parse(range.start)?.utc().toISOString(); + const endTime = dateMath + .parse(range.end, { + roundUp: true, + }) + ?.utc() + .toISOString(); + + if (startTime && endTime) { + params.range = { + start: startTime, + end: endTime, + }; + } } - } - if (filter) { - params.filter = filter; - } + if (filter) { + params.filter = filter; + } - const response = await fetchRiskScorePreview({ signal, params }); + const response = await fetchRiskScorePreview({ signal, params }); - return response; - }); + return response; + }, + { enabled: !!dataViewId } + ); }; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_preview_section.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_preview_section.tsx index b8f7870e23b56..9693bf13589ad 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_preview_section.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_preview_section.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useState, useCallback, useMemo } from 'react'; +import React, { useState, useCallback, useMemo, useEffect } from 'react'; import type { DataView } from '@kbn/data-views-plugin/public'; import { EuiAccordion, @@ -148,18 +148,21 @@ const RiskEnginePreview = () => { bool: { must: [], filter: [], should: [], must_not: [] }, }); + const [dataViewsArray, setDataViewsArray] = useState([]); + const { unifiedSearch: { ui: { SearchBar }, }, + dataViews, } = useKibana().services; const { addError } = useAppToasts(); - const { indexPattern } = useSourcererDataView(SourcererScopeName.detections); + const { sourcererDataView } = useSourcererDataView(SourcererScopeName.detections); const { data, isLoading, refetch, isError } = useRiskScorePreview({ - data_view_id: indexPattern.title, // TODO @nkhristinin verify this is correct + data_view_id: sourcererDataView.title, filter: filters, range: { start: dateRange.from, @@ -190,6 +193,10 @@ const RiskEnginePreview = () => { [addError, setDateRange, setFilters] ); + useEffect(() => { + dataViews.create(sourcererDataView).then((dataView) => setDataViewsArray([dataView])); + }, [dataViews, sourcererDataView]); + if (isError) { return ( { {i18n.PREVIEW_DESCRIPTION} - {indexPattern && ( - - )} + diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors_alerts/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors_alerts/index.tsx index c5c534a6bc370..e75c081ebc010 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors_alerts/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/top_risk_score_contributors_alerts/index.tsx @@ -122,7 +122,7 @@ export const TopRiskScoreContributorsAlerts: React.FC ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.test.ts index aa2a2cd77ef4b..0212363ea9a65 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.test.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_over_time_area.test.ts @@ -17,6 +17,7 @@ jest.mock('../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.test.ts b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.test.ts index af5564e576de8..2a00cb1691970 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.test.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/lens_attributes/risk_score_summary.test.ts @@ -18,6 +18,7 @@ jest.mock('../../sourcerer/containers', () => ({ selectedPatterns: ['auditbeat-mytest-*'], dataViewId: 'security-solution-my-test', indicesExist: true, + sourcererDataView: {}, }), })); diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.test.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.test.tsx index 8d89e580a97e8..53f006bac1d49 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.test.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.test.tsx @@ -11,6 +11,7 @@ import useResizeObserver from 'use-resize-observer/polyfilled'; import { createMockStore, + mockDataViewSpec, mockGlobalState, mockIndexPattern, TestProviders, @@ -109,7 +110,7 @@ describe('body', () => { setQuery={jest.fn()} hostDetailsPagePath={hostDetailsPagePath} indexNames={[]} - indexPattern={mockIndexPattern} + dataViewSpec={mockDataViewSpec} type={HostsType.details} hostDetailsFilter={mockHostDetailsPageFilters} filterQuery={filterQuery} @@ -128,34 +129,32 @@ describe('body', () => { startDate: '2020-07-07T08:20:18.966Z', type: 'details', indexPattern: { - fields: [ - { name: '@timestamp', searchable: true, type: 'date', aggregatable: true }, - { name: '@version', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.ephemeral_id', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.hostname', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.id', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test1', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test2', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test3', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test4', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test5', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test6', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test7', searchable: true, type: 'string', aggregatable: true }, - { name: 'agent.test8', searchable: true, type: 'string', aggregatable: true }, - { name: 'host.name', searchable: true, type: 'string', aggregatable: true }, - { + fields: { + '@timestamp': { searchable: true, type: 'date', aggregatable: true }, + '@version': { searchable: true, type: 'string', aggregatable: true }, + 'agent.ephemeral_id': { searchable: true, type: 'string', aggregatable: true }, + 'agent.hostname': { searchable: true, type: 'string', aggregatable: true }, + 'agent.id': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test1': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test2': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test3': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test4': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test5': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test6': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test7': { searchable: true, type: 'string', aggregatable: true }, + 'agent.test8': { searchable: true, type: 'string', aggregatable: true }, + 'host.name': { searchable: true, type: 'string', aggregatable: true }, + 'nestedField.firstAttributes': { aggregatable: false, - name: 'nestedField.firstAttributes', searchable: true, type: 'string', }, - { + 'nestedField.secondAttributes': { aggregatable: false, - name: 'nestedField.secondAttributes', searchable: true, type: 'string', }, - ], + }, title: 'filebeat-*,auditbeat-*,packetbeat-*', }, hostName: 'host-1', diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.tsx index 4a758dadc5cbd..2938a0a6288fb 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/details_tabs.tsx @@ -29,7 +29,7 @@ export const HostDetailsTabs = React.memo( detailName, filterQuery, indexNames, - indexPattern, + dataViewSpec: indexPattern, hostDetailsPagePath, hostDetailsFilter, }) => { diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/index.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/index.tsx index 6e5b69f408263..ed0e436c7e69a 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/index.tsx @@ -21,6 +21,7 @@ import { buildEsQuery } from '@kbn/es-query'; import { getEsQueryConfig } from '@kbn/data-plugin/common'; import { dataTableSelectors, tableDefaults, TableId } from '@kbn/securitysolution-data-table'; import type { NarrowDateRange } from '../../../../common/components/ml/types'; +import { dataViewSpecToViewBase } from '../../../../common/lib/kuery'; import { useCalculateEntityRiskScore } from '../../../../entity_analytics/api/hooks/use_calculate_entity_risk_score'; import { useAssetCriticalityData, @@ -128,8 +129,7 @@ const HostDetailsComponent: React.FC = ({ detailName, hostDeta [dispatch] ); - const { indexPattern, indicesExist, selectedPatterns, sourcererDataView } = - useSourcererDataView(); + const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView(); const [loading, { inspect, hostDetails: hostOverview, id, refetch }] = useHostDetails({ endDate: to, startDate: from, @@ -142,7 +142,7 @@ const HostDetailsComponent: React.FC = ({ detailName, hostDeta try { return [ buildEsQuery( - indexPattern, + dataViewSpecToViewBase(sourcererDataView), [query], [...hostDetailsPageFilters, ...globalFilters], getEsQueryConfig(uiSettings) @@ -151,7 +151,7 @@ const HostDetailsComponent: React.FC = ({ detailName, hostDeta } catch (e) { return [undefined, e]; } - }, [globalFilters, indexPattern, query, uiSettings, hostDetailsPageFilters]); + }, [sourcererDataView, query, hostDetailsPageFilters, globalFilters, uiSettings]); const stringifiedAdditionalFilters = JSON.stringify(rawFilteredQuery); useInvalidFilterQuery({ @@ -315,7 +315,7 @@ const HostDetailsComponent: React.FC = ({ detailName, hostDeta setQuery={setQuery} filterQuery={stringifiedAdditionalFilters} hostDetailsPagePath={hostDetailsPagePath} - indexPattern={indexPattern} + dataViewSpec={sourcererDataView} /> diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/types.ts b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/types.ts index dc5b3baccdc5c..fe23a0485dac8 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/details/types.ts +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/details/types.ts @@ -5,7 +5,8 @@ * 2.0. */ -import type { DataViewBase, Filter } from '@kbn/es-query'; +import type { Filter } from '@kbn/es-query'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import type { HostsTableType } from '../../store/model'; import type { HostsQueryProps } from '../types'; import type { NavTab } from '../../../../common/components/navigation/types'; @@ -40,6 +41,6 @@ export type HostDetailsTabsProps = HostBodyComponentDispatchProps & indexNames: string[]; hostDetailsFilter: Filter[]; filterQuery?: string; - indexPattern: DataViewBase; + dataViewSpec?: DataViewSpec; type: hostsModel.HostsType; }; diff --git a/x-pack/plugins/security_solution/public/explore/hosts/pages/hosts.tsx b/x-pack/plugins/security_solution/public/explore/hosts/pages/hosts.tsx index 17d5bdd3a82f2..59d57aeca5d14 100644 --- a/x-pack/plugins/security_solution/public/explore/hosts/pages/hosts.tsx +++ b/x-pack/plugins/security_solution/public/explore/hosts/pages/hosts.tsx @@ -104,27 +104,26 @@ const HostsComponent = () => { return globalFilters; }, [globalFilters, severitySelection, tabName]); - const { indicesExist, indexPattern, selectedPatterns, sourcererDataView } = - useSourcererDataView(); + const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView(); const [globalFilterQuery, kqlError] = useMemo( () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters: globalFilters, }), - [globalFilters, indexPattern, uiSettings, query] + [globalFilters, sourcererDataView, uiSettings, query] ); const [tabsFilterQuery] = useMemo( () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters: tabsFilters, }), - [indexPattern, query, tabsFilters, uiSettings] + [sourcererDataView, query, tabsFilters, uiSettings] ); useInvalidFilterQuery({ diff --git a/x-pack/plugins/security_solution/public/explore/network/pages/details/index.test.tsx b/x-pack/plugins/security_solution/public/explore/network/pages/details/index.test.tsx index 19b3f653b8f14..9807f4b336b96 100644 --- a/x-pack/plugins/security_solution/public/explore/network/pages/details/index.test.tsx +++ b/x-pack/plugins/security_solution/public/explore/network/pages/details/index.test.tsx @@ -127,6 +127,7 @@ describe('Network Details', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ indicesExist: false, indexPattern: {}, + sourcererDataView: {}, }); global.fetch = jest.fn().mockImplementationOnce(() => Promise.resolve({ @@ -147,6 +148,7 @@ describe('Network Details', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ indicesExist: true, indexPattern: {}, + sourcererDataView: {}, }); (useParams as jest.Mock).mockReturnValue({ detailName: ip, @@ -167,6 +169,7 @@ describe('Network Details', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ indicesExist: true, indexPattern: {}, + sourcererDataView: {}, }); (useParams as jest.Mock).mockReturnValue({ detailName: ip, @@ -191,6 +194,7 @@ describe('Network Details', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ indicesExist: false, indexPattern: {}, + sourcererDataView: {}, }); (useParams as jest.Mock).mockReturnValue({ detailName: ip, diff --git a/x-pack/plugins/security_solution/public/explore/network/pages/details/index.tsx b/x-pack/plugins/security_solution/public/explore/network/pages/details/index.tsx index adcf8a21ba47c..0eb3fb36638b8 100644 --- a/x-pack/plugins/security_solution/public/explore/network/pages/details/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/network/pages/details/index.tsx @@ -13,6 +13,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, EuiSpacer } from '@elasti import { getEsQueryConfig } from '@kbn/data-plugin/common'; import { buildEsQuery } from '@kbn/es-query'; +import { dataViewSpecToViewBase } from '../../../../common/lib/kuery'; import { AlertsByStatus } from '../../../../overview/components/detection_response/alerts_by_status'; import { useSignalIndex } from '../../../../detections/containers/detection_engine/alerts/use_signal_index'; import { InputsModelId } from '../../../../common/store/inputs/constants'; @@ -104,8 +105,7 @@ const NetworkDetailsComponent: React.FC = () => { dispatch(setNetworkDetailsTablesActivePageToZero()); }, [detailName, dispatch]); - const { indicesExist, indexPattern, selectedPatterns, sourcererDataView } = - useSourcererDataView(); + const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView(); const ip = decodeIpv6(detailName); const networkDetailsFilter = useMemo(() => getNetworkDetailsPageFilter(ip), [ip]); @@ -114,7 +114,7 @@ const NetworkDetailsComponent: React.FC = () => { try { return [ buildEsQuery( - indexPattern, + dataViewSpecToViewBase(sourcererDataView), [query], [...networkDetailsFilter, ...globalFilters], getEsQueryConfig(uiSettings) @@ -123,7 +123,7 @@ const NetworkDetailsComponent: React.FC = () => { } catch (e) { return [undefined, e]; } - }, [globalFilters, indexPattern, networkDetailsFilter, query, uiSettings]); + }, [globalFilters, networkDetailsFilter, query, sourcererDataView, uiSettings]); const additionalFilters = useMemo( () => (rawFilteredQuery ? [rawFilteredQuery] : []), @@ -166,6 +166,10 @@ const NetworkDetailsComponent: React.FC = () => { [detailName, flowTarget] ); + const indexPattern = useMemo(() => { + return dataViewSpecToViewBase(sourcererDataView); + }, [sourcererDataView]); + return (
{indicesExist ? ( diff --git a/x-pack/plugins/security_solution/public/explore/network/pages/navigation/network_routes.tsx b/x-pack/plugins/security_solution/public/explore/network/pages/navigation/network_routes.tsx index ca9d7d4a7b085..6e49c65454239 100644 --- a/x-pack/plugins/security_solution/public/explore/network/pages/navigation/network_routes.tsx +++ b/x-pack/plugins/security_solution/public/explore/network/pages/navigation/network_routes.tsx @@ -5,12 +5,13 @@ * 2.0. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { Routes, Route } from '@kbn/shared-ux-router'; import { EuiFlexItem, EuiSpacer } from '@elastic/eui'; import { TableId } from '@kbn/securitysolution-data-table'; +import { dataViewSpecToViewBase } from '../../../../common/lib/kuery'; import { FlowTargetSourceDest } from '../../../../../common/search_strategy/security_solution/network'; import { @@ -30,7 +31,9 @@ import { NetworkRouteType } from './types'; import { NETWORK_PATH } from '../../../../../common/constants'; export const NetworkRoutes = React.memo( - ({ type, to, filterQuery, isInitializing, from, indexPattern, indexNames, setQuery }) => { + ({ type, to, filterQuery, isInitializing, from, dataViewSpec, indexNames, setQuery }) => { + const index = useMemo(() => dataViewSpecToViewBase(dataViewSpec), [dataViewSpec]); + const networkAnomaliesFilterQuery = { bool: { should: [ @@ -61,7 +64,7 @@ export const NetworkRoutes = React.memo( const tabProps = { ...commonProps, - indexPattern, + indexPattern: index, }; const anomaliesProps = { diff --git a/x-pack/plugins/security_solution/public/explore/network/pages/navigation/types.ts b/x-pack/plugins/security_solution/public/explore/network/pages/navigation/types.ts index 2ed0756634707..339ad2fc71acc 100644 --- a/x-pack/plugins/security_solution/public/explore/network/pages/navigation/types.ts +++ b/x-pack/plugins/security_solution/public/explore/network/pages/navigation/types.ts @@ -5,9 +5,10 @@ * 2.0. */ -import type { DataViewBase } from '@kbn/es-query'; import type { Optional } from 'utility-types'; +import type { DataViewBase } from '@kbn/es-query'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import type { ESTermQuery } from '../../../../../common/typed_json'; import type { NavTab } from '../../../../common/components/navigation/types'; @@ -45,7 +46,7 @@ export type HttpQueryTabBodyProps = QueryTabBodyProps; export type NetworkRoutesProps = GlobalTimeArgs & { type: networkModel.NetworkType; filterQuery?: string | ESTermQuery; - indexPattern: DataViewBase; + dataViewSpec: DataViewSpec; indexNames: string[]; }; diff --git a/x-pack/plugins/security_solution/public/explore/network/pages/network.test.tsx b/x-pack/plugins/security_solution/public/explore/network/pages/network.test.tsx index e868a38266f80..4f44045cbf6f3 100644 --- a/x-pack/plugins/security_solution/public/explore/network/pages/network.test.tsx +++ b/x-pack/plugins/security_solution/public/explore/network/pages/network.test.tsx @@ -221,6 +221,7 @@ describe('Network page - rendering', () => { selectedPatterns: [], indicesExist: true, indexPattern: { fields: [], title: 'title' }, + sourcererDataView: {}, }); const myStore = createMockStore(); const wrapper = mount( diff --git a/x-pack/plugins/security_solution/public/explore/network/pages/network.tsx b/x-pack/plugins/security_solution/public/explore/network/pages/network.tsx index 00a88da0cfcf5..0732b31805609 100644 --- a/x-pack/plugins/security_solution/public/explore/network/pages/network.tsx +++ b/x-pack/plugins/security_solution/public/explore/network/pages/network.tsx @@ -88,8 +88,7 @@ const NetworkComponent = React.memo( return globalFilters; }, [tabName, globalFilters]); - const { indicesExist, indexPattern, selectedPatterns, sourcererDataView } = - useSourcererDataView(); + const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView(); const onSkipFocusBeforeEventsTable = useCallback(() => { containerElement.current @@ -117,14 +116,14 @@ const NetworkComponent = React.memo( const [filterQuery, kqlError] = convertToBuildEsQuery({ config: getEsQueryConfig(kibana.services.uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters: globalFilters, }); const [tabsFilterQuery] = convertToBuildEsQuery({ config: getEsQueryConfig(kibana.services.uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters: tabsFilters, }); @@ -175,7 +174,7 @@ const NetworkComponent = React.memo( - {capabilitiesFetched && !isInitializing ? ( + {capabilitiesFetched && !isInitializing && sourcererDataView ? ( <> @@ -187,7 +186,7 @@ const NetworkComponent = React.memo( filterQuery={tabsFilterQuery} from={from} isInitializing={isInitializing} - indexPattern={indexPattern} + dataViewSpec={sourcererDataView} indexNames={selectedPatterns} setQuery={setQuery} type={networkModel.NetworkType.page} diff --git a/x-pack/plugins/security_solution/public/explore/users/pages/details/index.tsx b/x-pack/plugins/security_solution/public/explore/users/pages/details/index.tsx index a53eaf43269bf..6ac48dd527904 100644 --- a/x-pack/plugins/security_solution/public/explore/users/pages/details/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/users/pages/details/index.tsx @@ -20,6 +20,7 @@ import { getEsQueryConfig } from '@kbn/data-plugin/common'; import type { Filter } from '@kbn/es-query'; import { buildEsQuery } from '@kbn/es-query'; import { dataTableSelectors, TableId } from '@kbn/securitysolution-data-table'; +import { dataViewSpecToViewBase } from '../../../../common/lib/kuery'; import { useCalculateEntityRiskScore } from '../../../../entity_analytics/api/hooks/use_calculate_entity_risk_score'; import { useAssetCriticalityData, @@ -115,14 +116,13 @@ const UsersDetailsComponent: React.FC = ({ [detailName] ); - const { indicesExist, indexPattern, selectedPatterns, sourcererDataView } = - useSourcererDataView(); + const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView(); const [rawFilteredQuery, kqlError] = useMemo(() => { try { return [ buildEsQuery( - indexPattern, + dataViewSpecToViewBase(sourcererDataView), [query], [...usersDetailsPageFilters, ...globalFilters], getEsQueryConfig(uiSettings) @@ -131,7 +131,7 @@ const UsersDetailsComponent: React.FC = ({ } catch (e) { return [undefined, e]; } - }, [globalFilters, indexPattern, query, uiSettings, usersDetailsPageFilters]); + }, [globalFilters, sourcererDataView, query, uiSettings, usersDetailsPageFilters]); const stringifiedAdditionalFilters = JSON.stringify(rawFilteredQuery); useInvalidFilterQuery({ @@ -293,7 +293,7 @@ const UsersDetailsComponent: React.FC = ({ filterQuery={stringifiedAdditionalFilters} from={from} indexNames={selectedPatterns} - indexPattern={indexPattern} + dataViewSpec={sourcererDataView} isInitializing={isInitializing} userDetailFilter={usersDetailsPageFilters} setQuery={setQuery} diff --git a/x-pack/plugins/security_solution/public/explore/users/pages/details/types.ts b/x-pack/plugins/security_solution/public/explore/users/pages/details/types.ts index 002d1339a1898..8b531af663990 100644 --- a/x-pack/plugins/security_solution/public/explore/users/pages/details/types.ts +++ b/x-pack/plugins/security_solution/public/explore/users/pages/details/types.ts @@ -7,7 +7,8 @@ import type { ActionCreator } from 'typescript-fsa'; -import type { DataViewBase, Filter, Query } from '@kbn/es-query'; +import { type DataViewSpec } from '@kbn/data-plugin/common'; +import type { Filter, Query } from '@kbn/es-query'; import type { UsersQueryProps } from '../types'; import type { NavTab } from '../../../../common/components/navigation/types'; @@ -47,6 +48,6 @@ export type UsersDetailsTabsProps = UserBodyComponentDispatchProps & indexNames: string[]; userDetailFilter: Filter[]; filterQuery?: string; - indexPattern: DataViewBase; + dataViewSpec?: DataViewSpec; type: usersModel.UsersType; }; diff --git a/x-pack/plugins/security_solution/public/explore/users/pages/users.tsx b/x-pack/plugins/security_solution/public/explore/users/pages/users.tsx index 61cd8888bfb4c..767d009aff16c 100644 --- a/x-pack/plugins/security_solution/public/explore/users/pages/users.tsx +++ b/x-pack/plugins/security_solution/public/explore/users/pages/users.tsx @@ -98,27 +98,26 @@ const UsersComponent = () => { return globalFilters; }, [severitySelection, tabName, globalFilters]); - const { indicesExist, indexPattern, selectedPatterns, sourcererDataView } = - useSourcererDataView(); + const { indicesExist, selectedPatterns, sourcererDataView } = useSourcererDataView(); const [globalFiltersQuery, kqlError] = useMemo( () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters: globalFilters, }), - [globalFilters, indexPattern, uiSettings, query] + [globalFilters, sourcererDataView, uiSettings, query] ); const [tabsFilterQuery] = useMemo( () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters: tabsFilters, }), - [indexPattern, query, tabsFilters, uiSettings] + [sourcererDataView, query, tabsFilters, uiSettings] ); useInvalidFilterQuery({ diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx index b6c5dc0078b02..53936a5ed2e99 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/entities_details.test.tsx @@ -65,7 +65,9 @@ jest.mock('../../../../helper_hooks', () => ({ })); jest.mock('../../../../sourcerer/containers', () => ({ - useSourcererDataView: jest.fn().mockReturnValue({ selectedPatterns: ['index'] }), + useSourcererDataView: jest + .fn() + .mockReturnValue({ selectedPatterns: ['index'], sourcererDataView: {} }), })); jest.mock('../../../../common/components/ml/anomaly/anomaly_table_provider', () => ({ diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx index 23f6969c36778..895ff3d1b7697 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/host_details.test.tsx @@ -88,7 +88,9 @@ jest.mock('../../../../helper_hooks', () => ({ })); jest.mock('../../../../sourcerer/containers', () => ({ - useSourcererDataView: jest.fn().mockReturnValue({ selectedPatterns: ['index'] }), + useSourcererDataView: jest + .fn() + .mockReturnValue({ selectedPatterns: ['index'], sourcererDataView: {} }), })); jest.mock('../../../../common/components/ml/anomaly/anomaly_table_provider', () => ({ diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/session_view.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/session_view.test.tsx index 6db3c4fb4a90d..ff3a834225d68 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/session_view.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/session_view.test.tsx @@ -88,8 +88,7 @@ describe('', () => { loading: false, indicesExist: true, selectedPatterns: ['index'], - indexPattern: { fields: [], title: '' }, - sourcererDataView: undefined, + sourcererDataView: {}, }); }); it('renders session view correctly', () => { diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx index a2c53afb8c3f3..d4150c01d06a6 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/components/user_details.test.tsx @@ -80,7 +80,9 @@ jest.mock('../../../../common/components/ml/hooks/use_ml_capabilities'); const mockUseMlUserPermissions = useMlCapabilities as jest.Mock; jest.mock('../../../../sourcerer/containers', () => ({ - useSourcererDataView: jest.fn().mockReturnValue({ selectedPatterns: ['index'] }), + useSourcererDataView: jest + .fn() + .mockReturnValue({ selectedPatterns: ['index'], sourcererDataView: {} }), })); jest.mock('../../../../common/components/ml/anomaly/anomaly_table_provider', () => ({ diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts b/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts index e40cd74709cfd..17e564a1eb8ab 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.test.ts @@ -50,8 +50,7 @@ describe('useThreatIntelligenceDetails', () => { loading: false, indicesExist: true, selectedPatterns: [], - indexPattern: { fields: [], title: '' }, - sourcererDataView: undefined, + sourcererDataView: {}, }); jest diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.ts b/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.ts index a7b8256b502f5..7826d98b65a3a 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/hooks/use_threat_intelligence_details.ts @@ -71,7 +71,7 @@ export const useThreatIntelligenceDetails = (): ThreatIntelligenceDetailsResult const [isEventDataLoading, eventData] = useTimelineEventsDetails({ indexName, eventId, - runtimeMappings: sourcererDataView.sourcererDataView?.runtimeFieldMap as RunTimeMappings, + runtimeMappings: sourcererDataView.sourcererDataView.runtimeFieldMap as RunTimeMappings, skip: !eventId, }); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx index de1020bac4d00..efa56c9e65720 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.test.tsx @@ -53,6 +53,7 @@ describe('useEventDetails', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ browserFields: {}, indexPattern: {}, + sourcererDataView: {}, }); (useTimelineEventsDetails as jest.Mock).mockReturnValue([false, [], {}, {}, jest.fn()]); jest.mocked(useGetFieldsData).mockReturnValue({ getFieldsData: (field: string) => field }); @@ -63,7 +64,7 @@ describe('useEventDetails', () => { expect(hookResult.result.current.dataAsNestedObject).toEqual({}); expect(hookResult.result.current.dataFormattedForFieldBrowser).toEqual([]); expect(hookResult.result.current.getFieldsData('test')).toEqual('test'); - expect(hookResult.result.current.indexPattern).toEqual({}); + expect('indexPattern' in hookResult.result.current).toEqual(true); expect(hookResult.result.current.loading).toEqual(false); expect(hookResult.result.current.refetchFlyoutData()).toEqual(undefined); expect(hookResult.result.current.searchHit).toEqual({}); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.ts b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.ts index 40acb8690ce64..b880e372d5bed 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.ts +++ b/x-pack/plugins/security_solution/public/flyout/document_details/shared/hooks/use_event_details.ts @@ -8,7 +8,7 @@ import type { BrowserFields, TimelineEventsDetailsItem } from '@kbn/timelines-plugin/common'; import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs'; import { SecurityPageName } from '@kbn/security-solution-navigation'; -import type { DataViewBase } from '@kbn/es-query'; +import { type DataViewSpec } from '@kbn/data-plugin/common'; import { DEFAULT_ALERTS_INDEX, DEFAULT_PREVIEW_INDEX } from '../../../../../common/constants'; import type { RunTimeMappings } from '../../../../../common/api/search_strategy'; import { useSpaceId } from '../../../../common/hooks/use_space_id'; @@ -66,7 +66,7 @@ export interface UseEventDetailsResult { /** * Index pattern for rule details */ - indexPattern: DataViewBase; + indexPattern?: DataViewSpec; /** * Whether the data is loading */ @@ -102,7 +102,7 @@ export const useEventDetails = ({ useTimelineEventsDetails({ indexName: eventIndex, eventId: eventId ?? '', - runtimeMappings: sourcererDataView?.sourcererDataView?.runtimeFieldMap as RunTimeMappings, + runtimeMappings: sourcererDataView.sourcererDataView.runtimeFieldMap as RunTimeMappings, skip: !eventId, }); const { getFieldsData } = useGetFieldsData({ fieldsData: searchHit?.fields }); @@ -112,7 +112,7 @@ export const useEventDetails = ({ dataAsNestedObject, dataFormattedForFieldBrowser, getFieldsData, - indexPattern: sourcererDataView.indexPattern, + indexPattern: sourcererDataView.sourcererDataView, loading, refetchFlyoutData, searchHit, diff --git a/x-pack/plugins/security_solution/public/flyout/network_details/components/network_details.tsx b/x-pack/plugins/security_solution/public/flyout/network_details/components/network_details.tsx index b36ef2fd55854..715f6dfa43589 100644 --- a/x-pack/plugins/security_solution/public/flyout/network_details/components/network_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/network_details/components/network_details.tsx @@ -76,10 +76,10 @@ export const NetworkDetails = ({ services: { uiSettings }, } = useKibana(); - const { indicesExist, indexPattern, selectedPatterns } = useSourcererDataView(); + const { indicesExist, sourcererDataView, selectedPatterns } = useSourcererDataView(); const [filterQuery, kqlError] = convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters, }); diff --git a/x-pack/plugins/security_solution/public/kubernetes/pages/index.tsx b/x-pack/plugins/security_solution/public/kubernetes/pages/index.tsx index c2d84e543dc0f..55c8a4472379b 100644 --- a/x-pack/plugins/security_solution/public/kubernetes/pages/index.tsx +++ b/x-pack/plugins/security_solution/public/kubernetes/pages/index.tsx @@ -25,12 +25,13 @@ import { convertToBuildEsQuery } from '../../common/lib/kuery'; import { useInvalidFilterQuery } from '../../common/hooks/use_invalid_filter_query'; import { SessionsView } from '../../common/components/sessions_viewer'; import { kubernetesSessionsHeaders } from './constants'; +import { dataViewSpecToIndexPattern } from './utils/data_view_spec_to_index_pattern'; export const KubernetesContainer = React.memo(() => { const { kubernetesSecurity, uiSettings } = useKibana().services; const { globalFullScreen } = useGlobalFullScreen(); - const { indexPattern, sourcererDataView, dataViewId } = useSourcererDataView(); + const { sourcererDataView, dataViewId } = useSourcererDataView(); const { from, to } = useGlobalTime(); const getGlobalFiltersQuerySelector = useMemo( @@ -45,11 +46,11 @@ export const KubernetesContainer = React.memo(() => { () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec: sourcererDataView, queries: [query], filters, }), - [filters, indexPattern, uiSettings, query] + [filters, sourcererDataView, uiSettings, query] ); useInvalidFilterQuery({ @@ -84,7 +85,7 @@ export const KubernetesContainer = React.memo(() => { ), - indexPattern, + indexPattern: dataViewSpecToIndexPattern(sourcererDataView), globalFilter: { filterQuery, startDate: from, diff --git a/x-pack/plugins/security_solution/public/kubernetes/pages/utils/data_view_spec_to_index_pattern.ts b/x-pack/plugins/security_solution/public/kubernetes/pages/utils/data_view_spec_to_index_pattern.ts new file mode 100644 index 0000000000000..f4cb604ec3d8f --- /dev/null +++ b/x-pack/plugins/security_solution/public/kubernetes/pages/utils/data_view_spec_to_index_pattern.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { DataViewSpec } from '@kbn/data-plugin/common'; +import type { IndexPattern } from '@kbn/kubernetes-security-plugin/public/types'; + +export const dataViewSpecToIndexPattern = ( + dataViewSpec?: DataViewSpec +): IndexPattern | undefined => { + return dataViewSpec as IndexPattern | undefined; +}; diff --git a/x-pack/plugins/security_solution/public/overview/components/event_counts/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/event_counts/index.test.tsx index 6bd427d547c86..68149045e798c 100644 --- a/x-pack/plugins/security_solution/public/overview/components/event_counts/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/event_counts/index.test.tsx @@ -10,7 +10,7 @@ import React from 'react'; import type { OverviewHostProps } from '../overview_host'; import type { OverviewNetworkProps } from '../overview_network'; -import { mockIndexPattern, TestProviders } from '../../../common/mock'; +import { mockDataViewSpec, TestProviders } from '../../../common/mock'; import { EventCounts } from '.'; @@ -24,7 +24,7 @@ describe('EventCounts', () => { filters: [], from, indexNames: [], - indexPattern: mockIndexPattern, + dataViewSpec: mockDataViewSpec, setQuery: jest.fn(), to, query: { diff --git a/x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx b/x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx index 34692b8cc12d3..3f20d3365537f 100644 --- a/x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/event_counts/index.tsx @@ -8,8 +8,8 @@ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React, { useMemo } from 'react'; -import type { DataViewBase, Filter, Query } from '@kbn/es-query'; -import { getEsQueryConfig } from '@kbn/data-plugin/common'; +import type { Filter, Query } from '@kbn/es-query'; +import { type DataViewSpec, getEsQueryConfig } from '@kbn/data-plugin/common'; import { ID as OverviewHostQueryId } from '../../containers/overview_host'; import { OverviewHost } from '../overview_host'; import { OverviewNetwork } from '../overview_network'; @@ -26,7 +26,7 @@ import { SecurityPageName } from '../../../../common/constants'; interface Props extends Pick { filters: Filter[]; indexNames: string[]; - indexPattern: DataViewBase; + dataViewSpec?: DataViewSpec; query: Query; } @@ -34,7 +34,7 @@ const EventCountsComponent: React.FC = ({ filters, from, indexNames, - indexPattern, + dataViewSpec, query, setQuery, to, @@ -45,22 +45,22 @@ const EventCountsComponent: React.FC = ({ () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec, queries: [query], filters: [...filters, ...fieldNameExistsFilter(SecurityPageName.hosts)], }), - [filters, indexPattern, query, uiSettings] + [dataViewSpec, filters, query, uiSettings] ); const [networkFilterQuery] = useMemo( () => convertToBuildEsQuery({ config: getEsQueryConfig(uiSettings), - indexPattern, + dataViewSpec, queries: [query], filters: [...filters, ...sourceOrDestinationIpExistsFilter], }), - [filters, indexPattern, uiSettings, query] + [uiSettings, dataViewSpec, query, filters] ); useInvalidFilterQuery({ 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 eb551d4ba20aa..a30ae72ed9b00 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 @@ -9,9 +9,10 @@ import { Position } from '@elastic/charts'; import numeral from '@elastic/numeral'; import React, { useEffect, useMemo, useCallback } from 'react'; -import type { DataViewBase, Filter, Query } from '@kbn/es-query'; +import type { Filter, Query } from '@kbn/es-query'; import styled from 'styled-components'; import { EuiButton } from '@elastic/eui'; +import type { DataViewSpec } from '@kbn/data-plugin/common'; import { getEsQueryConfig } from '@kbn/data-plugin/common'; import { DEFAULT_NUMBER_FORMAT, APP_UI_ID } from '../../../../common/constants'; import { SHOWING, UNIT } from '../../../common/components/events_viewer/translations'; @@ -46,7 +47,7 @@ interface Props extends Pick = ({ filters, from, headerChildren, - indexPattern, + dataViewSpec, onlyField, paddingSize, query, @@ -132,13 +133,13 @@ const EventsByDatasetComponent: React.FC = ({ if (filterQueryFromProps == null) { return convertToBuildEsQuery({ config: getEsQueryConfig(kibana.services.uiSettings), - indexPattern, + dataViewSpec, queries: [query], filters, }); } return [filterQueryFromProps]; - }, [filterQueryFromProps, kibana, indexPattern, query, filters]); + }, [filterQueryFromProps, kibana.services.uiSettings, dataViewSpec, query, filters]); useInvalidFilterQuery({ id: uniqueQueryId, diff --git a/x-pack/plugins/security_solution/public/overview/pages/overview.tsx b/x-pack/plugins/security_solution/public/overview/pages/overview.tsx index 0450b922acb44..e70a0f8e51577 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/overview.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/overview.tsx @@ -50,8 +50,7 @@ const OverviewComponent = () => { const filters = useDeepEqualSelector(getGlobalFiltersQuerySelector); const { from, deleteQuery, setQuery, to } = useGlobalTime(); - const { indicesExist, sourcererDataView, indexPattern, selectedPatterns } = - useSourcererDataView(); + const { indicesExist, sourcererDataView, selectedPatterns } = useSourcererDataView(); const endpointMetadataIndex = useMemo(() => { return [ENDPOINT_METADATA_INDEX]; @@ -114,7 +113,7 @@ const OverviewComponent = () => { deleteQuery={deleteQuery} filters={filters} from={from} - indexPattern={indexPattern} + dataViewSpec={sourcererDataView} query={query} queryType="overview" setQuery={setQuery} @@ -127,7 +126,7 @@ const OverviewComponent = () => { filters={filters} from={from} indexNames={selectedPatterns} - indexPattern={indexPattern} + dataViewSpec={sourcererDataView} query={query} setQuery={setQuery} to={to} diff --git a/x-pack/plugins/security_solution/public/sourcerer/components/alerts_sourcerer.test.tsx b/x-pack/plugins/security_solution/public/sourcerer/components/alerts_sourcerer.test.tsx index 60bbe58824e41..619f7e91eae82 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/components/alerts_sourcerer.test.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/components/alerts_sourcerer.test.tsx @@ -72,6 +72,7 @@ describe('sourcerer on alerts page or rules details page', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ ...sourcererDataView, indicesExist: true, + sourcererDataView: {}, }); render( diff --git a/x-pack/plugins/security_solution/public/sourcerer/components/index.tsx b/x-pack/plugins/security_solution/public/sourcerer/components/index.tsx index 8b45d96669793..ad5a939b69995 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/components/index.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/components/index.tsx @@ -152,8 +152,8 @@ export const Sourcerer = React.memo(({ scope: scopeId } const { indicesExist, loading, sourcererDataView } = useSourcererDataView(scopeId); const activePatterns = useMemo( - () => (sourcererDataView?.title || '')?.split(',').filter(Boolean) as string[], - [sourcererDataView?.title] + () => (sourcererDataView.title || '')?.split(',').filter(Boolean) as string[], + [sourcererDataView.title] ); const [missingPatterns, setMissingPatterns] = useState( diff --git a/x-pack/plugins/security_solution/public/sourcerer/components/sourcerer_integration.test.tsx b/x-pack/plugins/security_solution/public/sourcerer/components/sourcerer_integration.test.tsx index d43a3a47ed267..5f21a814da363 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/components/sourcerer_integration.test.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/components/sourcerer_integration.test.tsx @@ -72,6 +72,7 @@ const patternListNoSignals = sortWithExcludesAtEnd( const sourcererDataView = { indicesExist: true, loading: false, + sourcererDataView: {}, }; describe('Sourcerer integration tests', () => { diff --git a/x-pack/plugins/security_solution/public/sourcerer/components/timeline_sourcerer.test.tsx b/x-pack/plugins/security_solution/public/sourcerer/components/timeline_sourcerer.test.tsx index ff86241164631..35a26856f4930 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/components/timeline_sourcerer.test.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/components/timeline_sourcerer.test.tsx @@ -56,6 +56,7 @@ const { id } = mockGlobalState.sourcerer.defaultDataView; const sourcererDataView = { indicesExist: true, loading: false, + sourcererDataView: {}, }; describe('timeline sourcerer', () => { diff --git a/x-pack/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts b/x-pack/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts index 18e34ba2067a1..87345f80ef701 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts +++ b/x-pack/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.test.ts @@ -40,7 +40,7 @@ describe('useGetScopedSourcererDataView', () => { it('should return undefined when no spec is provided', () => { mockGetSourcererDataView.mockReturnValueOnce({ ...mockSourcererScope, - sourcererDataView: undefined, + sourcererDataView: {}, }); const { result } = renderHookCustom({ sourcererScope: SourcererScopeName.timeline }); expect(result.current).toBeUndefined(); @@ -48,7 +48,7 @@ describe('useGetScopedSourcererDataView', () => { it('should return undefined when no spec is provided and should update the return when spec is updated to correct value', () => { mockGetSourcererDataView.mockReturnValueOnce({ ...mockSourcererScope, - sourcererDataView: undefined, + sourcererDataView: {}, }); const { rerender, result } = renderHookCustom({ sourcererScope: SourcererScopeName.timeline }); expect(result.current).toBeUndefined(); diff --git a/x-pack/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.tsx b/x-pack/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.tsx index 869b9d68e27ac..52b5ca9717e8d 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/components/use_get_sourcerer_data_view.tsx @@ -30,7 +30,7 @@ export const useGetScopedSourcererDataView = ({ const { sourcererDataView } = useSourcererDataView(sourcererScope); const dataView = useMemo(() => { - if (sourcererDataView) { + if (Object.keys(sourcererDataView).length) { return new DataView({ spec: sourcererDataView, fieldFormats }); } else { return undefined; diff --git a/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx b/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx index 8b0150efa6126..e712e780636e4 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/containers/hooks.test.tsx @@ -698,7 +698,6 @@ describe('Sourcerer Hooks', () => { '-filebeat-*', '-packetbeat-*', ]); - expect(result.current.indexPattern).toHaveProperty('getName'); }); }); @@ -710,7 +709,7 @@ describe('Sourcerer Hooks', () => { } ); - expect(result.current.sourcererDataView?.title).toBe( + expect(result.current.sourcererDataView.title).toBe( 'apm-*-transaction*,auditbeat-*,endgame-*,filebeat-*,logs-*,packetbeat-*,traces-apm*,winlogbeat-*,-*elastic-cloud-logs-*' ); @@ -727,8 +726,8 @@ describe('Sourcerer Hooks', () => { await rerender(); - expect(result.current.sourcererDataView?.title).toBe(testPatterns.join(',')); - expect(result.current.sourcererDataView?.name).toBe(testPatterns.join(',')); + expect(result.current.sourcererDataView.title).toBe(testPatterns.join(',')); + expect(result.current.sourcererDataView.name).toBe(testPatterns.join(',')); }); }); }); diff --git a/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx b/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx index 9765a26e60b0e..9643e9272f8be 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx @@ -7,6 +7,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { useSelector } from 'react-redux'; +import type { FieldSpec } from '@kbn/data-plugin/common'; import { sourcererSelectors } from '../store'; import type { SelectedDataView, SourcererDataView, RunTimeMappings } from '../store/model'; import { SourcererScopeName } from '../store/model'; @@ -56,8 +57,7 @@ export const useSourcererDataView = ( id: fetchIndexReturn.dataView?.id ?? null, loading: indexPatternsLoading, patternList: fetchIndexReturn.indexes, - indexFields: fetchIndexReturn.indexPatterns - .fields as SelectedDataView['indexPattern']['fields'], + indexFields: fetchIndexReturn.indexPatterns.fields as FieldSpec[], fields: fetchIndexReturn.dataView?.fields, }), [fetchIndexReturn, indexPatternsLoading] diff --git a/x-pack/plugins/security_solution/public/sourcerer/containers/mocks.ts b/x-pack/plugins/security_solution/public/sourcerer/containers/mocks.ts index 283f41bc8be67..4d331ebab65ff 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/containers/mocks.ts +++ b/x-pack/plugins/security_solution/public/sourcerer/containers/mocks.ts @@ -38,19 +38,6 @@ export const mockSourcererScope: SelectedDataView = { }, }, }, - indexPattern: { - fields: [ - { - aggregatable: false, - esTypes: undefined, - name: '_id', - searchable: true, - subType: undefined, - type: 'string', - }, - ], - title: mockPatterns.join(), - }, sourcererDataView: mockGlobalState.sourcerer.defaultDataView, selectedPatterns: mockPatterns, indicesExist: true, diff --git a/x-pack/plugins/security_solution/public/sourcerer/store/model.ts b/x-pack/plugins/security_solution/public/sourcerer/store/model.ts index 3b3f8c56b261c..807c74a9c3f8f 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/store/model.ts +++ b/x-pack/plugins/security_solution/public/sourcerer/store/model.ts @@ -9,7 +9,6 @@ import type { BrowserFields } from '@kbn/timelines-plugin/common'; import { EMPTY_BROWSER_FIELDS } from '@kbn/timelines-plugin/common'; import type { DataViewSpec } from '@kbn/data-views-plugin/public'; import type { RuntimeFieldSpec, RuntimePrimitiveTypes } from '@kbn/data-views-plugin/common'; -import type { SecuritySolutionDataViewBase } from '../../common/types'; /** Uniquely identifies a Sourcerer Scope */ export enum SourcererScopeName { @@ -88,11 +87,6 @@ export interface SelectedDataView { */ browserFields: BrowserFields; dataViewId: string | null; // null if legacy pre-8.0 timeline - /** - * @deprecated use sourcererDataView - * DataViewBase with enhanced index fields used in timelines - */ - indexPattern: SecuritySolutionDataViewBase; /** do the selected indices exist */ indicesExist: boolean; /** is an update being made to the data view */ @@ -103,7 +97,7 @@ export interface SelectedDataView { * Easier to add this additional data rather than * try to extend the SelectedDataView type from DataView. */ - sourcererDataView: DataViewSpec | undefined; + sourcererDataView: DataViewSpec; } /** diff --git a/x-pack/plugins/security_solution/public/timelines/components/modal/actions/open_timeline_button.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/modal/actions/open_timeline_button.test.tsx index e0a48cebf4209..ffa8f0b1bb0b0 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/modal/actions/open_timeline_button.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/modal/actions/open_timeline_button.test.tsx @@ -62,7 +62,11 @@ describe('OpenTimelineButton', () => { it('should open the modal after clicking on the button', async () => { (useParams as jest.Mock).mockReturnValue({ tabName: TimelineTypeEnum.template }); (useStartTransaction as jest.Mock).mockReturnValue({ startTransaction: jest.fn() }); - (useSourcererDataView as jest.Mock).mockReturnValue({ dataViewId: '', selectedPatterns: [] }); + (useSourcererDataView as jest.Mock).mockReturnValue({ + dataViewId: '', + selectedPatterns: [], + sourcererDataView: {}, + }); (useTimelineStatus as jest.Mock).mockReturnValue({ timelineStatus: 'active', templateTimelineFilter: null, diff --git a/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx index 228c6bc70584c..25eef44d1469c 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.test.tsx @@ -59,6 +59,7 @@ describe('TimelineModalHeader', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ browserFields: {}, indexPattern: { fields: [], title: '' }, + sourcererDataView: {}, }); const { getByTestId, getByText } = renderTimelineModalHeader(); @@ -78,6 +79,7 @@ describe('TimelineModalHeader', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ browserFields: {}, indexPattern: { fields: [], title: '' }, + sourcererDataView: {}, }); (useKibana as jest.Mock).mockReturnValue({ services: { @@ -107,6 +109,7 @@ describe('TimelineModalHeader', () => { (useSourcererDataView as jest.Mock).mockReturnValue({ browserFields: {}, indexPattern: { fields: [], title: '' }, + sourcererDataView: {}, }); const spy = jest.spyOn(timelineActions, 'showTimeline'); diff --git a/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.tsx index e30e0c2cf2a10..7eccb11a35312 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/modal/header/index.tsx @@ -70,7 +70,7 @@ interface FlyoutHeaderPanelProps { export const TimelineModalHeader = React.memo( ({ timelineId, openToggleRef }) => { const dispatch = useDispatch(); - const { browserFields, indexPattern } = useSourcererDataView(SourcererScopeName.timeline); + const { browserFields, sourcererDataView } = useSourcererDataView(SourcererScopeName.timeline); const { cases, uiSettings } = useKibana().services; const esQueryConfig = useMemo(() => getEsQueryConfig(uiSettings), [uiSettings]); const userCasesPermissions = cases.helpers.canUseCases([APP_ID]); @@ -88,13 +88,21 @@ export const TimelineModalHeader = React.memo( combineQueries({ config: esQueryConfig, dataProviders, - indexPattern, + indexPattern: sourcererDataView, browserFields, filters: filters ? filters : [], kqlQuery: kqlQueryObj, kqlMode, }), - [browserFields, dataProviders, esQueryConfig, filters, indexPattern, kqlMode, kqlQueryObj] + [ + browserFields, + dataProviders, + esQueryConfig, + filters, + kqlMode, + kqlQueryObj, + sourcererDataView, + ] ); const isInspectDisabled = !isDataInTimeline || combinedQueries?.filterQuery === undefined; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/kpi/kpi_container.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/kpi/kpi_container.tsx index 47d79c1ba71c3..dce963737fb5a 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/kpi/kpi_container.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/kpi/kpi_container.tsx @@ -32,7 +32,7 @@ interface KpiExpandedProps { } export const TimelineKpisContainer = ({ timelineId }: KpiExpandedProps) => { - const { browserFields, indexPattern, selectedPatterns } = useSourcererDataView( + const { browserFields, sourcererDataView, selectedPatterns } = useSourcererDataView( SourcererScopeName.timeline ); @@ -82,13 +82,13 @@ export const TimelineKpisContainer = ({ timelineId }: KpiExpandedProps) => { combineQueries({ config: esQueryConfig, dataProviders, - indexPattern, + indexPattern: sourcererDataView, browserFields, filters: filters ? filters : [], kqlQuery, kqlMode, }), - [browserFields, dataProviders, esQueryConfig, filters, indexPattern, kqlMode, kqlQuery] + [browserFields, dataProviders, esQueryConfig, filters, sourcererDataView, kqlMode, kqlQuery] ); const isBlankTimeline: boolean = useMemo( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/index.tsx index 59373b5d790f5..54b5a4a9aae2f 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/eql/index.tsx @@ -79,7 +79,7 @@ export const EqlQueryBarTimeline = memo(({ timelineId }: { timelineId: string }) const { loading: indexPatternsLoading, - indexPattern, + sourcererDataView, selectedPatterns, } = useSourcererDataView(SourcererScopeName.timeline); @@ -123,27 +123,23 @@ export const EqlQueryBarTimeline = memo(({ timelineId }: { timelineId: string }) const prevEqlQuery = useRef(''); - const optionsData = useMemo( - () => - isEmpty(indexPattern.fields) - ? { - keywordFields: [], - dateFields: [], - nonDateFields: [], - } - : { - keywordFields: indexPattern.fields - .filter((f) => f.esTypes?.includes('keyword')) - .map((f) => ({ label: f.name })), - dateFields: indexPattern.fields - .filter((f) => f.type === 'date') - .map((f) => ({ label: f.name })), - nonDateFields: indexPattern.fields - .filter((f) => f.type !== 'date') - .map((f) => ({ label: f.name })), - }, - [indexPattern] - ); + const optionsData = useMemo(() => { + const fields = Object.values(sourcererDataView.fields || {}); + + return isEmpty(fields) + ? { + keywordFields: [], + dateFields: [], + nonDateFields: [], + } + : { + keywordFields: fields + .filter((f) => f.esTypes?.includes('keyword')) + .map((f) => ({ label: f.name })), + dateFields: fields.filter((f) => f.type === 'date').map((f) => ({ label: f.name })), + nonDateFields: fields.filter((f) => f.type !== 'date').map((f) => ({ label: f.name })), + }; + }, [sourcererDataView]); useEffect(() => { const { index: indexField } = getFields(); @@ -206,7 +202,7 @@ export const EqlQueryBarTimeline = memo(({ timelineId }: { timelineId: string }) idAria: 'timelineEqlQueryBar', isDisabled: indexPatternsLoading, isLoading: indexPatternsLoading, - indexPattern, + indexPattern: sourcererDataView, dataTestSubj: 'timelineEqlQueryBar', }} config={{ diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx index 3ac5ba0cb5ac8..1bb39aa4796d2 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx @@ -17,7 +17,10 @@ import { InputsModelId } from '../../../../common/store/inputs/constants'; import { useSourcererDataView } from '../../../../sourcerer/containers'; import { SourcererScopeName } from '../../../../sourcerer/store/model'; -import { convertKueryToElasticSearchQuery } from '../../../../common/lib/kuery'; +import { + convertKueryToElasticSearchQuery, + dataViewSpecToViewBase, +} from '../../../../common/lib/kuery'; import type { KqlMode } from '../../../store/model'; import { useSavedQueryServices } from '../../../../common/utils/saved_query_services'; import type { DispatchUpdateReduxTime } from '../../../../common/components/super_date_picker'; @@ -107,7 +110,7 @@ export const QueryBarTimeline = memo( const [dateRangeTo, setDateRangTo] = useState( toStr != null ? toStr : new Date(to).toISOString() ); - const { browserFields, indexPattern } = useSourcererDataView(SourcererScopeName.timeline); + const { browserFields, sourcererDataView } = useSourcererDataView(SourcererScopeName.timeline); const [savedQuery, setSavedQuery] = useState(undefined); const [filterQueryConverted, setFilterQueryConverted] = useState({ query: filterQuery != null ? filterQuery.expression : '', @@ -115,6 +118,11 @@ export const QueryBarTimeline = memo( }); const queryBarFilters = useMemo(() => getNonDropAreaFilters(filters), [filters]); + const indexPattern = useMemo( + () => dataViewSpecToViewBase(sourcererDataView), + [sourcererDataView] + ); + const [dataProvidersDsl, setDataProvidersDsl] = useState( convertKueryToElasticSearchQuery(buildGlobalQuery(dataProviders, browserFields), indexPattern) ); @@ -259,6 +267,10 @@ export const QueryBarTimeline = memo( [dataProvidersDsl, savedQueryId, savedQueryServices] ); + if (!indexPattern) { + return null; + } + return ( ( services: { data }, } = useKibana(); - const { indexPattern } = useSourcererDataView(SourcererScopeName.timeline); + const { sourcererDataView } = useSourcererDataView(SourcererScopeName.timeline); const getIsDataProviderVisible = useMemo( () => timelineSelectors.dataProviderVisibilitySelector(), @@ -86,25 +86,22 @@ const StatefulSearchOrFilterComponent = React.memo( useEffect(() => { let dv: DataView; - if (isDataView(indexPattern)) { - setDataView(indexPattern); - } else if (!filterQuery) { - const createDataView = async () => { - try { - dv = await data.dataViews.create({ title: indexPattern.title }); - setDataView(dv); - } catch (error) { - addError(error, { title: i18n.ERROR_PROCESSING_INDEX_PATTERNS }); - } - }; - createDataView(); - } + const createDataView = async () => { + try { + dv = await data.dataViews.create(sourcererDataView); + setDataView(dv); + } catch (error) { + addError(error, { title: i18n.ERROR_PROCESSING_INDEX_PATTERNS }); + } + }; + createDataView(); + return () => { if (dv?.id) { data.dataViews.clearInstanceCache(dv?.id); } }; - }, [data.dataViews, indexPattern, filterQuery, addError]); + }, [data.dataViews, filterQuery, addError, sourcererDataView]); const arrDataView = useMemo(() => (dataView != null ? [dataView] : []), [dataView]); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/eql/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/eql/index.tsx index e41d9017d49be..f83d783667e4b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/eql/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/eql/index.tsx @@ -110,7 +110,7 @@ export const EqlTabContentComponent: React.FC = ({ indexNames: selectedPatterns, language: 'eql', limit: sampleSize, - runtimeMappings: sourcererDataView?.runtimeFieldMap as RunTimeMappings, + runtimeMappings: sourcererDataView.runtimeFieldMap as RunTimeMappings, skip: !canQueryTimeline(), startDate: start, timerangeKind, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/pinned/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/pinned/index.tsx index 959d6a3b52c3e..fb488d7c6d21b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/pinned/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/pinned/index.tsx @@ -138,7 +138,7 @@ export const PinnedTabContentComponent: React.FC = ({ fields: timelineQueryFields, limit: itemsPerPage, filterQuery, - runtimeMappings: sourcererDataView?.runtimeFieldMap as RunTimeMappings, + runtimeMappings: sourcererDataView.runtimeFieldMap as RunTimeMappings, skip: filterQuery === '', startDate: '', sort: timelineQuerySortField, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx index 478c13db7de73..d12c213b7f3e2 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/index.tsx @@ -86,7 +86,6 @@ export const QueryTabContentComponent: React.FC = ({ browserFields, dataViewId, loading: loadingSourcerer, - indexPattern, // important to get selectedPatterns from useSourcererDataView // in order to include the exclude filters in the search that are not stored in the timeline selectedPatterns, @@ -119,13 +118,13 @@ export const QueryTabContentComponent: React.FC = ({ return combineQueries({ config: esQueryConfig, dataProviders, - indexPattern, + indexPattern: sourcererDataView, browserFields, filters, kqlQuery, kqlMode, }); - }, [esQueryConfig, dataProviders, indexPattern, browserFields, filters, kqlQuery, kqlMode]); + }, [esQueryConfig, dataProviders, sourcererDataView, browserFields, filters, kqlQuery, kqlMode]); useInvalidFilterQuery({ id: timelineId, @@ -177,7 +176,7 @@ export const QueryTabContentComponent: React.FC = ({ indexNames: selectedPatterns, language: kqlQuery.language, limit: sampleSize, - runtimeMappings: sourcererDataView?.runtimeFieldMap as RunTimeMappings, + runtimeMappings: sourcererDataView.runtimeFieldMap as RunTimeMappings, skip: !canQueryTimeline, sort: timelineQuerySortField, startDate: start, diff --git a/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx b/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx index 43a0eab5a5d49..ee7dfc19d59f5 100644 --- a/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/pages/timelines_page.test.tsx @@ -39,6 +39,7 @@ describe('TimelinesPage', () => { it('should render landing page if no indicesExist', () => { (useSourcererDataView as unknown as jest.Mock).mockReturnValue({ indicesExist: false, + sourcererDataView: {}, }); (useKibana as unknown as jest.Mock).mockReturnValue({}); @@ -52,6 +53,7 @@ describe('TimelinesPage', () => { it('should show the correct elements if user has crud', () => { (useSourcererDataView as unknown as jest.Mock).mockReturnValue({ indicesExist: true, + sourcererDataView: {}, }); (useKibana as unknown as jest.Mock).mockReturnValue({ services: { diff --git a/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.ts b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.ts index b6526cf76d456..354dfb94322f4 100644 --- a/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.ts +++ b/x-pack/plugins/threat_intelligence/public/modules/query_bar/hooks/use_filter_in_out.ts @@ -59,10 +59,10 @@ export const useFilterInOut = ({ key, value, filterType, - sourcererDataView?.id + sourcererDataView.id ); filterManager.setFilters(newFilters); - }, [filterManager, filterType, key, sourcererDataView?.id, value]); + }, [filterManager, filterType, key, sourcererDataView.id, value]); if (!fieldAndValueValid(key, value)) { return {} as unknown as UseFilterInValue; diff --git a/x-pack/plugins/threat_intelligence/public/types.ts b/x-pack/plugins/threat_intelligence/public/types.ts index d1fdb8831e518..13d6320ba10b5 100644 --- a/x-pack/plugins/threat_intelligence/public/types.ts +++ b/x-pack/plugins/threat_intelligence/public/types.ts @@ -65,7 +65,7 @@ export interface LicenseAware { export type BrowserFields = Readonly>>; export interface SelectedDataView { - sourcererDataView: DataViewSpec | undefined; + sourcererDataView: DataViewSpec; indexPattern: SecuritySolutionDataViewBase; browserFields: BrowserFields; selectedPatterns: string[]; From b6de3b713dd4cd3996b40bce53c7f0f31b2bcf1f Mon Sep 17 00:00:00 2001 From: Maxim Kholod Date: Mon, 28 Oct 2024 12:18:48 +0100 Subject: [PATCH 059/135] [Cloud Security] add posture type for CSPM dashboard accounts link (#197633) ## Summary - fixes https://github.com/elastic/security-team/issues/10914 --- .../public/components/accounts_evaluated_widget.test.tsx | 1 + .../public/components/accounts_evaluated_widget.tsx | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx b/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx index d81737fea1ec2..9f5f2ec85d021 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.test.tsx @@ -45,6 +45,7 @@ describe('AccountsEvaluatedWidget', () => { expect(mockNavToFindings).toHaveBeenCalledWith( { 'cloud.provider': 'aws', + 'rule.benchmark.posture_type': 'cspm', }, ['cloud.account.name'] ); diff --git a/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.tsx b/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.tsx index 1d4f26274690d..5ae8a47a93e71 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/accounts_evaluated_widget.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, useEuiTheme } from '@elastic/eui'; import { css } from '@emotion/react'; import { useNavigateFindings } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; +import { CSPM_POLICY_TEMPLATE } from '@kbn/cloud-security-posture-common'; import { CLOUD_PROVIDERS, getBenchmarkApplicableTo } from '../../common/utils/helpers'; import { CIS_AWS, CIS_GCP, CIS_AZURE, CIS_K8S, CIS_EKS } from '../../common/constants'; import { CISBenchmarkIcon } from './cis_benchmark_icon'; @@ -61,7 +62,10 @@ export const AccountsEvaluatedWidget = ({ const navToFindings = useNavigateFindings(); const navToFindingsByCloudProvider = (provider: string) => { - navToFindings({ 'cloud.provider': provider }, [FINDINGS_GROUPING_OPTIONS.CLOUD_ACCOUNT_NAME]); + navToFindings( + { 'cloud.provider': provider, 'rule.benchmark.posture_type': CSPM_POLICY_TEMPLATE }, + [FINDINGS_GROUPING_OPTIONS.CLOUD_ACCOUNT_NAME] + ); }; const navToFindingsByCisBenchmark = (cisBenchmark: string) => { From 97f227ef714b3ffe83cbd6a9db5db9d11e6d23fd Mon Sep 17 00:00:00 2001 From: Mykola Harmash Date: Mon, 28 Oct 2024 12:21:07 +0100 Subject: [PATCH 060/135] [Observability Onboarding] Show search bar even when category is not selected (#197825) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes https://github.com/elastic/observability-dev/issues/4065 🔒 Fixes an issue when search bar is not visible unless a category is selected. ![CleanShot 2024-10-25 at 14 53 44@2x](https://github.com/user-attachments/assets/774d2fe2-e4f0-4a46-a851-a0f756a96b12) --- .../onboarding_flow_form.tsx | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 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 9a46cf885b285..eb5ee3bc92369 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 @@ -316,33 +316,34 @@ export const OnboardingFlowForm: FunctionComponent = () => { flowCategory={searchParams.get('category')} />
-
- - - - - - - - card.type === 'virtual' && !card.isCollectionCard - ) - .concat(virtualSearchResults)} - excludePackageIdList={searchExcludePackageIdList} - joinCardLists - /> -
+
+ +
+ + + + + + + + card.type === 'virtual' && !card.isCollectionCard + ) + .concat(virtualSearchResults)} + excludePackageIdList={searchExcludePackageIdList} + joinCardLists + />
); From 73c22a50fda298537f28bd000731b0584503e7ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Georgiana-Andreea=20Onolea=C8=9B=C4=83?= Date: Mon, 28 Oct 2024 13:39:32 +0200 Subject: [PATCH 061/135] [ResponseOps][Cases] Miscount of total numbers of alerts in telemetry (#196112) Closes https://github.com/elastic/kibana/issues/177208 ## Summary Problem: - the metrics collected in telemetry for alerts don't count the total number of alerts on a case correctly. Solution: - added new aggregation function: getUniqueAlertCommentsCountQuery, which is now responsible for defining the cardinality aggregation for counting unique alert comments by alertId. - in the aggs section of the savedObjectsClient.find, the new cardinality aggregation query was added - the total number of alerts is updated to be the result extracted from the new aggregation Example: ![Screenshot 2024-10-22 at 15 20 40](https://github.com/user-attachments/assets/c418c82e-2e35-4c7f-969d-7f4f25bdbc9d) - in the telemetry object, we have the following info: Screenshot 2024-10-22 at 15 21 40 --------- Co-authored-by: Antonio --- .../server/telemetry/queries/alerts.test.ts | 40 ++- .../cases/server/telemetry/queries/alerts.ts | 7 +- .../server/telemetry/queries/utils.test.ts | 228 ++++++++++++++++++ .../cases/server/telemetry/queries/utils.ts | 122 +++++++++- .../plugins/cases/server/telemetry/types.ts | 4 + .../tests/common/telemetry.ts | 51 +++- 6 files changed, 438 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/cases/server/telemetry/queries/alerts.test.ts b/x-pack/plugins/cases/server/telemetry/queries/alerts.test.ts index 11636b50ebd4e..fd00aea939dc8 100644 --- a/x-pack/plugins/cases/server/telemetry/queries/alerts.test.ts +++ b/x-pack/plugins/cases/server/telemetry/queries/alerts.test.ts @@ -17,19 +17,20 @@ describe('alerts', () => { const telemetrySavedObjectsClient = new TelemetrySavedObjectsClient(savedObjectsClient); savedObjectsClient.find.mockResolvedValue({ - total: 5, + total: 3, saved_objects: [], per_page: 1, page: 1, aggregations: { counts: { buckets: [ - { doc_count: 1, key: 1 }, - { doc_count: 2, key: 2 }, - { doc_count: 3, key: 3 }, + { topAlertsPerBucket: { value: 12 } }, + { topAlertsPerBucket: { value: 5 } }, + { topAlertsPerBucket: { value: 3 } }, ], }, references: { cases: { max: { value: 1 } } }, + uniqueAlertCommentsCount: { value: 5 }, }, }); @@ -42,12 +43,13 @@ describe('alerts', () => { savedObjectsClient: telemetrySavedObjectsClient, logger, }); + expect(res).toEqual({ all: { total: 5, daily: 3, - weekly: 2, - monthly: 1, + weekly: 5, + monthly: 12, maxOnACase: 1, }, }); @@ -76,6 +78,13 @@ describe('alerts', () => { }, ], }, + aggregations: { + topAlertsPerBucket: { + cardinality: { + field: 'cases-comments.attributes.alertId', + }, + }, + }, }, references: { aggregations: { @@ -85,10 +94,22 @@ describe('alerts', () => { terms: { field: 'cases-comments.references.id', }, + aggregations: { + reverse: { + reverse_nested: {}, + aggregations: { + topAlerts: { + cardinality: { + field: 'cases-comments.attributes.alertId', + }, + }, + }, + }, + }, }, max: { max_bucket: { - buckets_path: 'ids._count', + buckets_path: 'ids>reverse.topAlerts', }, }, }, @@ -103,6 +124,11 @@ describe('alerts', () => { path: 'cases-comments.references', }, }, + uniqueAlertCommentsCount: { + cardinality: { + field: 'cases-comments.attributes.alertId', + }, + }, }, filter: { arguments: [ diff --git a/x-pack/plugins/cases/server/telemetry/queries/alerts.ts b/x-pack/plugins/cases/server/telemetry/queries/alerts.ts index 96aaec211acb8..88a9c25c88c3d 100644 --- a/x-pack/plugins/cases/server/telemetry/queries/alerts.ts +++ b/x-pack/plugins/cases/server/telemetry/queries/alerts.ts @@ -5,17 +5,14 @@ * 2.0. */ -import { CASE_COMMENT_SAVED_OBJECT } from '../../../common/constants'; import type { CasesTelemetry, CollectTelemetryDataParams } from '../types'; -import { getCountsAndMaxData, getOnlyAlertsCommentsFilter } from './utils'; +import { getCountsAndMaxAlertsData } from './utils'; export const getAlertsTelemetryData = async ({ savedObjectsClient, }: CollectTelemetryDataParams): Promise => { - const res = await getCountsAndMaxData({ + const res = await getCountsAndMaxAlertsData({ savedObjectsClient, - savedObjectType: CASE_COMMENT_SAVED_OBJECT, - filter: getOnlyAlertsCommentsFilter(), }); return res; diff --git a/x-pack/plugins/cases/server/telemetry/queries/utils.test.ts b/x-pack/plugins/cases/server/telemetry/queries/utils.test.ts index 6c66c5aab81c7..b4b18f231eb6a 100644 --- a/x-pack/plugins/cases/server/telemetry/queries/utils.test.ts +++ b/x-pack/plugins/cases/server/telemetry/queries/utils.test.ts @@ -16,10 +16,12 @@ import type { import { findValueInBuckets, getAggregationsBuckets, + getAlertsCountsFromBuckets, getAttachmentsFrameworkStats, getBucketFromAggregation, getConnectorsCardinalityAggregationQuery, getCountsAggregationQuery, + getCountsAndMaxAlertsData, getCountsAndMaxData, getCountsFromBuckets, getCustomFieldsTelemetry, @@ -28,6 +30,7 @@ import { getOnlyConnectorsFilter, getReferencesAggregationQuery, getSolutionValues, + getUniqueAlertCommentsCountQuery, } from './utils'; import { TelemetrySavedObjectsClient } from '../telemetry_saved_objects_client'; @@ -994,6 +997,63 @@ describe('utils', () => { }); }); + describe('getAlertsCountsFromBuckets', () => { + it('returns the correct counts', () => { + const buckets = [ + { topAlertsPerBucket: { value: 12 } }, + { topAlertsPerBucket: { value: 5 } }, + { topAlertsPerBucket: { value: 3 } }, + ]; + + expect(getAlertsCountsFromBuckets(buckets)).toEqual({ + daily: 3, + weekly: 5, + monthly: 12, + }); + }); + + it('returns zero counts when the bucket does not have the topAlertsPerBucket field', () => { + const buckets = [{}]; + // @ts-expect-error + expect(getAlertsCountsFromBuckets(buckets)).toEqual({ + daily: 0, + weekly: 0, + monthly: 0, + }); + }); + + it('returns zero counts when the bucket is undefined', () => { + // @ts-expect-error + expect(getAlertsCountsFromBuckets(undefined)).toEqual({ + daily: 0, + weekly: 0, + monthly: 0, + }); + }); + + it('returns zero counts when the topAlertsPerBucket field is missing in some buckets', () => { + const buckets = [{ doc_count: 1, key: 1, topAlertsPerBucket: { value: 5 } }, {}, {}]; + // @ts-expect-error + expect(getAlertsCountsFromBuckets(buckets)).toEqual({ + daily: 0, + weekly: 0, + monthly: 5, + }); + }); + }); + + describe('getUniqueAlertCommentsCountQuery', () => { + it('returns the correct query', () => { + expect(getUniqueAlertCommentsCountQuery()).toEqual({ + uniqueAlertCommentsCount: { + cardinality: { + field: 'cases-comments.attributes.alertId', + }, + }, + }); + }); + }); + describe('getCountsAndMaxData', () => { const savedObjectsClient = savedObjectsRepositoryMock.create(); savedObjectsClient.find.mockResolvedValue({ @@ -1125,6 +1185,174 @@ describe('utils', () => { }); }); + describe('getCountsAndMaxAlertsData', () => { + const savedObjectsClient = savedObjectsRepositoryMock.create(); + savedObjectsClient.find.mockResolvedValue({ + total: 3, + saved_objects: [], + per_page: 1, + page: 1, + aggregations: { + counts: { + buckets: [ + { doc_count: 1, key: 1, topAlertsPerBucket: { value: 5 } }, + { doc_count: 2, key: 2, topAlertsPerBucket: { value: 3 } }, + { doc_count: 3, key: 3, topAlertsPerBucket: { value: 1 } }, + ], + }, + references: { cases: { max: { value: 1 } } }, + uniqueAlertCommentsCount: { value: 5 }, + }, + }); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('returns the correct counts and max data', async () => { + const telemetrySavedObjectsClient = new TelemetrySavedObjectsClient(savedObjectsClient); + + const res = await getCountsAndMaxAlertsData({ + savedObjectsClient: telemetrySavedObjectsClient, + }); + expect(res).toEqual({ + all: { + total: 5, + daily: 1, + weekly: 3, + monthly: 5, + maxOnACase: 1, + }, + }); + }); + + it('returns zero data if the response aggregation is not as expected', async () => { + const telemetrySavedObjectsClient = new TelemetrySavedObjectsClient(savedObjectsClient); + savedObjectsClient.find.mockResolvedValue({ + total: 5, + saved_objects: [], + per_page: 1, + page: 1, + }); + + const res = await getCountsAndMaxAlertsData({ + savedObjectsClient: telemetrySavedObjectsClient, + }); + expect(res).toEqual({ + all: { + total: 0, + daily: 0, + weekly: 0, + monthly: 0, + maxOnACase: 0, + }, + }); + }); + + it('should call find with correct arguments', async () => { + const telemetrySavedObjectsClient = new TelemetrySavedObjectsClient(savedObjectsClient); + + await getCountsAndMaxAlertsData({ + savedObjectsClient: telemetrySavedObjectsClient, + }); + + expect(savedObjectsClient.find).toBeCalledWith({ + aggs: { + counts: { + date_range: { + field: 'cases-comments.attributes.created_at', + format: 'dd/MM/YYYY', + ranges: [ + { + from: 'now-1d', + to: 'now', + }, + { + from: 'now-1w', + to: 'now', + }, + { + from: 'now-1M', + to: 'now', + }, + ], + }, + aggregations: { + topAlertsPerBucket: { + cardinality: { + field: 'cases-comments.attributes.alertId', + }, + }, + }, + }, + references: { + aggregations: { + cases: { + aggregations: { + ids: { + terms: { + field: 'cases-comments.references.id', + }, + aggregations: { + reverse: { + reverse_nested: {}, + aggregations: { + topAlerts: { + cardinality: { + field: 'cases-comments.attributes.alertId', + }, + }, + }, + }, + }, + }, + max: { + max_bucket: { + buckets_path: 'ids>reverse.topAlerts', + }, + }, + }, + filter: { + term: { + 'cases-comments.references.type': 'cases', + }, + }, + }, + }, + nested: { + path: 'cases-comments.references', + }, + }, + uniqueAlertCommentsCount: { + cardinality: { + field: 'cases-comments.attributes.alertId', + }, + }, + }, + filter: { + arguments: [ + { + isQuoted: false, + type: 'literal', + value: 'cases-comments.attributes.type', + }, + { + isQuoted: false, + type: 'literal', + value: 'alert', + }, + ], + function: 'is', + type: 'function', + }, + page: 0, + perPage: 0, + type: 'cases-comments', + namespaces: ['*'], + }); + }); + }); + describe('getBucketFromAggregation', () => { it('returns the buckets', () => { expect( diff --git a/x-pack/plugins/cases/server/telemetry/queries/utils.ts b/x-pack/plugins/cases/server/telemetry/queries/utils.ts index 65b81e3362300..6992ed8f7ac06 100644 --- a/x-pack/plugins/cases/server/telemetry/queries/utils.ts +++ b/x-pack/plugins/cases/server/telemetry/queries/utils.ts @@ -27,6 +27,7 @@ import type { FileAttachmentAggsResult, AttachmentFrameworkAggsResult, CustomFieldsTelemetry, + AlertBuckets, } from '../types'; import { buildFilter } from '../../client/utils'; import type { Owner } from '../../../common/constants/types'; @@ -47,6 +48,27 @@ export const getCountsAggregationQuery = (savedObjectType: string) => ({ }, }); +export const getAlertsCountsAggregationQuery = () => ({ + counts: { + date_range: { + field: `${CASE_COMMENT_SAVED_OBJECT}.attributes.created_at`, + format: 'dd/MM/YYYY', + ranges: [ + { from: 'now-1d', to: 'now' }, + { from: 'now-1w', to: 'now' }, + { from: 'now-1M', to: 'now' }, + ], + }, + aggregations: { + topAlertsPerBucket: { + cardinality: { + field: `${CASE_COMMENT_SAVED_OBJECT}.attributes.alertId`, + }, + }, + }, + }, +}); + export const getMaxBucketOnCaseAggregationQuery = (savedObjectType: string) => ({ references: { nested: { @@ -76,6 +98,55 @@ export const getMaxBucketOnCaseAggregationQuery = (savedObjectType: string) => ( }, }); +export const getAlertsMaxBucketOnCaseAggregationQuery = () => ({ + references: { + nested: { + path: `${CASE_COMMENT_SAVED_OBJECT}.references`, + }, + aggregations: { + cases: { + filter: { + term: { + [`${CASE_COMMENT_SAVED_OBJECT}.references.type`]: CASE_SAVED_OBJECT, + }, + }, + aggregations: { + ids: { + terms: { + field: `${CASE_COMMENT_SAVED_OBJECT}.references.id`, + }, + aggregations: { + reverse: { + reverse_nested: {}, + aggregations: { + topAlerts: { + cardinality: { + field: `${CASE_COMMENT_SAVED_OBJECT}.attributes.alertId`, + }, + }, + }, + }, + }, + }, + max: { + max_bucket: { + buckets_path: 'ids>reverse.topAlerts', + }, + }, + }, + }, + }, + }, +}); + +export const getUniqueAlertCommentsCountQuery = () => ({ + uniqueAlertCommentsCount: { + cardinality: { + field: `${CASE_COMMENT_SAVED_OBJECT}.attributes.alertId`, + }, + }, +}); + export const getReferencesAggregationQuery = ({ savedObjectType, referenceType, @@ -121,6 +192,52 @@ export const getCountsFromBuckets = (buckets: Buckets['buckets']) => ({ monthly: buckets?.[0]?.doc_count ?? 0, }); +export const getAlertsCountsFromBuckets = (buckets: AlertBuckets['buckets']) => ({ + daily: buckets?.[2]?.topAlertsPerBucket?.value ?? 0, + weekly: buckets?.[1]?.topAlertsPerBucket?.value ?? 0, + monthly: buckets?.[0]?.topAlertsPerBucket?.value ?? 0, +}); + +export const getCountsAndMaxAlertsData = async ({ + savedObjectsClient, +}: { + savedObjectsClient: TelemetrySavedObjectsClient; +}) => { + const filter = getOnlyAlertsCommentsFilter(); + + const res = await savedObjectsClient.find< + unknown, + { + counts: AlertBuckets; + references: MaxBucketOnCaseAggregation['references']; + uniqueAlertCommentsCount: { value: number }; + } + >({ + page: 0, + perPage: 0, + filter, + type: CASE_COMMENT_SAVED_OBJECT, + namespaces: ['*'], + aggs: { + ...getAlertsCountsAggregationQuery(), + ...getAlertsMaxBucketOnCaseAggregationQuery(), + ...getUniqueAlertCommentsCountQuery(), + }, + }); + + const countsBuckets = res.aggregations?.counts?.buckets ?? []; + const totalAlerts = res.aggregations?.uniqueAlertCommentsCount.value ?? 0; + const maxOnACase = res.aggregations?.references?.cases?.max?.value ?? 0; + + return { + all: { + total: totalAlerts, + ...getAlertsCountsFromBuckets(countsBuckets), + maxOnACase, + }, + }; +}; + export const getCountsAndMaxData = async ({ savedObjectsClient, savedObjectType, @@ -132,7 +249,10 @@ export const getCountsAndMaxData = async ({ }) => { const res = await savedObjectsClient.find< unknown, - { counts: Buckets; references: MaxBucketOnCaseAggregation['references'] } + { + counts: Buckets; + references: MaxBucketOnCaseAggregation['references']; + } >({ page: 0, perPage: 0, diff --git a/x-pack/plugins/cases/server/telemetry/types.ts b/x-pack/plugins/cases/server/telemetry/types.ts index b4996da27f234..228aa0c7ae397 100644 --- a/x-pack/plugins/cases/server/telemetry/types.ts +++ b/x-pack/plugins/cases/server/telemetry/types.ts @@ -17,6 +17,10 @@ export interface Bucket { key: T; } +export interface AlertBuckets { + buckets: Array<{ topAlertsPerBucket: { value: number } }>; +} + export interface Buckets { buckets: Array>; } diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/telemetry.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/telemetry.ts index 0c47e62fae79c..c83210e51e5d5 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/telemetry.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/telemetry.ts @@ -6,12 +6,14 @@ */ import expect from 'expect'; -import { getPostCaseRequest } from '../../../common/lib/mock'; +import { getPostCaseRequest, postCommentAlertReq } from '../../../common/lib/mock'; import { deleteAllCaseItems, createCase, getTelemetry, runTelemetryTask, + createComment, + bulkCreateAttachments, } from '../../../common/lib/api'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; import { superUser } from '../../../common/lib/authentication/users'; @@ -49,5 +51,52 @@ export default ({ getService }: FtrProviderContext): void => { expect(res.stats.stack_stats.kibana.plugins.cases.cases.all.total).toBe(2); }); }); + + it('should return the corect total number of alerts attached to cases', async () => { + const firstCase = await createCase(supertest, getPostCaseRequest()); + const secondCase = await createCase(supertest, getPostCaseRequest()); + + const firstCaseAlerts = [...Array(3).keys()].map((num) => `test-case-1-${num}`); + const secondCaseAlerts = [...Array(2).keys()].map((num) => `test-case-2-${num}`); + + await bulkCreateAttachments({ + supertest, + caseId: firstCase.id, + params: [ + { + ...postCommentAlertReq, + alertId: firstCaseAlerts, + index: firstCaseAlerts, + }, + ], + expectedHttpCode: 200, + }); + + await bulkCreateAttachments({ + supertest, + caseId: firstCase.id, + params: [ + { + ...postCommentAlertReq, + alertId: secondCaseAlerts, + index: secondCaseAlerts, + }, + ], + expectedHttpCode: 200, + }); + + await createComment({ + supertest, + caseId: secondCase.id, + params: { ...postCommentAlertReq, alertId: 'test-case-2-3', index: 'test-case-2-3' }, + }); + + await runTelemetryTask(supertest); + + await retry.try(async () => { + const res = await getTelemetry(supertest); + expect(res.stats.stack_stats.kibana.plugins.cases.alerts.all.total).toBe(6); + }); + }); }); }; From a904803e05061076685a2a39ca4c11fb2844b01c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Georgiana-Andreea=20Onolea=C8=9B=C4=83?= Date: Mon, 28 Oct 2024 13:40:19 +0200 Subject: [PATCH 062/135] [ResponseOps][Cases]Add instructions of how to create a connector in the create case form (#197041) Closes https://github.com/elastic/kibana/issues/189246 ## Summary - A helper text was added in the create case form to tell the user that needs to create a connector in the stack management > cases > settings before attaching it to a case - A new "add connector" button was placed in the stack management > cases > settings page, in the connectors section https://github.com/user-attachments/assets/7866b41a-11b5-4ca3-bd65-988412ab1e2f --------- Co-authored-by: Antonio --- .../configure_cases/connectors.test.tsx | 43 +++++++++++++------ .../components/configure_cases/connectors.tsx | 23 ++++++---- .../connectors_dropdown.test.tsx | 26 ----------- .../configure_cases/connectors_dropdown.tsx | 31 +------------ .../components/configure_cases/index.test.tsx | 3 +- .../components/configure_cases/index.tsx | 5 +++ .../configure_cases/translations.ts | 4 ++ .../components/connector_selector/form.tsx | 10 ++++- .../apps/cases/group2/configure.ts | 3 +- .../observability/cases/configure.ts | 3 +- .../security/ftr/cases/configure.ts | 3 +- 11 files changed, 69 insertions(+), 85 deletions(-) diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx index 0769e7a29cc59..1dc3346a72da6 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors.test.tsx @@ -21,12 +21,20 @@ import { import { ConnectorsDropdown } from './connectors_dropdown'; import { connectors, actionTypes } from './__mock__'; import { ConnectorTypes } from '../../../common/types/domain'; +import userEvent from '@testing-library/user-event'; +import { useApplicationCapabilities } from '../../common/lib/kibana'; + +const useApplicationCapabilitiesMock = useApplicationCapabilities as jest.Mocked< + typeof useApplicationCapabilities +>; +jest.mock('../../common/lib/kibana'); describe('Connectors', () => { let wrapper: ReactWrapper; let appMockRender: AppMockRenderer; const onChangeConnector = jest.fn(); const handleShowEditFlyout = jest.fn(); + const onAddNewConnector = jest.fn(); const props: Props = { actionTypes, @@ -38,6 +46,7 @@ describe('Connectors', () => { onChangeConnector, selectedConnector: { id: 'none', type: ConnectorTypes.none }, updateConnectorDisabled: false, + onAddNewConnector, }; beforeAll(() => { @@ -104,12 +113,16 @@ describe('Connectors', () => { }); it('shows the add connector button', () => { - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.update(); + appMockRender.render(); - expect( - wrapper.find('button[data-test-subj="dropdown-connector-add-connector"]').exists() - ).toBeTruthy(); + expect(screen.getByTestId('add-new-connector')).toBeInTheDocument(); + }); + + it('shows the add connector flyout when the button is clicked', async () => { + appMockRender.render(); + + await userEvent.click(await screen.findByTestId('add-new-connector')); + expect(onAddNewConnector).toHaveBeenCalled(); }); it('the text of the update button is shown correctly', () => { @@ -156,16 +169,14 @@ describe('Connectors', () => { }); it('shows the actions permission message if the user does not have read access to actions', async () => { - appMockRender.coreStart.application.capabilities = { - ...appMockRender.coreStart.application.capabilities, - actions: { save: false, show: false }, - }; + useApplicationCapabilitiesMock().actions = { crud: false, read: false }; + + appMockRender.render(); - const result = appMockRender.render(); expect( - result.getByTestId('configure-case-connector-permissions-error-msg') + await screen.findByTestId('configure-case-connector-permissions-error-msg') ).toBeInTheDocument(); - expect(result.queryByTestId('case-connectors-dropdown')).toBe(null); + expect(screen.queryByTestId('case-connectors-dropdown')).not.toBeInTheDocument(); }); it('shows the actions permission message if the user does not have access to case connector', async () => { @@ -177,4 +188,12 @@ describe('Connectors', () => { ).toBeInTheDocument(); expect(result.queryByTestId('case-connectors-dropdown')).toBe(null); }); + + it('it should hide the "Add Connector" button when the user lacks the capability to add a new connector', () => { + useApplicationCapabilitiesMock().actions = { crud: false, read: true }; + + appMockRender.render(); + + expect(screen.queryByTestId('add-new-connector')).not.toBeInTheDocument(); + }); }); diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx index b1ab16109c28f..3d742a202a0b7 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors.tsx @@ -13,10 +13,9 @@ import { EuiFlexItem, EuiLink, EuiText, + EuiButtonEmpty, } from '@elastic/eui'; -import { css } from '@emotion/react'; - import { ConnectorsDropdown } from './connectors_dropdown'; import * as i18n from './translations'; @@ -39,6 +38,7 @@ export interface Props { onChangeConnector: (id: string) => void; selectedConnector: { id: string; type: ConnectorTypes }; updateConnectorDisabled: boolean; + onAddNewConnector: () => void; } const ConnectorsComponent: React.FC = ({ actionTypes, @@ -50,8 +50,10 @@ const ConnectorsComponent: React.FC = ({ onChangeConnector, selectedConnector, updateConnectorDisabled, + onAddNewConnector, }) => { const { actions } = useApplicationCapabilities(); + const canSave = actions.crud; const connector = useMemo( () => connectors.find((c) => c.id === selectedConnector.id), [connectors, selectedConnector.id] @@ -95,13 +97,19 @@ const ConnectorsComponent: React.FC = ({ > + {i18n.ADD_CONNECTOR} + + ) : null + } > @@ -113,7 +121,6 @@ const ConnectorsComponent: React.FC = ({ isLoading={isLoading} onChange={onChangeConnector} data-test-subj="case-connectors-dropdown" - appendAddConnectorButton={true} /> ) : ( diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.test.tsx index faabf3f42c70f..30c45453ebc17 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.test.tsx @@ -15,13 +15,6 @@ import type { Props } from './connectors_dropdown'; import { ConnectorsDropdown } from './connectors_dropdown'; import { TestProviders } from '../../common/mock'; import { connectors } from './__mock__'; -import userEvent from '@testing-library/user-event'; -import { useApplicationCapabilities } from '../../common/lib/kibana'; - -const useApplicationCapabilitiesMock = useApplicationCapabilities as jest.Mocked< - typeof useApplicationCapabilities ->; -jest.mock('../../common/lib/kibana'); describe('ConnectorsDropdown', () => { let wrapper: ReactWrapper; @@ -388,23 +381,4 @@ describe('ConnectorsDropdown', () => { ); expect(tooltips[0]).toBeInTheDocument(); }); - - test('it should hide the "Add New Connector" button when the user lacks the capability to add a new connector', async () => { - const selectedConnector = 'none'; - useApplicationCapabilitiesMock().actions = { crud: false, read: true }; - render( - {}} - />, - { wrapper: ({ children }) => {children} } - ); - - await userEvent.click(screen.getByTestId('dropdown-connectors')); - expect(screen.queryByTestId('dropdown-connector-add-connector')).not.toBeInTheDocument(); - }); }); diff --git a/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx index 71df212399bc2..04fa9e3ef3647 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/connectors_dropdown.tsx @@ -6,7 +6,6 @@ */ import React, { Suspense, useMemo } from 'react'; -import type { EuiThemeComputed } from '@elastic/eui'; import { EuiFlexGroup, EuiFlexItem, @@ -20,7 +19,7 @@ import { css } from '@emotion/react'; import type { ActionConnector } from '../../containers/configure/types'; import * as i18n from './translations'; -import { useApplicationCapabilities, useKibana } from '../../common/lib/kibana'; +import { useKibana } from '../../common/lib/kibana'; import { getConnectorIcon, isDeprecatedConnector } from '../utils'; export interface Props { @@ -29,7 +28,6 @@ export interface Props { isLoading: boolean; onChange: (id: string) => void; selectedConnector: string; - appendAddConnectorButton?: boolean; } const suspendedComponentWithProps = (ComponentToSuspend: React.ComponentType) => { @@ -65,37 +63,14 @@ const noConnectorOption = { 'data-test-subj': 'dropdown-connector-no-connector', }; -const addNewConnector = (euiTheme: EuiThemeComputed<{}>) => ({ - value: 'add-connector', - inputDisplay: ( - - {i18n.ADD_NEW_CONNECTOR} - - ), - 'data-test-subj': 'dropdown-connector-add-connector', -}); - const ConnectorsDropdownComponent: React.FC = ({ connectors, disabled, isLoading, onChange, selectedConnector, - appendAddConnectorButton = false, }) => { const { triggersActionsUi } = useKibana().services; - const { actions } = useApplicationCapabilities(); - const canSave = actions.crud; const { euiTheme } = useEuiTheme(); const connectorsAsOptions = useMemo(() => { const connectorsFormatted = connectors.reduce( @@ -152,10 +127,6 @@ const ConnectorsDropdownComponent: React.FC = ({ [noConnectorOption] ); - if (appendAddConnectorButton && canSave) { - return [...connectorsFormatted, addNewConnector(euiTheme)]; - } - return connectorsFormatted; // eslint-disable-next-line react-hooks/exhaustive-deps }, [connectors]); diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx index 6c65eae41c78b..e058d982e7367 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.test.tsx @@ -565,8 +565,7 @@ describe('ConfigureCases', () => { wrappingComponent: TestProviders as ComponentType>, }); - wrapper.find('button[data-test-subj="dropdown-connectors"]').simulate('click'); - wrapper.find('button[data-test-subj="dropdown-connector-add-connector"]').simulate('click'); + wrapper.find('button[data-test-subj="add-new-connector"]').simulate('click'); await waitFor(() => { wrapper.update(); diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.tsx index 61f99a46a0b08..641482ceca4fe 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.tsx @@ -215,6 +215,10 @@ export const ConfigureCases: React.FC = React.memo(() => { [] ); + const onAddNewConnector = useCallback(() => { + setFlyOutVisibility({ type: 'addConnector', visible: true }); + }, []); + const onChangeConnector = useCallback( (id: string) => { if (id === 'add-connector') { @@ -577,6 +581,7 @@ export const ConfigureCases: React.FC = React.memo(() => { onChangeConnector={onChangeConnector} selectedConnector={connector} updateConnectorDisabled={updateConnectorDisabled || !permissions.update} + onAddNewConnector={onAddNewConnector} />
diff --git a/x-pack/plugins/cases/public/components/configure_cases/translations.ts b/x-pack/plugins/cases/public/components/configure_cases/translations.ts index 7a2e0e84b0306..4fe462655dcc1 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/translations.ts +++ b/x-pack/plugins/cases/public/components/configure_cases/translations.ts @@ -35,6 +35,10 @@ export const ADD_NEW_CONNECTOR = i18n.translate('xpack.cases.configureCases.addN defaultMessage: 'Add new connector', }); +export const ADD_CONNECTOR = i18n.translate('xpack.cases.configureCases.addConnector', { + defaultMessage: 'Add connector', +}); + export const CASE_CLOSURE_OPTIONS_TITLE = i18n.translate( 'xpack.cases.configureCases.caseClosureOptionsTitle', { diff --git a/x-pack/plugins/cases/public/components/connector_selector/form.tsx b/x-pack/plugins/cases/public/components/connector_selector/form.tsx index fa991bc5b9871..2419aa60b148f 100644 --- a/x-pack/plugins/cases/public/components/connector_selector/form.tsx +++ b/x-pack/plugins/cases/public/components/connector_selector/form.tsx @@ -12,9 +12,17 @@ import { css } from '@emotion/react'; import type { FieldHook } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; import { getFieldValidityAndErrorMessage } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; +import { i18n } from '@kbn/i18n'; import type { ActionConnector } from '../../../common/types/domain'; import { ConnectorsDropdown } from '../configure_cases/connectors_dropdown'; +const ADD_CONNECTOR_HELPER_TEXT = i18n.translate( + 'xpack.cases.connectorSelector.addConnectorHelperText', + { + defaultMessage: 'Go to Cases > Settings to add an external incident management system', + } +); + interface ConnectorSelectorProps { connectors: ActionConnector[]; dataTestSubj: string; @@ -60,7 +68,7 @@ export const ConnectorSelector = ({ describedByIds={idAria ? [idAria] : undefined} error={errorMessage} fullWidth - helpText={field.helpText} + helpText={ADD_CONNECTOR_HELPER_TEXT} isInvalid={isInvalid} label={field.label} labelAppend={field.labelAppend} diff --git a/x-pack/test/functional_with_es_ssl/apps/cases/group2/configure.ts b/x-pack/test/functional_with_es_ssl/apps/cases/group2/configure.ts index ee013b882c487..8b0ade86ac580 100644 --- a/x-pack/test/functional_with_es_ssl/apps/cases/group2/configure.ts +++ b/x-pack/test/functional_with_es_ssl/apps/cases/group2/configure.ts @@ -52,8 +52,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { }); it('opens and closes the connectors flyout correctly', async () => { - await common.clickAndValidate('dropdown-connectors', 'dropdown-connector-add-connector'); - await common.clickAndValidate('dropdown-connector-add-connector', 'euiFlyoutCloseButton'); + await common.clickAndValidate('add-new-connector', 'euiFlyoutCloseButton'); await testSubjects.click('euiFlyoutCloseButton'); expect(await testSubjects.exists('euiFlyoutCloseButton')).to.be(false); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/cases/configure.ts b/x-pack/test_serverless/functional/test_suites/observability/cases/configure.ts index 1909408d05332..1887e76a65e62 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/cases/configure.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/cases/configure.ts @@ -66,8 +66,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { }); it('opens and closes the connectors flyout correctly', async () => { - await common.clickAndValidate('dropdown-connectors', 'dropdown-connector-add-connector'); - await common.clickAndValidate('dropdown-connector-add-connector', 'euiFlyoutCloseButton'); + await common.clickAndValidate('add-new-connector', 'euiFlyoutCloseButton'); await testSubjects.click('euiFlyoutCloseButton'); expect(await testSubjects.exists('euiFlyoutCloseButton')).to.be(false); }); diff --git a/x-pack/test_serverless/functional/test_suites/security/ftr/cases/configure.ts b/x-pack/test_serverless/functional/test_suites/security/ftr/cases/configure.ts index e185b4c470548..cc5486a354015 100644 --- a/x-pack/test_serverless/functional/test_suites/security/ftr/cases/configure.ts +++ b/x-pack/test_serverless/functional/test_suites/security/ftr/cases/configure.ts @@ -66,8 +66,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { }); it('opens and closes the connectors flyout correctly', async () => { - await common.clickAndValidate('dropdown-connectors', 'dropdown-connector-add-connector'); - await common.clickAndValidate('dropdown-connector-add-connector', 'euiFlyoutCloseButton'); + await common.clickAndValidate('add-new-connector', 'euiFlyoutCloseButton'); await testSubjects.click('euiFlyoutCloseButton'); expect(await testSubjects.exists('euiFlyoutCloseButton')).to.be(false); }); From 8a96f69250ffe674c3d2fff340db39f7f8b99652 Mon Sep 17 00:00:00 2001 From: Julia Rechkunova Date: Mon, 28 Oct 2024 12:45:39 +0100 Subject: [PATCH 063/135] [Discover][ES|QL] Rename Documents tab to Results (#197833) ## Summary This PR renames Documents label to Results for ES|QL mode. Screenshot 2024-10-25 at 15 44 32 Screenshot 2024-10-25 at 15 52 55 ### 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 --- .../total_documents/total_documents.tsx | 44 ++++++++++++++----- .../view_mode_toggle.test.tsx | 2 + .../view_mode_toggle/view_mode_toggle.tsx | 9 +++- .../components/saved_search_grid.tsx | 4 +- .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 7 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/plugins/discover/public/application/main/components/total_documents/total_documents.tsx b/src/plugins/discover/public/application/main/components/total_documents/total_documents.tsx index f9a3f04cc1c56..5644efc8a9bbd 100644 --- a/src/plugins/discover/public/application/main/components/total_documents/total_documents.tsx +++ b/src/plugins/discover/public/application/main/components/total_documents/total_documents.tsx @@ -11,7 +11,19 @@ import React from 'react'; import { FormattedMessage, FormattedNumber } from '@kbn/i18n-react'; import { EuiText } from '@elastic/eui'; -export const TotalDocuments = ({ totalHitCount }: { totalHitCount: number }) => { +export const TotalDocuments = ({ + totalHitCount, + isEsqlMode, +}: { + totalHitCount: number; + isEsqlMode?: boolean; +}) => { + const totalDocuments = ( + + + + ); + return ( style={{ paddingRight: 2 }} data-test-subj="savedSearchTotalDocuments" > - - - - ), - }} - /> + {isEsqlMode ? ( + + ) : ( + + )} ); }; diff --git a/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.test.tsx b/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.test.tsx index f045e78de5ddf..7d88f9ad1fef4 100644 --- a/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.test.tsx +++ b/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.test.tsx @@ -94,6 +94,7 @@ describe('Document view mode toggle component', () => { expect(findTestSubject(component, 'dscViewModeDocumentButton').exists()).toBe(true); expect(findTestSubject(component, 'dscViewModePatternAnalysisButton').exists()).toBe(true); expect(findTestSubject(component, 'dscViewModeFieldStatsButton').exists()).toBe(true); + expect(findTestSubject(component, 'dscViewModeDocumentButton').text()).toBe('Documents (10)'); }); it('should not render if SHOW_FIELD_STATISTICS is false', async () => { @@ -114,6 +115,7 @@ describe('Document view mode toggle component', () => { expect(findTestSubject(component, 'dscViewModeDocumentButton').exists()).toBe(true); expect(findTestSubject(component, 'dscViewModePatternAnalysisButton').exists()).toBe(false); expect(findTestSubject(component, 'dscViewModeFieldStatsButton').exists()).toBe(true); + expect(findTestSubject(component, 'dscViewModeDocumentButton').text()).toBe('Results (10)'); }); it('should set the view mode to VIEW_MODE.DOCUMENT_LEVEL when dscViewModeDocumentButton is clicked', async () => { diff --git a/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.tsx b/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.tsx index 10a92dc8fefa9..22c4aaa11b43a 100644 --- a/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.tsx +++ b/src/plugins/discover/public/components/view_mode_toggle/view_mode_toggle.tsx @@ -130,7 +130,14 @@ export const DocumentViewModeToggle = ({ onClick={() => setDiscoverViewMode(VIEW_MODE.DOCUMENT_LEVEL)} data-test-subj="dscViewModeDocumentButton" > - + {isEsqlMode ? ( + + ) : ( + + )} diff --git a/src/plugins/discover/public/embeddable/components/saved_search_grid.tsx b/src/plugins/discover/public/embeddable/components/saved_search_grid.tsx index e45ad009db898..f6c77dc6cddf5 100644 --- a/src/plugins/discover/public/embeddable/components/saved_search_grid.tsx +++ b/src/plugins/discover/public/embeddable/components/saved_search_grid.tsx @@ -85,10 +85,10 @@ export function DiscoverGridEmbeddable(props: DiscoverGridEmbeddableProps) { getRenderCustomToolbarWithElements({ leftSide: typeof props.totalHitCount === 'number' ? ( - + ) : undefined, }), - [props.totalHitCount] + [props.totalHitCount, props.isPlainRecord] ); const getCellRenderersAccessor = useProfileAccessor('getCellRenderers'); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index accc5951d75e0..a0cfae596fc96 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -2423,7 +2423,6 @@ "discover.docTable.tableRow.toggleRowDetailsButtonAriaLabel": "Afficher/Masquer les détails de la ligne", "discover.docTable.tableRow.viewSingleDocumentLinkText": "Afficher un seul document", "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "Afficher les documents alentour", - "discover.docTable.totalDocuments": "{totalDocuments} documents", "discover.documentsAriaLabel": "Documents", "discover.docViews.table.scoreSortWarningTooltip": "Filtrez sur _score pour pouvoir récupérer les valeurs correspondantes.", "discover.dropZoneTableLabel": "Abandonner la zone pour ajouter un champ en tant que colonne dans la table", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 9d7c444494b6f..6a81bee15918b 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -2422,7 +2422,6 @@ "discover.docTable.tableRow.toggleRowDetailsButtonAriaLabel": "行の詳細を切り替える", "discover.docTable.tableRow.viewSingleDocumentLinkText": "単一のドキュメントを表示", "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "周りのドキュメントを表示", - "discover.docTable.totalDocuments": "{totalDocuments}ドキュメント", "discover.documentsAriaLabel": "ドキュメント", "discover.docViews.table.scoreSortWarningTooltip": "_scoreの値を取得するには、並べ替える必要があります。", "discover.dropZoneTableLabel": "フィールドを列として表に追加するには、ゾーンをドロップします", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 7c6e7b3e81487..95c94e1f0b17f 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -2424,7 +2424,6 @@ "discover.docTable.tableRow.toggleRowDetailsButtonAriaLabel": "切换行详细信息", "discover.docTable.tableRow.viewSingleDocumentLinkText": "查看单个文档", "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "查看周围文档", - "discover.docTable.totalDocuments": "{totalDocuments} 个文档", "discover.documentsAriaLabel": "文档", "discover.docViews.table.scoreSortWarningTooltip": "要检索 _score 的值,必须按其筛选。", "discover.dropZoneTableLabel": "放置区域以将字段作为列添加到表中", From 7865045f413533c9685c59df4ae02f6a8875a918 Mon Sep 17 00:00:00 2001 From: Konrad Szwarc Date: Mon, 28 Oct 2024 13:18:28 +0100 Subject: [PATCH 064/135] [EDR Workflows] Enable Blocklist CY in MKI (#197952) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since adding this test file was tied to changes in Kibana, we initially couldn’t enable it in the MKI. The MKI relies on a Kibana image built from the main branch, and at that time, the necessary changes for these tests to pass hadn’t yet been merged. Now that these updates are included in the main branch, the Kibana image used in MKI has the required changes, so we can proceed with enabling the tests. Manual MKI run - https://buildkite.com/elastic/kibana-serverless-security-solution-quality-gate-defend-workflows/builds/1545 --- .../public/management/cypress/e2e/artifacts/blocklist.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/blocklist.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/blocklist.cy.ts index 32dad9b0bbc0d..f0d3eb96e4581 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/blocklist.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/blocklist.cy.ts @@ -41,7 +41,7 @@ const { describe( 'Blocklist', { - tags: ['@ess', '@serverless', '@skipInServerlessMKI'], // @skipInServerlessMKI until kibana is rebuilt after merge + tags: ['@ess', '@serverless'], }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; From 00f34d9b1cf264a21586b77e829340ccf1b960ff Mon Sep 17 00:00:00 2001 From: Vitalii Dmyterko <92328789+vitaliidm@users.noreply.github.com> Date: Mon, 28 Oct 2024 12:36:23 +0000 Subject: [PATCH 065/135] [Security Solution][Detection Engine] removes legacy alerting endpoints from Security Solution dev scripts (#197424) ## Summary - addresses https://github.com/elastic/kibana/issues/95842 --------- Co-authored-by: Ryland Herrick --- .../scripts/{get_alert_types.sh => find_alerting_rules.sh} | 7 ++++--- .../server/lib/detection_engine/scripts/find_rules.sh | 1 + .../{get_alert_instances.sh => get_alerting_rule_types.sh} | 6 +++--- 3 files changed, 8 insertions(+), 6 deletions(-) rename x-pack/plugins/security_solution/server/lib/detection_engine/scripts/{get_alert_types.sh => find_alerting_rules.sh} (59%) rename x-pack/plugins/security_solution/server/lib/detection_engine/scripts/{get_alert_instances.sh => get_alerting_rule_types.sh} (65%) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_types.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/find_alerting_rules.sh similarity index 59% rename from x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_types.sh rename to x-pack/plugins/security_solution/server/lib/detection_engine/scripts/find_alerting_rules.sh index 9b51c289ac2c3..c735dd333710c 100755 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_types.sh +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/find_alerting_rules.sh @@ -10,9 +10,10 @@ set -e ./check_env_variables.sh -# Example: ./get_alert_types.sh -# https://github.com/elastic/kibana/blob/main/x-pack/plugins/alerting/README.md#get-apialerttypes-list-alert-types +# Example: ./find_alerting_rules.sh +# https://www.elastic.co/docs/api/doc/kibana/v8/operation/operation-findrules +# Related: use ./find_rules.sh to retrieve Detection Engine (Security) rules curl -s -k \ -u ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD} \ - -X GET ${KIBANA_URL}${SPACE_URL}/api/alerts/list_alert_types \ + -X GET ${KIBANA_URL}${SPACE_URL}/api/alerting/rules/_find \ | jq . diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/find_rules.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/find_rules.sh index ef8244ad6e200..422f3e2bb0545 100755 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/find_rules.sh +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/find_rules.sh @@ -12,5 +12,6 @@ set -e # Example: ./find_rules.sh curl -s -k \ + -H 'elastic-api-version: 2023-10-31' \ -u ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD} \ -X GET ${KIBANA_URL}${SPACE_URL}/api/detection_engine/rules/_find | jq . diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_instances.sh b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alerting_rule_types.sh similarity index 65% rename from x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_instances.sh rename to x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alerting_rule_types.sh index f2ba9bb70a7c6..59c960d67ba4d 100755 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alert_instances.sh +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/scripts/get_alerting_rule_types.sh @@ -10,9 +10,9 @@ set -e ./check_env_variables.sh -# Example: ./get_alert_instances.sh -# https://github.com/elastic/kibana/blob/main/x-pack/plugins/alerting/README.md#get-apialert_find-find-alerts +# Example: ./get_rule_types.sh +# https://www.elastic.co/docs/api/doc/kibana/v8/operation/operation-getruletypes curl -s -k \ -u ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD} \ - -X GET ${KIBANA_URL}${SPACE_URL}/api/alerts/_find \ + -X GET ${KIBANA_URL}${SPACE_URL}/api/alerting/rule_types \ | jq . From 9dd4205639ed16f9086a7c5d70e077b6db21d73b Mon Sep 17 00:00:00 2001 From: Elena Shostak <165678770+elena-shostak@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:40:27 +0100 Subject: [PATCH 066/135] [CodeQL] Local run script (#194272) ## Summary This PR introduces a script that allows developers to run CodeQL analysis locally. It uses a Docker container with prebuilt CodeQL queries to facilitate easy setup and execution. The script has the following key steps: - Creating a CodeQL database from the source code. The database is essentially a representation of the codebase that CodeQL uses to analyze for potential issues. - Running the analysis on the created database, `javascript-security-and-quality` suit is used. ### Usage ``` bash scripts/codeql/quick_check.sh -s path/to/your-source-dir ``` For example ``` bash scripts/codeql/quick_check.sh -s ./x-pack/plugins/security_solution/public/common/components/ml/conditional_links ``` The `-s` option allows you to specify the path to the source code directory that you wish to analyze. ### Why custom Docker file? Checked the ability to use MSFT image for local run https://github.com/microsoft/codeql-container. Turned out it has several problems: 1. The published one has an error with [execute permissions](https://github.com/microsoft/codeql-container/issues/53). 2. Container has outdated nodejs version, so it didn't parse our syntax (like `??`) and failed. 3. The technique used in the repository to download the CodeQL binaries and precompile the queries is outdated in the sense that GitHub now offers pre-compiled queries you can just download. Follow this [comment](https://github.com/microsoft/codeql-container/issues/53#issuecomment-1875879512). Taking this into consideration I have created a lightweight docker image without extraneous dependencies for go/.net/java. ## Context and interdependencies issues There are issues sometimes when analyze run returns no results, particularly when analyzing a single folder. It might be due to the missing context for the data flow graph CodeQL generates or context for interdependencies. This is actually a trade off of running it locally for a subset of source directories. We need to explicitly state that in the documentation and advise to expand the scope of source code directories involved for local scan. Documentation for triaging issues will be updated separately. __Closes: https://github.com/elastic/kibana/issues/195740__ --- .gitignore | 3 +- scripts/codeql/codeql.dockerfile | 39 ++++++++++ scripts/codeql/quick_check.sh | 126 +++++++++++++++++++++++++++++++ 3 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 scripts/codeql/codeql.dockerfile create mode 100644 scripts/codeql/quick_check.sh diff --git a/.gitignore b/.gitignore index 7e06f1e23f863..9bda927a92b6a 100644 --- a/.gitignore +++ b/.gitignore @@ -157,4 +157,5 @@ x-pack/test/security_solution_playwright/playwright-report/ x-pack/test/security_solution_playwright/blob-report/ x-pack/test/security_solution_playwright/playwright/.cache/ x-pack/test/security_solution_playwright/.auth/ -x-pack/test/security_solution_playwright/.env \ No newline at end of file +x-pack/test/security_solution_playwright/.env +.codeql diff --git a/scripts/codeql/codeql.dockerfile b/scripts/codeql/codeql.dockerfile new file mode 100644 index 0000000000000..fce6b9c3fdd63 --- /dev/null +++ b/scripts/codeql/codeql.dockerfile @@ -0,0 +1,39 @@ +FROM ubuntu:latest + +ENV DEBIAN_FRONTEND=noninteractive + +ARG USERNAME=codeql +ARG CODEQL_VERSION="v2.19.0" +ENV CODEQL_HOME /usr/local/codeql-home + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + passwd \ + adduser \ + bash \ + curl \ + git \ + unzip \ + nodejs \ + jq + +RUN adduser --home ${CODEQL_HOME} ${USERNAME} + +RUN curl -Lk "https://github.com/github/codeql-action/releases/download/codeql-bundle-${CODEQL_VERSION}/codeql-bundle-linux64.tar.gz" -o codeql.tar.gz \ + && mkdir -p ${CODEQL_HOME} \ + && tar -xvzf codeql.tar.gz -C ${CODEQL_HOME} \ + && rm codeql.tar.gz + +RUN chmod +x ${CODEQL_HOME}/codeql/codeql + +RUN chown -R ${USERNAME}:${USERNAME} ${CODEQL_HOME} + +USER ${USERNAME} + +ENV PATH="${CODEQL_HOME}/codeql:${PATH}" + +RUN echo $PATH && codeql --version + +WORKDIR /workspace + +ENTRYPOINT ["/bin/bash", "-c"] diff --git a/scripts/codeql/quick_check.sh b/scripts/codeql/quick_check.sh new file mode 100644 index 0000000000000..15023bfb13bfa --- /dev/null +++ b/scripts/codeql/quick_check.sh @@ -0,0 +1,126 @@ +#!/bin/bash + +LANGUAGE="javascript" +CODEQL_DIR=".codeql" +DATABASE_PATH="$CODEQL_DIR/database" +QUERY_OUTPUT="$DATABASE_PATH/results.sarif" +OUTPUT_FORMAT="sarif-latest" +DOCKER_IMAGE="codeql-env" +BASE_DIR="$(cd "$(dirname "$0")"; pwd)" + +# Colors +bold=$(tput bold) +reset=$(tput sgr0) +red=$(tput setaf 1) +green=$(tput setaf 2) +blue=$(tput setaf 4) +yellow=$(tput setaf 3) + +while getopts ":s:r:" opt; do + case $opt in + s) SRC_DIR="$OPTARG" ;; + r) CODEQL_DIR="$OPTARG"; DATABASE_PATH="$CODEQL_DIR/database"; QUERY_OUTPUT="$DATABASE_PATH/results.sarif" ;; + \?) echo "Invalid option -$OPTARG" >&2; exit 1 ;; + :) echo "Option -$OPTARG requires an argument." >&2; exit 1 ;; + esac +done + +if [ -z "$SRC_DIR" ]; then + echo "Usage: $0 -s [-r ]" + exit 1 +fi + +mkdir -p "$CODEQL_DIR" + +# Check the architecture +ARCH=$(uname -m) +PLATFORM_FLAG="" + +# CodeQL CLI binary does not support arm64 architecture, setting the platform to linux/amd64 +if [[ "$ARCH" == "arm64" ]]; then + PLATFORM_FLAG="--platform linux/amd64" +fi + +if [[ "$(docker images -q $DOCKER_IMAGE 2> /dev/null)" == "" ]]; then + echo "Docker image $DOCKER_IMAGE not found. Building locally..." + docker build $PLATFORM_FLAG -t "$DOCKER_IMAGE" -f "$BASE_DIR/codeql.dockerfile" "$BASE_DIR" + if [ $? -ne 0 ]; then + echo "${red}Docker image build failed.${reset}" + exit 1 + fi +fi + +cleanup_database() { + echo "Deleting contents of $CODEQL_DIR." + rm -rf "$CODEQL_DIR"/* +} + +SRC_DIR="$(cd "$(dirname "$SRC_DIR")"; pwd)/$(basename "$SRC_DIR")" +CODEQL_DIR="$(cd "$(dirname "$CODEQL_DIR")"; pwd)/$(basename "$CODEQL_DIR")" +DATABASE_PATH="$(cd "$(dirname "$DATABASE_PATH")"; pwd)/$(basename "$DATABASE_PATH")" + +# Step 1: Run the Docker container to create a CodeQL database from the source code. +echo "Creating a CodeQL database from the source code: $SRC_DIR" +docker run $PLATFORM_FLAG --rm -v "$SRC_DIR":/workspace/source-code \ + -v "${DATABASE_PATH}":/workspace/shared $DOCKER_IMAGE \ + "codeql database create /workspace/shared/codeql-db --language=javascript --source-root=/workspace/source-code --overwrite" + +if [ $? -ne 0 ]; then + echo "CodeQL database creation failed." + cleanup_database + exit 1 +fi + +echo "Analyzing a CodeQL database: $DATABASE_PATH" +# Step 2: Run the Docker container to analyze the CodeQL database. +docker run $PLATFORM_FLAG --rm -v "${DATABASE_PATH}":/workspace/shared $DOCKER_IMAGE \ + "codeql database analyze --format=${OUTPUT_FORMAT} --output=/workspace/shared/results.sarif /workspace/shared/codeql-db javascript-security-and-quality.qls" + +if [ $? -ne 0 ]; then + echo "CodeQL database analysis failed." + cleanup_database + exit 1 +fi + +# Step 3: Print summary of SARIF results +echo "Analysis complete. Results saved to $QUERY_OUTPUT" +if command -v jq &> /dev/null; then + vulnerabilities=$(jq -r '.runs[] | select(.results | length > 0)' "$QUERY_OUTPUT") + + if [[ -z "$vulnerabilities" ]]; then + echo "${blue}${bold}No vulnerabilities found in the SARIF results.${reset}" + else + echo "${yellow}${bold}Summary of SARIF results:${reset}" + jq -r ' + .runs[] | + .results[] as $result | + .tool.driver.rules[] as $rule | + select($rule.id == $result.ruleId) | + "Rule: \($result.ruleId)\nMessage: \($result.message.text)\nFile: \($result.locations[].physicalLocation.artifactLocation.uri)\nLine: \($result.locations[].physicalLocation.region.startLine)\nSecurity Severity: \($rule.properties."security-severity" // "N/A")\n"' "$QUERY_OUTPUT" | + while IFS= read -r line; do + case "$line" in + Rule:*) + echo "${red}${bold}$line${reset}" + ;; + Message:*) + echo "${green}$line${reset}" + ;; + File:*) + echo "${blue}$line${reset}" + ;; + Line:*) + echo "${yellow}$line${reset}" + ;; + Security\ Severity:*) + echo "${yellow}$line${reset}" + ;; + *) + echo "$line" + ;; + esac + done + fi +else + echo "${red}${bold}Please install jq to display a summary of the SARIF results.${reset}" + echo "${bold}You can view the full results in the SARIF file using a SARIF viewer.${reset}" +fi From 60562f37dd2257911030cb4716c63f2048e2ce72 Mon Sep 17 00:00:00 2001 From: Kevin Delemme Date: Mon, 28 Oct 2024 09:01:50 -0400 Subject: [PATCH 067/135] chore(slo): remove tests migrated to agnostic framework (#197711) Resolves https://github.com/elastic/kibana/issues/183397 ## Summary This PR is a follow up of https://github.com/elastic/kibana/pull/195927, that removes the old and migrated tests to the agnostic framework. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Dzmitry Lemechko --- .buildkite/ftr_oblt_stateful_configs.yml | 1 - .../test/api_integration/apis/slos/config.ts | 29 - .../api_integration/apis/slos/create_slo.ts | 488 ----------- .../api_integration/apis/slos/delete_slo.ts | 141 ---- .../apis/slos/fetch_historical_summary.ts | 134 --- .../test/api_integration/apis/slos/get_slo.ts | 492 ----------- .../test/api_integration/apis/slos/index.ts | 19 - .../api_integration/apis/slos/reset_slo.ts | 93 --- .../api_integration/apis/slos/update_slo.ts | 764 ------------------ .../test_suites/observability/index.ts | 1 - .../observability/slos/create_slo.ts | 371 --------- .../observability/slos/delete_slo.ts | 175 ---- .../slos/fetch_historical_summary.ts | 146 ---- .../test_suites/observability/slos/index.ts | 15 - x-pack/test_serverless/tsconfig.json | 1 - 15 files changed, 2870 deletions(-) delete mode 100644 x-pack/test/api_integration/apis/slos/config.ts delete mode 100644 x-pack/test/api_integration/apis/slos/create_slo.ts delete mode 100644 x-pack/test/api_integration/apis/slos/delete_slo.ts delete mode 100644 x-pack/test/api_integration/apis/slos/fetch_historical_summary.ts delete mode 100644 x-pack/test/api_integration/apis/slos/get_slo.ts delete mode 100644 x-pack/test/api_integration/apis/slos/index.ts delete mode 100644 x-pack/test/api_integration/apis/slos/reset_slo.ts delete mode 100644 x-pack/test/api_integration/apis/slos/update_slo.ts delete mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/slos/create_slo.ts delete mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/slos/delete_slo.ts delete mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/slos/fetch_historical_summary.ts delete mode 100644 x-pack/test_serverless/api_integration/test_suites/observability/slos/index.ts diff --git a/.buildkite/ftr_oblt_stateful_configs.yml b/.buildkite/ftr_oblt_stateful_configs.yml index 6f0cb38be3a62..7655ce6de38cf 100644 --- a/.buildkite/ftr_oblt_stateful_configs.yml +++ b/.buildkite/ftr_oblt_stateful_configs.yml @@ -30,7 +30,6 @@ enabled: - x-pack/test/api_integration/apis/metrics_ui/config.ts - x-pack/test/api_integration/apis/osquery/config.ts - x-pack/test/api_integration/apis/synthetics/config.ts - - x-pack/test/api_integration/apis/slos/config.ts - x-pack/test/api_integration/apis/uptime/config.ts - x-pack/test/api_integration/apis/entity_manager/config.ts - x-pack/test/apm_api_integration/basic/config.ts diff --git a/x-pack/test/api_integration/apis/slos/config.ts b/x-pack/test/api_integration/apis/slos/config.ts deleted file mode 100644 index c755e2a46882d..0000000000000 --- a/x-pack/test/api_integration/apis/slos/config.ts +++ /dev/null @@ -1,29 +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 { FtrConfigProviderContext } from '@kbn/test'; - -export default async function ({ readConfigFile }: FtrConfigProviderContext) { - const baseIntegrationTestsConfig = await readConfigFile(require.resolve('../../config.ts')); - - return { - ...baseIntegrationTestsConfig.getAll(), - testFiles: [require.resolve('.')], - // overriding default timeouts from packages/kbn-test/src/functional_test_runner/lib/config/schema.ts - // so we can easily adjust them for serverless where needed - timeouts: { - find: 10 * 1000, - try: 120 * 1000, - waitFor: 20 * 1000, - esRequestTimeout: 30 * 1000, - kibanaReportCompletion: 60 * 1000, - kibanaStabilize: 15 * 1000, - navigateStatusPageCheck: 250, - waitForExists: 2500, - }, - }; -} diff --git a/x-pack/test/api_integration/apis/slos/create_slo.ts b/x-pack/test/api_integration/apis/slos/create_slo.ts deleted file mode 100644 index 71ce8434a61f1..0000000000000 --- a/x-pack/test/api_integration/apis/slos/create_slo.ts +++ /dev/null @@ -1,488 +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 expect from '@kbn/expect'; -import { cleanup } from '@kbn/infra-forge'; -import type { CreateSLOInput } from '@kbn/slo-schema'; -import { SO_SLO_TYPE } from '@kbn/slo-plugin/server/saved_objects'; - -import { FtrProviderContext } from '../../ftr_provider_context'; -import { sloData } from './fixtures/create_slo'; -import { loadTestData } from './helper/load_test_data'; -import { SloEsClient } from './helper/es'; - -export default function ({ getService }: FtrProviderContext) { - describe('Create SLOs', function () { - this.tags('skipCloud'); - - const supertestAPI = getService('supertest'); - const kibanaServer = getService('kibanaServer'); - const esClient = getService('es'); - const slo = getService('slo'); - const retry = getService('retry'); - const logger = getService('log'); - const sloEsClient = new SloEsClient(esClient); - - let createSLOInput: CreateSLOInput; - - before(async () => { - await slo.createUser(); - await loadTestData(getService); - await slo.deleteAllSLOs(); - }); - - beforeEach(() => { - createSLOInput = sloData; - }); - - afterEach(async () => { - await slo.deleteAllSLOs(); - }); - - after(async () => { - await cleanup({ esClient, logger }); - await sloEsClient.deleteTestSourceData(); - }); - - it('creates a new slo and transforms', async () => { - const apiResponse = await slo.create(createSLOInput); - - expect(apiResponse.body).property('id'); - - const { id } = apiResponse.body; - - const savedObject = await kibanaServer.savedObjects.find({ - type: SO_SLO_TYPE, - }); - - expect(savedObject.saved_objects.length).eql(1); - - expect(savedObject.saved_objects[0].attributes).eql({ - budgetingMethod: 'occurrences', - updatedAt: savedObject.saved_objects[0].attributes.updatedAt, - createdAt: savedObject.saved_objects[0].attributes.createdAt, - description: 'Fixture for api integration tests', - enabled: true, - groupBy: 'tags', - id, - indicator: { - params: { - filter: 'system.network.name: eth1', - good: 'container.cpu.user.pct < 1', - index: 'kbn-data-forge*', - timestampField: '@timestamp', - total: 'container.cpu.user.pct: *', - }, - type: 'sli.kql.custom', - }, - name: 'Test SLO for api integration', - objective: { - target: 0.99, - }, - revision: 1, - settings: { - frequency: '1m', - syncDelay: '1m', - preventInitialBackfill: false, - }, - tags: ['test'], - timeWindow: { - duration: '7d', - type: 'rolling', - }, - version: 2, - }); - - const rollUpTransformResponse = await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // expect roll up transform to be created - expect(rollUpTransformResponse.body).eql({ - count: 1, - transforms: [ - { - id: `slo-${id}-1`, - authorization: { roles: ['slo_editor', 'editor'] }, - version: '10.0.0', - create_time: rollUpTransformResponse.body.transforms[0].create_time, - source: { - index: ['kbn-data-forge*'], - query: { - bool: { - filter: [ - { range: { '@timestamp': { gte: 'now-7d/d' } } }, - { - bool: { - should: [ - { - match: { - 'system.network.name': 'eth1', - }, - }, - ], - minimum_should_match: 1, - }, - }, - { - exists: { - field: 'tags', - }, - }, - ], - }, - }, - }, - dest: { - index: '.slo-observability.sli-v3.3', - pipeline: `.slo-observability.sli.pipeline-${id}-1`, - }, - frequency: '1m', - sync: { time: { field: '@timestamp', delay: '1m' } }, - pivot: { - group_by: { - 'slo.groupings.tags': { terms: { field: 'tags' } }, - '@timestamp': { date_histogram: { field: '@timestamp', fixed_interval: '1m' } }, - }, - aggregations: { - 'slo.numerator': { - filter: { - bool: { - should: [{ range: { 'container.cpu.user.pct': { lt: '1' } } }], - minimum_should_match: 1, - }, - }, - }, - 'slo.denominator': { - filter: { - bool: { - should: [{ exists: { field: 'container.cpu.user.pct' } }], - minimum_should_match: 1, - }, - }, - }, - }, - }, - description: `Rolled-up SLI data for SLO: Test SLO for api integration [id: ${id}, revision: 1]`, - settings: { deduce_mappings: false, unattended: true }, - _meta: { version: 3.3, managed: true, managed_by: 'observability' }, - }, - ], - }); - - const summaryTransform = await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // expect summary transform to be created - expect(summaryTransform.body).eql({ - count: 1, - transforms: [ - { - id: `slo-summary-${id}-1`, - authorization: { roles: ['slo_editor', 'editor'] }, - version: '10.0.0', - create_time: summaryTransform.body.transforms[0].create_time, - source: { - index: ['.slo-observability.sli-v3.3*'], - query: { - bool: { - filter: [ - { range: { '@timestamp': { gte: 'now-7d/m', lte: 'now/m' } } }, - { term: { 'slo.id': id } }, - { term: { 'slo.revision': 1 } }, - ], - }, - }, - }, - dest: { - index: '.slo-observability.summary-v3.3', - pipeline: `.slo-observability.summary.pipeline-${id}-1`, - }, - frequency: '1m', - sync: { time: { field: 'event.ingested', delay: '65s' } }, - pivot: { - group_by: { - 'slo.id': { terms: { field: 'slo.id' } }, - 'slo.instanceId': { terms: { field: 'slo.instanceId' } }, - 'slo.revision': { terms: { field: 'slo.revision' } }, - 'slo.groupings.tags': { - terms: { field: 'slo.groupings.tags' }, - }, - 'monitor.config_id': { - terms: { - field: 'monitor.config_id', - missing_bucket: true, - }, - }, - 'monitor.name': { - terms: { - field: 'monitor.name', - missing_bucket: true, - }, - }, - 'observer.geo.name': { - terms: { - field: 'observer.geo.name', - missing_bucket: true, - }, - }, - 'observer.name': { - terms: { - field: 'observer.name', - missing_bucket: true, - }, - }, - 'service.name': { terms: { field: 'service.name', missing_bucket: true } }, - 'service.environment': { - terms: { field: 'service.environment', missing_bucket: true }, - }, - 'transaction.name': { terms: { field: 'transaction.name', missing_bucket: true } }, - 'transaction.type': { terms: { field: 'transaction.type', missing_bucket: true } }, - }, - aggregations: { - goodEvents: { sum: { field: 'slo.numerator' } }, - totalEvents: { sum: { field: 'slo.denominator' } }, - sliValue: { - bucket_script: { - buckets_path: { goodEvents: 'goodEvents', totalEvents: 'totalEvents' }, - script: - 'if (params.totalEvents == 0) { return -1 } else if (params.goodEvents >= params.totalEvents) { return 1 } else { return params.goodEvents / params.totalEvents }', - }, - }, - errorBudgetInitial: { bucket_script: { buckets_path: {}, script: '1 - 0.99' } }, - errorBudgetConsumed: { - bucket_script: { - buckets_path: { - sliValue: 'sliValue', - errorBudgetInitial: 'errorBudgetInitial', - }, - script: - 'if (params.sliValue == -1) { return 0 } else { return (1 - params.sliValue) / params.errorBudgetInitial }', - }, - }, - errorBudgetRemaining: { - bucket_script: { - buckets_path: { errorBudgetConsumed: 'errorBudgetConsumed' }, - script: '1 - params.errorBudgetConsumed', - }, - }, - statusCode: { - bucket_script: { - buckets_path: { - sliValue: 'sliValue', - errorBudgetRemaining: 'errorBudgetRemaining', - }, - script: { - source: - 'if (params.sliValue == -1) { return 0 } else if (params.sliValue >= 0.99) { return 4 } else if (params.errorBudgetRemaining > 0) { return 2 } else { return 1 }', - }, - }, - }, - latestSliTimestamp: { max: { field: '@timestamp' } }, - fiveMinuteBurnRate: { - filter: { - range: { - '@timestamp': { - gte: 'now-480s/m', - lte: 'now-180s/m', - }, - }, - }, - aggs: { - goodEvents: { - sum: { - field: 'slo.numerator', - }, - }, - totalEvents: { - sum: { - field: 'slo.denominator', - }, - }, - }, - }, - oneHourBurnRate: { - filter: { - range: { - '@timestamp': { - gte: 'now-3780s/m', - lte: 'now-180s/m', - }, - }, - }, - aggs: { - goodEvents: { - sum: { - field: 'slo.numerator', - }, - }, - totalEvents: { - sum: { - field: 'slo.denominator', - }, - }, - }, - }, - oneDayBurnRate: { - filter: { - range: { - '@timestamp': { - gte: 'now-86580s/m', - lte: 'now-180s/m', - }, - }, - }, - aggs: { - goodEvents: { - sum: { - field: 'slo.numerator', - }, - }, - totalEvents: { - sum: { - field: 'slo.denominator', - }, - }, - }, - }, - }, - }, - description: `Summarise the rollup data of SLO: Test SLO for api integration [id: ${id}, revision: 1].`, - settings: { deduce_mappings: false, unattended: true }, - _meta: { version: 3.3, managed: true, managed_by: 'observability' }, - }, - ], - }); - }); - - it('creates instanceId for SLOs with multi groupBy', async () => { - createSLOInput.groupBy = ['system.network.name', 'event.dataset']; - - const apiResponse = await slo.create(createSLOInput); - - expect(apiResponse.body).property('id'); - - const { id } = apiResponse.body; - - await retry.tryForTime(300 * 1000, async () => { - const response = await esClient.search(getEsQuery(id)); - - // @ts-ignore - expect(response.aggregations?.last_doc.hits?.hits[0]._source.slo.instanceId).eql( - 'eth1,system.network' - ); - }); - }); - - it('creates instanceId for SLOs with single groupBy', async () => { - createSLOInput.groupBy = 'system.network.name'; - - const apiResponse = await slo.create(createSLOInput); - - expect(apiResponse.body).property('id'); - - const { id } = apiResponse.body; - - await retry.tryForTime(300 * 1000, async () => { - const response = await esClient.search(getEsQuery(id)); - - // @ts-ignore - expect(response.aggregations?.last_doc.hits?.hits[0]._source.slo.instanceId).eql('eth1'); - }); - }); - - it('creates instanceId for SLOs without groupBy ([])', async () => { - createSLOInput.groupBy = []; - - const apiResponse = await slo.create(createSLOInput); - - expect(apiResponse.body).property('id'); - - const { id } = apiResponse.body; - - await retry.tryForTime(300 * 1000, async () => { - const response = await esClient.search(getEsQuery(id)); - - // @ts-ignore - expect(response.aggregations?.last_doc.hits?.hits[0]._source.slo.instanceId).eql('*'); - }); - }); - - it('creates instanceId for SLOs without groupBy (["*"])', async () => { - createSLOInput.groupBy = ['*']; - - const apiResponse = await slo.create(createSLOInput); - - expect(apiResponse.body).property('id'); - - const { id } = apiResponse.body; - - await retry.tryForTime(300 * 1000, async () => { - const response = await esClient.search(getEsQuery(id)); - - // @ts-ignore - expect(response.aggregations?.last_doc.hits?.hits[0]._source.slo.instanceId).eql('*'); - }); - }); - - it('creates instanceId for SLOs without groupBy ("")', async () => { - createSLOInput.groupBy = ''; - - const apiResponse = await slo.create(createSLOInput); - - expect(apiResponse.body).property('id'); - - const { id } = apiResponse.body; - - await retry.tryForTime(300 * 1000, async () => { - const response = await esClient.search(getEsQuery(id)); - - // @ts-ignore - expect(response.aggregations?.last_doc.hits?.hits[0]._source.slo.instanceId).eql('*'); - }); - }); - }); -} - -const getEsQuery = (id: string) => ({ - index: '.slo-observability.sli-v3*', - size: 0, - query: { - bool: { - filter: [ - { - term: { - 'slo.id': id, - }, - }, - ], - }, - }, - aggs: { - last_doc: { - top_hits: { - sort: [ - { - '@timestamp': { - order: 'desc', - }, - }, - ], - _source: { - includes: ['slo.instanceId'], - }, - size: 1, - }, - }, - }, -}); diff --git a/x-pack/test/api_integration/apis/slos/delete_slo.ts b/x-pack/test/api_integration/apis/slos/delete_slo.ts deleted file mode 100644 index 979564f06be55..0000000000000 --- a/x-pack/test/api_integration/apis/slos/delete_slo.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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { cleanup } from '@kbn/infra-forge'; -import expect from '@kbn/expect'; -import type { CreateSLOInput } from '@kbn/slo-schema'; -import { SO_SLO_TYPE } from '@kbn/slo-plugin/server/saved_objects'; - -import { FtrProviderContext } from '../../ftr_provider_context'; -import { sloData } from './fixtures/create_slo'; -import { loadTestData } from './helper/load_test_data'; -import { SloEsClient } from './helper/es'; - -export default function ({ getService }: FtrProviderContext) { - describe('Delete SLOs', function () { - this.tags('skipCloud'); - - const supertestAPI = getService('supertest'); - const kibanaServer = getService('kibanaServer'); - const esClient = getService('es'); - const logger = getService('log'); - const slo = getService('slo'); - const retry = getService('retry'); - const sloEsClient = new SloEsClient(esClient); - - let createSLOInput: CreateSLOInput; - - before(async () => { - await slo.createUser(); - await slo.deleteAllSLOs(); - await sloEsClient.deleteTestSourceData(); - await loadTestData(getService); - }); - - beforeEach(() => { - createSLOInput = sloData; - }); - - afterEach(async () => { - await slo.deleteAllSLOs(); - }); - - after(async () => { - await cleanup({ esClient, logger }); - await sloEsClient.deleteTestSourceData(); - }); - - it('deletes new slo saved object and transforms', async () => { - const response = await slo.create(createSLOInput); - - expect(response.body).property('id'); - - const { id } = response.body; - - await retry.tryForTime(10000, async () => { - const savedObject = await kibanaServer.savedObjects.find({ - type: SO_SLO_TYPE, - }); - - expect(savedObject.saved_objects.length).eql(1); - - expect(savedObject.saved_objects[0].attributes.id).eql(id); - }); - - await retry.tryForTime(300 * 1000, async () => { - // expect summary and rollup data to exist - const sloSummaryResponse = await sloEsClient.getSLOSummaryDataById(id); - const sloRollupResponse = await sloEsClient.getSLORollupDataById(id); - - expect(sloSummaryResponse.hits.hits.length > 0).eql(true); - expect(sloRollupResponse.hits.hits.length > 0).eql(true); - - const rollUpTransformResponse = await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // expect roll up transform to be created - expect(rollUpTransformResponse.body.transforms[0].id).eql(`slo-${id}-1`); - - const summaryTransform = await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // expect summary transform to be created - expect(summaryTransform.body.transforms[0].id).eql(`slo-summary-${id}-1`); - - await slo.delete(id); - }); - - // await retry.tryForTime(150 * 1000, async () => { - const savedObjectAfterDelete = await kibanaServer.savedObjects.find({ - type: SO_SLO_TYPE, - }); - - // SO should now be deleted - expect(savedObjectAfterDelete.saved_objects.length).eql(0); - - // roll up transform should be deleted - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - // summary transform should be deleted - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - // expect summary and rollup documents to be deleted - await retry.waitForWithTimeout('SLO summary data is deleted', 60 * 1000, async () => { - const sloSummaryResponseAfterDeletion = await sloEsClient.getSLOSummaryDataById(id); - if (sloSummaryResponseAfterDeletion.hits.hits.length > 0) { - throw new Error('SLO summary data not deleted yet'); - } - return true; - }); - - await retry.waitForWithTimeout('SLO rollup data is deleted', 60 * 1000, async () => { - const sloRollupResponseAfterDeletion = await sloEsClient.getSLORollupDataById(id); - if (sloRollupResponseAfterDeletion.hits.hits.length > 1) { - throw new Error('SLO rollup data not deleted yet'); - } - return true; - }); - }); - }); -} diff --git a/x-pack/test/api_integration/apis/slos/fetch_historical_summary.ts b/x-pack/test/api_integration/apis/slos/fetch_historical_summary.ts deleted file mode 100644 index 96f8e21c8c593..0000000000000 --- a/x-pack/test/api_integration/apis/slos/fetch_historical_summary.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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import expect from '@kbn/expect'; -import { - SLO_DESTINATION_INDEX_NAME, - SLO_DESTINATION_INDEX_PATTERN, -} from '@kbn/slo-plugin/common/constants'; -import { ALL_VALUE } from '@kbn/slo-schema'; -import moment from 'moment'; -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default function ({ getService }: FtrProviderContext) { - const esClient = getService('es'); - const esDeleteAllIndices = getService('esDeleteAllIndices'); - const sloApi = getService('slo'); - - const SLO_ID = 'slo-fake-1'; - - describe('fetch historical summary', () => { - before(async () => { - await sloApi.createUser(); - const now = moment().startOf('minute'); - const curr = now.clone().subtract(30, 'days'); - const end = now.clone().add(5, 'minutes'); - - const batchOperations = []; - while (curr.isSameOrBefore(end)) { - batchOperations.push([ - { index: { _index: SLO_DESTINATION_INDEX_NAME } }, - { - '@timestamp': curr.toISOString(), - slo: { - id: SLO_ID, - revision: 1, - instanceId: ALL_VALUE, - numerator: 90, - denominator: 100, - isGoodSlice: 1, - groupings: {}, - }, - }, - ]); - curr.add(1, 'minute'); - } - - await esClient.bulk({ - index: SLO_DESTINATION_INDEX_NAME, - operations: batchOperations.flat(), - refresh: 'wait_for', - }); - - await esClient.indices.refresh({ index: SLO_DESTINATION_INDEX_NAME }); - }); - - after(async () => { - await esDeleteAllIndices(SLO_DESTINATION_INDEX_PATTERN); - }); - - it('computes the historical summary for a rolling occurrences SLO', async () => { - const response = await sloApi.fetchHistoricalSummary({ - list: [ - { - sloId: SLO_ID, - instanceId: ALL_VALUE, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.9, - }, - groupBy: ALL_VALUE, - revision: 1, - }, - ], - }); - expect(response[0].sloId).to.eql(SLO_ID); - expect(response[0].instanceId).to.eql(ALL_VALUE); - const numberOfBuckets = response[0].data.length; - expect(numberOfBuckets).to.be.within(168, 170); // 7 days * 24 hours/day * 1 bucket/hour + 2 extra bucket due to histogram agg rounding - const last = response[0].data.pop(); - expect(last?.errorBudget).to.eql({ - consumed: 1, - initial: 0.1, - isEstimated: false, - remaining: 0, - }); - expect(last?.sliValue).to.eql(0.9); - expect(last?.status).to.eql('HEALTHY'); - }); - - it('computes the historical summary for a rolling timeslices SLO', async () => { - const response = await sloApi.fetchHistoricalSummary({ - list: [ - { - sloId: SLO_ID, - instanceId: ALL_VALUE, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'timeslices', - objective: { - target: 0.9, - timesliceTarget: 0.8, - timesliceWindow: '1m', - }, - groupBy: ALL_VALUE, - revision: 1, - }, - ], - }); - expect(response[0].sloId).to.eql(SLO_ID); - expect(response[0].instanceId).to.eql(ALL_VALUE); - const numberOfBuckets = response[0].data.length; - expect(numberOfBuckets).to.be.within(168, 170); // 7 days * 24 hours/day * 1 bucket/hour + 2 extra bucket due to histogram agg rounding - const last = response[0].data.pop(); - expect(last?.errorBudget).to.eql({ - consumed: 0, - initial: 0.1, - isEstimated: false, - remaining: 1, - }); - expect(last?.sliValue).to.eql(1); - expect(last?.status).to.eql('HEALTHY'); - }); - }); -} diff --git a/x-pack/test/api_integration/apis/slos/get_slo.ts b/x-pack/test/api_integration/apis/slos/get_slo.ts deleted file mode 100644 index 815409853c7d6..0000000000000 --- a/x-pack/test/api_integration/apis/slos/get_slo.ts +++ /dev/null @@ -1,492 +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 { cleanup } from '@kbn/infra-forge'; -import expect from 'expect'; -import type { CreateSLOInput } from '@kbn/slo-schema'; - -import { FtrProviderContext } from '../../ftr_provider_context'; -import { loadTestData } from './helper/load_test_data'; -import { SloEsClient } from './helper/es'; -import { sloData } from './fixtures/create_slo'; - -export const expectSummary = (summary: Record) => { - expect(summary).toEqual({ - sliValue: expect.any(Number), - errorBudget: { - initial: expect.any(Number), - consumed: expect.any(Number), - remaining: expect.any(Number), - isEstimated: expect.any(Boolean), - }, - status: expect.any(String), - fiveMinuteBurnRate: expect.any(Number), - oneDayBurnRate: expect.any(Number), - oneHourBurnRate: expect.any(Number), - }); -}; - -export default function ({ getService }: FtrProviderContext) { - describe('GetSLOs', function () { - this.tags('skipCloud'); - - const supertestAPI = getService('supertest'); - const esClient = getService('es'); - const logger = getService('log'); - const retry = getService('retry'); - const slo = getService('slo'); - // const transform = getService('transform'); - const sloEsClient = new SloEsClient(esClient); - - // const onFailure = async () => { - // const allTransforms = await transform.api.getTransformList(); - // for (const tf of allTransforms.transforms) { - // await transform.api.scheduleTransform(tf.id); - // } - // }; - - let createSLOInput: CreateSLOInput; - - const createSLO = async (requestOverrides?: Record) => { - return await slo.create({ - ...createSLOInput, - ...requestOverrides, - }); - }; - - before(async () => { - await slo.createUser(); - await slo.deleteAllSLOs(); - await sloEsClient.deleteTestSourceData(); - await loadTestData(getService); - }); - - beforeEach(async () => { - createSLOInput = sloData; - }); - - afterEach(async () => { - await retry.tryForTime(60 * 1000, async () => { - await slo.deleteAllSLOs(); - }); - }); - - after(async () => { - await cleanup({ esClient, logger }); - await sloEsClient.deleteTestSourceData(); - }); - - it('gets slo by id and calculates SLI - occurrences rolling', async () => { - const response = await createSLO({ - groupBy: '*', - }); - const id = response.body.id; - - await retry.tryForTime(300 * 1000, async () => { - const getResponse = await supertestAPI - .get(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); - - expect(getResponse.body).toEqual({ - name: 'Test SLO for api integration', - description: 'Fixture for api integration tests', - indicator: { - type: 'sli.kql.custom', - params: { - index: 'kbn-data-forge*', - filter: `system.network.name: eth1`, - good: 'container.cpu.user.pct < 1', - total: 'container.cpu.user.pct: *', - timestampField: '@timestamp', - }, - }, - budgetingMethod: 'occurrences', - timeWindow: { duration: '7d', type: 'rolling' }, - objective: { target: 0.99 }, - tags: ['test'], - groupBy: '*', - groupings: {}, - id, - settings: { syncDelay: '1m', frequency: '1m', preventInitialBackfill: false }, - revision: 1, - enabled: true, - createdAt: getResponse.body.createdAt, - updatedAt: getResponse.body.updatedAt, - version: 2, - instanceId: '*', - meta: {}, - summary: expect.any(Object), - }); - expectSummary(getResponse.body.summary); - }); - }); - - it('gets slo by id and calculates SLI - occurrences calendarAligned', async () => { - const response = await createSLO({ - groupBy: '*', - timeWindow: { - duration: '1w', - type: 'calendarAligned', - }, - }); - const id = response.body.id; - - await retry.tryForTime(300 * 1000, async () => { - const getResponse = await supertestAPI - .get(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); - - // expect summary transform to be created - expect(getResponse.body).toEqual({ - name: 'Test SLO for api integration', - description: 'Fixture for api integration tests', - indicator: { - type: 'sli.kql.custom', - params: { - index: 'kbn-data-forge*', - filter: `system.network.name: eth1`, - good: 'container.cpu.user.pct < 1', - total: 'container.cpu.user.pct: *', - timestampField: '@timestamp', - }, - }, - budgetingMethod: 'occurrences', - timeWindow: { duration: '1w', type: 'calendarAligned' }, - objective: { target: 0.99 }, - tags: ['test'], - groupBy: '*', - groupings: {}, - id, - settings: { syncDelay: '1m', frequency: '1m', preventInitialBackfill: false }, - revision: 1, - enabled: true, - createdAt: getResponse.body.createdAt, - updatedAt: getResponse.body.updatedAt, - version: 2, - instanceId: '*', - meta: {}, - summary: expect.any(Object), - }); - expectSummary(getResponse.body.summary); - }); - }); - - it('gets slo by id and calculates SLI - timeslices rolling', async () => { - const response = await createSLO({ - groupBy: '*', - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'timeslices', - objective: { - target: 0.99, - timesliceTarget: 0.95, - timesliceWindow: '1m', - }, - }); - const id = response.body.id; - - await retry.tryForTime(300 * 1000, async () => { - const getResponse = await supertestAPI - .get(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); - - // expect summary transform to be created - expect(getResponse.body).toEqual({ - name: 'Test SLO for api integration', - description: 'Fixture for api integration tests', - indicator: { - type: 'sli.kql.custom', - params: { - index: 'kbn-data-forge*', - filter: `system.network.name: eth1`, - good: 'container.cpu.user.pct < 1', - total: 'container.cpu.user.pct: *', - timestampField: '@timestamp', - }, - }, - budgetingMethod: 'timeslices', - timeWindow: { duration: '7d', type: 'rolling' }, - objective: { - target: 0.99, - timesliceTarget: 0.95, - timesliceWindow: '1m', - }, - tags: ['test'], - groupBy: '*', - groupings: {}, - id, - settings: { syncDelay: '1m', frequency: '1m', preventInitialBackfill: false }, - revision: 1, - enabled: true, - createdAt: getResponse.body.createdAt, - updatedAt: getResponse.body.updatedAt, - version: 2, - instanceId: '*', - meta: {}, - summary: expect.any(Object), - }); - expectSummary(getResponse.body.summary); - }); - }); - - it('gets slo by id and calculates SLI - timeslices calendarAligned', async () => { - const response = await createSLO({ - groupBy: '*', - timeWindow: { - duration: '1w', - type: 'calendarAligned', - }, - budgetingMethod: 'timeslices', - objective: { - target: 0.99, - timesliceTarget: 0.95, - timesliceWindow: '10m', - }, - }); - const id = response.body.id; - - await retry.tryForTime(300 * 1000, async () => { - const getResponse = await supertestAPI - .get(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); - - expect(getResponse.body).toEqual({ - name: 'Test SLO for api integration', - description: 'Fixture for api integration tests', - indicator: { - type: 'sli.kql.custom', - params: { - index: 'kbn-data-forge*', - filter: `system.network.name: eth1`, - good: 'container.cpu.user.pct < 1', - total: 'container.cpu.user.pct: *', - timestampField: '@timestamp', - }, - }, - budgetingMethod: 'timeslices', - timeWindow: { duration: '1w', type: 'calendarAligned' }, - objective: { - target: 0.99, - timesliceTarget: 0.95, - timesliceWindow: '10m', - }, - tags: ['test'], - groupBy: '*', - groupings: {}, - id, - settings: { syncDelay: '1m', frequency: '1m', preventInitialBackfill: false }, - revision: 1, - enabled: true, - createdAt: getResponse.body.createdAt, - updatedAt: getResponse.body.updatedAt, - version: 2, - instanceId: '*', - meta: {}, - summary: expect.any(Object), - }); - expectSummary(getResponse.body.summary); - }); - }); - - it('gets slos by query', async () => { - await createSLO(); - await createSLO({ name: 'test int' }); - - await retry.tryForTime(360 * 1000, async () => { - const response = await supertestAPI - .get(`/api/observability/slos`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); - - expect(response.body.results.length).toEqual(2); - - const searchResponse = await supertestAPI - .get(`/api/observability/slos?kqlQuery=slo.name%3Aapi*`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); - - expect(searchResponse.body.results.length).toEqual(1); - - const searchResponse2 = await supertestAPI - .get(`/api/observability/slos?kqlQuery=slo.name%3Aint`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); - - expect(searchResponse2.body.results.length).toEqual(1); - - const searchResponse3 = await supertestAPI - .get(`/api/observability/slos?kqlQuery=slo.name%3Aint*`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); - - expect(searchResponse3.body.results.length).toEqual(2); - - const searchResponse4 = await supertestAPI - .get(`/api/observability/slos?kqlQuery=int*`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); - - expect(searchResponse4.body.results.length).toEqual(2); - }); - }); - - // not possible for now to reliably fix this - // it.skip('gets slos instances', async () => { - // const createResponse = await createSLO(); - // const id = createResponse.body.id; - // - // await retry.tryForTime( - // 400 * 1000, - // async () => { - // const response = await supertestAPI - // .get(`/api/observability/slos`) - // .set('kbn-xsrf', 'true') - // .send() - // .expect(200); - // const res = response.body.results; - // expect(res.length).toEqual(3); - // const groups = res.map((r: any) => r.groupings.tags); - // - // expect(groups.sort()).toEqual(['1', '2', '3']); - // - // const instanceResponse = await supertestAPI - // .get(`/internal/observability/slos/${id}/_instances`) - // .set('kbn-xsrf', 'true') - // .send() - // .expect(200); - // - // // expect 3 instances to be created - // expect(instanceResponse.body.groupBy).toEqual('tags'); - // expect(instanceResponse.body.instances.sort()).toEqual(['1', '2', '3']); - // }, - // onFailure, - // 10 * 1000 - // ); - // }); - - it('gets slo definitions', async () => { - const createResponse = await createSLO(); - const id = createResponse.body.id; - const secondCreateResponse = await createSLO({ name: 'test name int' }); - const secondId = secondCreateResponse.body.id; - const response = await slo.getDefinitions(); - - expect(response.body).toEqual({ - page: 1, - perPage: 100, - results: [ - { - budgetingMethod: 'occurrences', - createdAt: response.body.results[0].createdAt, - description: 'Fixture for api integration tests', - enabled: true, - groupBy: 'tags', - id, - indicator: { - params: { - filter: 'system.network.name: eth1', - good: 'container.cpu.user.pct < 1', - index: 'kbn-data-forge*', - timestampField: '@timestamp', - total: 'container.cpu.user.pct: *', - }, - type: 'sli.kql.custom', - }, - name: 'Test SLO for api integration', - objective: { - target: 0.99, - }, - revision: 1, - settings: { - frequency: '1m', - syncDelay: '1m', - preventInitialBackfill: false, - }, - tags: ['test'], - timeWindow: { - duration: '7d', - type: 'rolling', - }, - updatedAt: response.body.results[0].updatedAt, - version: 2, - }, - { - budgetingMethod: 'occurrences', - createdAt: response.body.results[1].createdAt, - description: 'Fixture for api integration tests', - enabled: true, - groupBy: 'tags', - id: secondId, - indicator: { - params: { - filter: 'system.network.name: eth1', - good: 'container.cpu.user.pct < 1', - index: 'kbn-data-forge*', - timestampField: '@timestamp', - total: 'container.cpu.user.pct: *', - }, - type: 'sli.kql.custom', - }, - name: 'test name int', - objective: { - target: 0.99, - }, - revision: 1, - settings: { - frequency: '1m', - syncDelay: '1m', - preventInitialBackfill: false, - }, - tags: ['test'], - timeWindow: { - duration: '7d', - type: 'rolling', - }, - updatedAt: response.body.results[1].updatedAt, - version: 2, - }, - ], - total: 2, - }); - - // can search by name - const searchResponse = await slo.getDefinitions({ search: 'api' }); - - expect(searchResponse.body.total).toEqual(1); - - const searchResponse2 = await supertestAPI - .get(`/api/observability/slos/_definitions?search=int`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); - - expect(searchResponse2.body.total).toEqual(1); - - const searchResponse3 = await supertestAPI - .get(`/api/observability/slos/_definitions?search=int*`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); - - expect(searchResponse3.body.total).toEqual(2); - }); - }); -} diff --git a/x-pack/test/api_integration/apis/slos/index.ts b/x-pack/test/api_integration/apis/slos/index.ts deleted file mode 100644 index 3401b195ccee5..0000000000000 --- a/x-pack/test/api_integration/apis/slos/index.ts +++ /dev/null @@ -1,19 +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 { FtrProviderContext } from '../../ftr_provider_context'; - -export default function ({ loadTestFile }: FtrProviderContext) { - describe('SLO API Tests', () => { - loadTestFile(require.resolve('./get_slo')); - loadTestFile(require.resolve('./create_slo')); - loadTestFile(require.resolve('./delete_slo')); - loadTestFile(require.resolve('./update_slo')); - loadTestFile(require.resolve('./reset_slo')); - loadTestFile(require.resolve('./fetch_historical_summary')); - }); -} diff --git a/x-pack/test/api_integration/apis/slos/reset_slo.ts b/x-pack/test/api_integration/apis/slos/reset_slo.ts deleted file mode 100644 index cccac8f1796be..0000000000000 --- a/x-pack/test/api_integration/apis/slos/reset_slo.ts +++ /dev/null @@ -1,93 +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 { cleanup } from '@kbn/infra-forge'; -import expect from '@kbn/expect'; -import { SO_SLO_TYPE } from '@kbn/slo-plugin/server/saved_objects'; - -import { FtrProviderContext } from '../../ftr_provider_context'; -import { loadTestData } from './helper/load_test_data'; -import { SloEsClient } from './helper/es'; - -export default function ({ getService }: FtrProviderContext) { - describe('Reset SLOs', function () { - this.tags('skipCloud'); - - const kibanaServer = getService('kibanaServer'); - const esClient = getService('es'); - const logger = getService('log'); - const slo = getService('slo'); - const sloEsClient = new SloEsClient(esClient); - - before(async () => { - await sloEsClient.deleteTestSourceData(); - await slo.createUser(); - await slo.deleteAllSLOs(); - await loadTestData(getService); - }); - - afterEach(async () => { - await slo.deleteAllSLOs(); - }); - - after(async () => { - await cleanup({ esClient, logger }); - await sloEsClient.deleteTestSourceData(); - }); - - it('updates the SO and transforms', async () => { - // create mock old SLO - const id = 'bdaeccdd-dc63-4138-a1d5-92c075f88087'; - await kibanaServer.savedObjects.clean({ - types: [SO_SLO_TYPE], - }); - await kibanaServer.savedObjects.create({ - type: SO_SLO_TYPE, - overwrite: true, - id, - attributes: { - name: 'Test SLO for api integration', - description: 'Fixture for api integration tests', - indicator: { - type: 'sli.kql.custom', - params: { - index: 'kbn-data-forge*', - filter: 'system.network.name: eth1', - good: 'container.cpu.user.pct < 1', - total: 'container.cpu.user.pct: *', - timestampField: '@timestamp', - }, - }, - budgetingMethod: 'occurrences', - timeWindow: { duration: '7d', type: 'rolling' }, - objective: { target: 0.99 }, - tags: ['test'], - groupBy: '*', - id, - settings: { - syncDelay: '1m', - frequency: '1m', - }, - revision: 1, - enabled: true, - createdAt: '2023-12-14T01:12:35.638Z', - updatedAt: '2023-12-14T01:12:35.638Z', - version: 1, - }, - }); - - const responseBeforeReset = await slo.getDefinitions(); - - expect(responseBeforeReset.body.results[0].version).eql(1); - - await slo.reset(id); - - const responseAfterReset = await slo.getDefinitions(); - - expect(responseAfterReset.body.results[0].version).eql(2); - }); - }); -} diff --git a/x-pack/test/api_integration/apis/slos/update_slo.ts b/x-pack/test/api_integration/apis/slos/update_slo.ts deleted file mode 100644 index a8f4aa1a334f8..0000000000000 --- a/x-pack/test/api_integration/apis/slos/update_slo.ts +++ /dev/null @@ -1,764 +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 { cleanup } from '@kbn/infra-forge'; -import expect from '@kbn/expect'; -import type { CreateSLOInput } from '@kbn/slo-schema'; -import { SO_SLO_TYPE } from '@kbn/slo-plugin/server/saved_objects'; - -import { FtrProviderContext } from '../../ftr_provider_context'; -import { loadTestData } from './helper/load_test_data'; -import { sloData } from './fixtures/create_slo'; - -export default function ({ getService }: FtrProviderContext) { - describe('UpdateSLOs', function () { - this.tags('skipCloud'); - - const supertestAPI = getService('supertest'); - const kibanaServer = getService('kibanaServer'); - const esClient = getService('es'); - const logger = getService('log'); - const slo = getService('slo'); - - let createSLOInput: CreateSLOInput; - - before(async () => { - await slo.createUser(); - await slo.deleteAllSLOs(); - await loadTestData(getService); - }); - - beforeEach(() => { - createSLOInput = sloData; - }); - - afterEach(async () => { - await slo.deleteAllSLOs(); - }); - - after(async () => { - await cleanup({ esClient, logger }); - }); - - it('updates the SO and transforms', async () => { - const apiResponse = await supertestAPI - .post('/api/observability/slos') - .set('kbn-xsrf', 'true') - .send(createSLOInput) - .expect(200); - - expect(apiResponse.body).property('id'); - - const { id } = apiResponse.body; - - await supertestAPI - .put(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send({ - ...createSLOInput, - groupBy: 'hosts', - }) - .expect(200); - - const savedObject = await kibanaServer.savedObjects.find({ - type: SO_SLO_TYPE, - }); - - expect(savedObject.saved_objects.length).eql(1); - - expect(savedObject.saved_objects[0].attributes).eql({ - budgetingMethod: 'occurrences', - updatedAt: savedObject.saved_objects[0].attributes.updatedAt, - createdAt: savedObject.saved_objects[0].attributes.createdAt, - description: 'Fixture for api integration tests', - enabled: true, - groupBy: 'hosts', - id, - indicator: { - params: { - filter: 'system.network.name: eth1', - good: 'container.cpu.user.pct < 1', - index: 'kbn-data-forge*', - timestampField: '@timestamp', - total: 'container.cpu.user.pct: *', - }, - type: 'sli.kql.custom', - }, - name: 'Test SLO for api integration', - objective: { - target: 0.99, - }, - revision: 2, - settings: { - frequency: '1m', - syncDelay: '1m', - preventInitialBackfill: false, - }, - tags: ['test'], - timeWindow: { - duration: '7d', - type: 'rolling', - }, - version: 2, - }); - - const rollUpTransformResponse = await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-2`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // expect roll up transform to be created - expect(rollUpTransformResponse.body).eql({ - count: 1, - transforms: [ - { - id: `slo-${id}-2`, - authorization: { roles: ['superuser'] }, - version: '10.0.0', - create_time: rollUpTransformResponse.body.transforms[0].create_time, - source: { - index: ['kbn-data-forge*'], - query: { - bool: { - filter: [ - { range: { '@timestamp': { gte: 'now-7d/d' } } }, - { - bool: { - should: [ - { - match: { - 'system.network.name': 'eth1', - }, - }, - ], - minimum_should_match: 1, - }, - }, - { - exists: { - field: 'hosts', - }, - }, - ], - }, - }, - }, - dest: { - index: '.slo-observability.sli-v3.3', - pipeline: `.slo-observability.sli.pipeline-${id}-2`, - }, - frequency: '1m', - sync: { time: { field: '@timestamp', delay: '1m' } }, - pivot: { - group_by: { - 'slo.groupings.hosts': { terms: { field: 'hosts' } }, - '@timestamp': { date_histogram: { field: '@timestamp', fixed_interval: '1m' } }, - }, - aggregations: { - 'slo.numerator': { - filter: { - bool: { - should: [{ range: { 'container.cpu.user.pct': { lt: '1' } } }], - minimum_should_match: 1, - }, - }, - }, - 'slo.denominator': { - filter: { - bool: { - should: [{ exists: { field: 'container.cpu.user.pct' } }], - minimum_should_match: 1, - }, - }, - }, - }, - }, - description: `Rolled-up SLI data for SLO: Test SLO for api integration [id: ${id}, revision: 2]`, - settings: { deduce_mappings: false, unattended: true }, - _meta: { version: 3.3, managed: true, managed_by: 'observability' }, - }, - ], - }); - - const summaryTransform = await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-2`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // expect summary transform to be created - expect(summaryTransform.body).eql({ - count: 1, - transforms: [ - { - id: `slo-summary-${id}-2`, - authorization: { roles: ['superuser'] }, - version: '10.0.0', - create_time: summaryTransform.body.transforms[0].create_time, - source: { - index: ['.slo-observability.sli-v3.3*'], - query: { - bool: { - filter: [ - { range: { '@timestamp': { gte: 'now-7d/m', lte: 'now/m' } } }, - { term: { 'slo.id': id } }, - { term: { 'slo.revision': 2 } }, - ], - }, - }, - }, - dest: { - index: '.slo-observability.summary-v3.3', - pipeline: `.slo-observability.summary.pipeline-${id}-2`, - }, - frequency: '1m', - sync: { time: { field: 'event.ingested', delay: '65s' } }, - pivot: { - group_by: { - 'slo.id': { terms: { field: 'slo.id' } }, - 'slo.revision': { terms: { field: 'slo.revision' } }, - 'slo.instanceId': { terms: { field: 'slo.instanceId' } }, - 'slo.groupings.hosts': { - terms: { field: 'slo.groupings.hosts' }, - }, - 'monitor.config_id': { - terms: { - field: 'monitor.config_id', - missing_bucket: true, - }, - }, - 'monitor.name': { - terms: { - field: 'monitor.name', - missing_bucket: true, - }, - }, - 'observer.geo.name': { - terms: { - field: 'observer.geo.name', - missing_bucket: true, - }, - }, - 'observer.name': { - terms: { - field: 'observer.name', - missing_bucket: true, - }, - }, - 'service.name': { terms: { field: 'service.name', missing_bucket: true } }, - 'service.environment': { - terms: { field: 'service.environment', missing_bucket: true }, - }, - 'transaction.name': { terms: { field: 'transaction.name', missing_bucket: true } }, - 'transaction.type': { terms: { field: 'transaction.type', missing_bucket: true } }, - }, - aggregations: { - goodEvents: { sum: { field: 'slo.numerator' } }, - totalEvents: { sum: { field: 'slo.denominator' } }, - sliValue: { - bucket_script: { - buckets_path: { goodEvents: 'goodEvents', totalEvents: 'totalEvents' }, - script: - 'if (params.totalEvents == 0) { return -1 } else if (params.goodEvents >= params.totalEvents) { return 1 } else { return params.goodEvents / params.totalEvents }', - }, - }, - errorBudgetInitial: { bucket_script: { buckets_path: {}, script: '1 - 0.99' } }, - errorBudgetConsumed: { - bucket_script: { - buckets_path: { - sliValue: 'sliValue', - errorBudgetInitial: 'errorBudgetInitial', - }, - script: - 'if (params.sliValue == -1) { return 0 } else { return (1 - params.sliValue) / params.errorBudgetInitial }', - }, - }, - errorBudgetRemaining: { - bucket_script: { - buckets_path: { errorBudgetConsumed: 'errorBudgetConsumed' }, - script: '1 - params.errorBudgetConsumed', - }, - }, - statusCode: { - bucket_script: { - buckets_path: { - sliValue: 'sliValue', - errorBudgetRemaining: 'errorBudgetRemaining', - }, - script: { - source: - 'if (params.sliValue == -1) { return 0 } else if (params.sliValue >= 0.99) { return 4 } else if (params.errorBudgetRemaining > 0) { return 2 } else { return 1 }', - }, - }, - }, - latestSliTimestamp: { max: { field: '@timestamp' } }, - fiveMinuteBurnRate: { - filter: { - range: { - '@timestamp': { - gte: 'now-480s/m', - lte: 'now-180s/m', - }, - }, - }, - aggs: { - goodEvents: { - sum: { - field: 'slo.numerator', - }, - }, - totalEvents: { - sum: { - field: 'slo.denominator', - }, - }, - }, - }, - oneHourBurnRate: { - filter: { - range: { - '@timestamp': { - gte: 'now-3780s/m', - lte: 'now-180s/m', - }, - }, - }, - aggs: { - goodEvents: { - sum: { - field: 'slo.numerator', - }, - }, - totalEvents: { - sum: { - field: 'slo.denominator', - }, - }, - }, - }, - oneDayBurnRate: { - filter: { - range: { - '@timestamp': { - gte: 'now-86580s/m', - lte: 'now-180s/m', - }, - }, - }, - aggs: { - goodEvents: { - sum: { - field: 'slo.numerator', - }, - }, - totalEvents: { - sum: { - field: 'slo.denominator', - }, - }, - }, - }, - }, - }, - description: `Summarise the rollup data of SLO: Test SLO for api integration [id: ${id}, revision: 2].`, - settings: { deduce_mappings: false, unattended: true }, - _meta: { version: 3.3, managed: true, managed_by: 'observability' }, - }, - ], - }); - }); - - it('updates an existing slo and does not update transforms when relevant fields are changed', async () => { - const request = createSLOInput; - - const apiResponse = await supertestAPI - .post('/api/observability/slos') - .set('kbn-xsrf', 'true') - .send(request) - .expect(200); - - expect(apiResponse.body).property('id'); - - const { id } = apiResponse.body; - - const savedObject = await kibanaServer.savedObjects.find({ - type: SO_SLO_TYPE, - }); - - expect(savedObject.saved_objects.length).eql(1); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // change name - await supertestAPI - .put(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send({ - ...request, - name: 'test name', - }) - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // change description - await supertestAPI - .put(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send({ - ...request, - description: 'test description', - }) - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // change tags - await supertestAPI - .put(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send({ - ...request, - tags: ['testTag'], - }) - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - }); - - it('updates an existing slo and updates transforms when relevant fields are changed', async () => { - const request = createSLOInput; - - const apiResponse = await supertestAPI - .post('/api/observability/slos') - .set('kbn-xsrf', 'true') - .send(request) - .expect(200); - - expect(apiResponse.body).property('id'); - - const { id } = apiResponse.body; - - const savedObject = await kibanaServer.savedObjects.find({ - type: SO_SLO_TYPE, - }); - - expect(savedObject.saved_objects.length).eql(1); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // change group by - await supertestAPI - .put(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send({ - ...request, - groupBy: 'hosts', - }) - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-1`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-2`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-2`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // change indicator - await supertestAPI - .put(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send({ - ...request, - indicator: { - ...request.indicator, - params: { - ...request.indicator.params, - index: 'test-index-*', - }, - }, - }) - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-2`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-2`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-3`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-3`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // change time window - await supertestAPI - .put(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send({ - ...request, - timeWindow: { - ...request.timeWindow, - duration: '7d', - }, - }) - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-3`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-3`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-4`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-4`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // change objective - await supertestAPI - .put(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send({ - ...request, - objective: { - target: 0.97, - }, - }) - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-4`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-4`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-5`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-5`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // change budgetingMethod - await supertestAPI - .put(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send({ - ...request, - budgetingMethod: 'timeslices', - objective: { - target: 0.99, - timesliceTarget: 0.95, - timesliceWindow: '1m', - }, - }) - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-5`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-5`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-6`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-6`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - // change settings - await supertestAPI - .put(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .send({ - ...request, - settings: { - frequency: '2m', - syncDelay: '5m', - }, - }) - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-6`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-6`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(404); - - await supertestAPI - .get(`/internal/transform/transforms/slo-${id}-7`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - - await supertestAPI - .get(`/internal/transform/transforms/slo-summary-${id}-7`) - .set('kbn-xsrf', 'true') - .set('elastic-api-version', '1') - .send() - .expect(200); - }); - }); -} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/index.ts index 63f8236a335b6..bfe3fd4cbb2c6 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/index.ts @@ -15,7 +15,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./apm_api_integration/service_maps/service_maps')); loadTestFile(require.resolve('./apm_api_integration/traces/critical_path')); loadTestFile(require.resolve('./cases')); - loadTestFile(require.resolve('./slos')); loadTestFile(require.resolve('./synthetics')); loadTestFile(require.resolve('./dataset_quality_api_integration')); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/slos/create_slo.ts b/x-pack/test_serverless/api_integration/test_suites/observability/slos/create_slo.ts deleted file mode 100644 index 93aaa77e4e215..0000000000000 --- a/x-pack/test_serverless/api_integration/test_suites/observability/slos/create_slo.ts +++ /dev/null @@ -1,371 +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 { cleanup, generate } from '@kbn/infra-forge'; -import expect from '@kbn/expect'; -import type { GetTransformsResponseSchema } from '@kbn/transform-plugin/server/routes/api_schemas/transforms'; -import { SO_SLO_TYPE } from '@kbn/slo-plugin/server/saved_objects'; -import { ALL_VALUE } from '@kbn/slo-schema'; -import { - getSLOPipelineId, - getSLOSummaryPipelineId, - SLO_SUMMARY_TEMP_INDEX_NAME, -} from '@kbn/slo-plugin/common/constants'; -import type { RoleCredentials } from '../../../../shared/services'; -import { FtrProviderContext } from '../../../ftr_provider_context'; - -interface ExpectedTransforms { - count: number; - typeOfVersion: string; - typeOfCreateTime: string; - results: Record; -} - -function assertTransformsResponseBody( - body: GetTransformsResponseSchema, - expectedTransforms: ExpectedTransforms -) { - expect(body.count).to.eql(expectedTransforms.count); - expect(body.transforms).to.have.length(expectedTransforms.count); - - body.transforms.forEach((transform, index) => { - const expectedTransform = expectedTransforms.results[`transform${index}`]; - expect(transform.id).to.eql(expectedTransform.id); - expect(transform.dest.index).to.eql(expectedTransform.destIndex); - expect(typeof transform.version).to.eql(expectedTransforms.typeOfVersion); - expect(typeof transform.create_time).to.eql(expectedTransforms.typeOfCreateTime); - }); -} - -export default function ({ getService }: FtrProviderContext) { - const esClient = getService('es'); - const supertest = getService('supertest'); - - const esDeleteAllIndices = getService('esDeleteAllIndices'); - const logger = getService('log'); - const dataViewApi = getService('dataViewApi'); - const sloApi = getService('sloApi'); - const kibanaServer = getService('kibanaServer'); - const transform = getService('transform'); - const svlUserManager = getService('svlUserManager'); - const svlCommonApi = getService('svlCommonApi'); - - describe('create_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'; - const DATA_VIEW_ID = 'data-view-id'; - let infraDataIndex: string; - let roleAuthc: RoleCredentials; - - before(async () => { - infraDataIndex = await generate({ - esClient, - lookback: 'now-15m', - logger, - }); - await dataViewApi.create({ - name: DATE_VIEW, - id: DATA_VIEW_ID, - title: DATE_VIEW, - }); - await kibanaServer.savedObjects.cleanStandardList(); - roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('admin'); - }); - - after(async () => { - await dataViewApi.delete({ - id: DATA_VIEW_ID, - }); - await supertest - .delete('/api/observability/slos/my-custom-id1') - .set(svlCommonApi.getInternalRequestHeader()); - - await supertest - .delete('/api/observability/slos/my-custom-id2') - .set(svlCommonApi.getInternalRequestHeader()); - - await supertest - .delete('/api/observability/slos/my-custom-id3') - .set(svlCommonApi.getInternalRequestHeader()); - - await supertest - .delete('/api/observability/slos/my-custom-id4') - .set(svlCommonApi.getInternalRequestHeader()); - - await esDeleteAllIndices([infraDataIndex]); - await cleanup({ esClient, logger }); - await kibanaServer.savedObjects.clean({ types: [SO_SLO_TYPE] }); - await transform.api.cleanTransformIndices(); - await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); - }); - - describe('non partition by SLO', () => { - const sloId = 'my-custom-id1'; - - before(async () => { - await sloApi.create( - { - id: sloId, - name: 'my custom name', - description: 'my custom description', - indicator: { - type: 'sli.kql.custom', - params: { - index: infraDataIndex, - good: 'system.cpu.total.norm.pct > 1', - total: 'system.cpu.total.norm.pct: *', - timestampField: '@timestamp', - }, - }, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.999, - }, - groupBy: ALL_VALUE, - }, - roleAuthc - ); - }); - - it('saves the SLO definition', async () => { - const savedObject = await kibanaServer.savedObjects.find({ - type: SO_SLO_TYPE, - }); - expect(savedObject.total).to.eql(1); - expect(savedObject.saved_objects[0].attributes.version).eql(2); - expect(savedObject.saved_objects[0].attributes.revision).eql(1); - }); - - it('creates the rollup and summary transforms', async () => { - const expectedTransforms: ExpectedTransforms = { - count: 2, - results: { - transform0: { id: 'slo-my-custom-id1-1', destIndex: '.slo-observability.sli-v3.3' }, - transform1: { - id: 'slo-summary-my-custom-id1-1', - destIndex: '.slo-observability.summary-v3.3', - }, - }, - typeOfVersion: 'string', - typeOfCreateTime: 'number', - }; - const { body, status } = await supertest - .get(`/internal/transform/transforms`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') - .set('elastic-api-version', '1') - .set(roleAuthc.apiKeyHeader) - .send(); - transform.api.assertResponseStatusCode(200, status, body); - assertTransformsResponseBody(body, expectedTransforms); - }); - - it('creates ingest pipelines', async () => { - const sloRevision = 1; - const rollupPipelineResponse = await esClient.ingest.getPipeline({ - id: getSLOPipelineId(sloId, sloRevision), - }); - const expectedRollupPipeline = `.slo-observability.sli.pipeline-${sloId}-${sloRevision}`; - expect(rollupPipelineResponse[expectedRollupPipeline]).not.to.be(undefined); - - const summaryPipelineResponse = await esClient.ingest.getPipeline({ - id: getSLOSummaryPipelineId(sloId, sloRevision), - }); - const expectedSummaryPipeline = `.slo-observability.summary.pipeline-${sloId}-${sloRevision}`; - expect(summaryPipelineResponse[expectedSummaryPipeline]).not.to.be(undefined); - expect(summaryPipelineResponse[expectedSummaryPipeline].description).to.be( - `Ingest pipeline for SLO summary data [id: ${sloId}, revision: ${sloRevision}]` - ); - }); - - it('creates summary TEMP index', async () => { - const result = await sloApi.waitForSloSummaryTempIndexToExist(SLO_SUMMARY_TEMP_INDEX_NAME); - expect(result).to.be(true); - }); - - it('finds the created SLO', async () => { - const createdSlo = await sloApi.waitForSloCreated({ - sloId, - roleAuthc, - }); - expect(createdSlo.id).to.be(sloId); - expect(createdSlo.groupBy).to.be(ALL_VALUE); - }); - }); - - describe('SLO with long description', () => { - it('creates an SLO with description over 256 characters', async () => { - const sloId = 'my-custom-id2'; - await sloApi.create( - { - id: sloId, - name: 'my super long SLO name and description', - description: - 'Lorem Ipsum has been the industry standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. ', - indicator: { - type: 'sli.kql.custom', - params: { - index: infraDataIndex, - good: 'system.cpu.total.norm.pct > 1', - total: 'system.cpu.total.norm.pct: *', - timestampField: '@timestamp', - }, - }, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.999, - }, - groupBy: '*', - }, - roleAuthc - ); - - const createdSlo = await sloApi.waitForSloCreated({ - sloId, - roleAuthc, - }); - expect(createdSlo.id).to.be(sloId); - }); - }); - - describe('SLO with special characters in the description', () => { - it("creates an SLO that has ' character in the description", async () => { - const sloId = 'my-custom-id3'; - await sloApi.create( - { - id: sloId, - name: 'my SLO with weird characters in the description', - description: - "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.", - indicator: { - type: 'sli.kql.custom', - params: { - index: infraDataIndex, - good: 'system.cpu.total.norm.pct > 1', - total: 'system.cpu.total.norm.pct: *', - timestampField: '@timestamp', - }, - }, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.999, - }, - groupBy: '*', - }, - roleAuthc - ); - const createdSlo = await sloApi.waitForSloCreated({ - sloId, - roleAuthc, - }); - expect(createdSlo.id).to.be(sloId); - }); - }); - - describe('partition by SLO', () => { - it('creates a partition by SLO', async () => { - const sloId = 'my-custom-id4'; - await sloApi.create( - { - id: sloId, - name: 'Group by SLO', - description: 'This is a group by SLO.', - indicator: { - type: 'sli.kql.custom', - params: { - index: infraDataIndex, - good: 'system.cpu.total.norm.pct > 1', - total: 'system.cpu.total.norm.pct: *', - timestampField: '@timestamp', - }, - }, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.999, - }, - groupBy: 'host.name', - }, - roleAuthc - ); - const createdSlo = await sloApi.waitForSloCreated({ - sloId, - roleAuthc, - }); - expect(createdSlo.id).to.be(sloId); - expect(createdSlo.groupBy).not.to.be(ALL_VALUE); - expect(createdSlo.groupBy).to.be('host.name'); - }); - }); - - describe('Total transforms', () => { - it('returns all the transforms for above created SLOs', async () => { - const expectedTransforms: ExpectedTransforms = { - count: 8, - results: { - transform0: { id: 'slo-my-custom-id1-1', destIndex: '.slo-observability.sli-v3.3' }, - transform1: { id: 'slo-my-custom-id2-1', destIndex: '.slo-observability.sli-v3.3' }, - transform2: { id: 'slo-my-custom-id3-1', destIndex: '.slo-observability.sli-v3.3' }, - transform3: { id: 'slo-my-custom-id4-1', destIndex: '.slo-observability.sli-v3.3' }, - transform4: { - id: 'slo-summary-my-custom-id1-1', - destIndex: '.slo-observability.summary-v3.3', - }, - transform5: { - id: 'slo-summary-my-custom-id2-1', - destIndex: '.slo-observability.summary-v3.3', - }, - transform6: { - id: 'slo-summary-my-custom-id3-1', - destIndex: '.slo-observability.summary-v3.3', - }, - transform7: { - id: 'slo-summary-my-custom-id4-1', - destIndex: '.slo-observability.summary-v3.3', - }, - }, - typeOfVersion: 'string', - typeOfCreateTime: 'number', - }; - const { body, status } = await supertest - .get(`/internal/transform/transforms`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') - .set('elastic-api-version', '1') - .set(roleAuthc.apiKeyHeader) - .send(); - transform.api.assertResponseStatusCode(200, status, body); - assertTransformsResponseBody(body, expectedTransforms); - }); - }); - - describe('Total SO definitions', () => { - it('returns SO definitions for above created SLOs', async () => { - const savedObject = await kibanaServer.savedObjects.find({ - type: SO_SLO_TYPE, - }); - expect(savedObject.total).to.eql(4); - }); - }); - }); -} 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 deleted file mode 100644 index c33bde45e1720..0000000000000 --- a/x-pack/test_serverless/api_integration/test_suites/observability/slos/delete_slo.ts +++ /dev/null @@ -1,175 +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 { SO_SLO_TYPE } from '@kbn/slo-plugin/server/saved_objects'; -import { cleanup, generate } from '@kbn/infra-forge'; -import expect from '@kbn/expect'; -import { ALL_VALUE } from '@kbn/slo-schema'; -import { - getSLOSummaryTransformId, - getSLOTransformId, - getSLOSummaryPipelineId, -} from '@kbn/slo-plugin/common/constants'; -import { - SLO_DESTINATION_INDEX_PATTERN, - SLO_SUMMARY_DESTINATION_INDEX_PATTERN, -} from '@kbn/slo-plugin/common/constants'; -import type { RoleCredentials } from '../../../../shared/services'; -import { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ getService }: FtrProviderContext) { - const esClient = getService('es'); - const logger = getService('log'); - const kibanaServer = getService('kibanaServer'); - const sloApi = getService('sloApi'); - const transform = getService('transform'); - const retry = getService('retry'); - - const esDeleteAllIndices = getService('esDeleteAllIndices'); - const dataViewApi = getService('dataViewApi'); - const svlUserManager = getService('svlUserManager'); - - const fetchSloSummaryPipeline = async (sloId: string, sloRevision: number) => { - try { - return await esClient.ingest.getPipeline({ - id: getSLOSummaryPipelineId(sloId, sloRevision), - }); - } catch (error) { - // The GET /_ingest/pipeline API returns an empty object on 404 Not Found. If there are no SLO - // pipelines then return an empty record of pipelines - return {}; - } - }; - - 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'; - const DATA_VIEW_ID = 'data-view-id'; - let infraDataIndex: string; - let sloId: string; - let roleAuthc: RoleCredentials; - - before(async () => { - await sloApi.deleteAllSLOs(); - - infraDataIndex = await generate({ - esClient, - lookback: 'now-15m', - logger, - }); - await dataViewApi.create({ - name: DATE_VIEW, - id: DATA_VIEW_ID, - title: DATE_VIEW, - }); - await kibanaServer.savedObjects.cleanStandardList(); - roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('admin'); - }); - - after(async () => { - await dataViewApi.delete({ - id: DATA_VIEW_ID, - }); - await sloApi.deleteAllSLOs(); - await esDeleteAllIndices([infraDataIndex]); - await cleanup({ esClient, logger }); - await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); - }); - - describe('non partition by SLO', () => { - it('deletes the SLO definition, transforms, ingest pipeline and data', async () => { - const createdSlo = await sloApi.create( - { - name: 'my custom name', - description: 'my custom description', - indicator: { - type: 'sli.kql.custom', - params: { - index: infraDataIndex, - good: 'system.cpu.total.norm.pct > 1', - total: 'system.cpu.total.norm.pct: *', - timestampField: '@timestamp', - }, - }, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.999, - }, - groupBy: ALL_VALUE, - }, - roleAuthc - ); - sloId = createdSlo.id; - await sloApi.waitForSloCreated({ sloId, roleAuthc }); - - // Saved Object - const savedObject = await kibanaServer.savedObjects.find({ - type: SO_SLO_TYPE, - }); - expect(savedObject.total).to.eql(1); - expect(savedObject.saved_objects[0].attributes.id).to.eql(sloId); - const sloRevision = savedObject.saved_objects[0].attributes.revision ?? 1; - - // Transforms - const sloTransformId = getSLOTransformId(sloId, sloRevision); - const sloSummaryTransformId = getSLOSummaryTransformId(sloId, sloRevision); - await transform.api.waitForTransformToExist(sloTransformId); - await transform.api.waitForTransformToExist(sloSummaryTransformId); - - // Ingest pipeline - const pipelineResponse = await fetchSloSummaryPipeline(sloId, sloRevision); - expect(pipelineResponse[getSLOSummaryPipelineId(sloId, sloRevision)]).not.to.be(undefined); - - // RollUp and Summary data - const sloRollupData = await sloApi.waitForSloData({ - sloId, - indexName: SLO_DESTINATION_INDEX_PATTERN, - }); - const sloSummaryData = await sloApi.waitForSloData({ - sloId, - indexName: SLO_SUMMARY_DESTINATION_INDEX_PATTERN, - }); - - expect(sloRollupData.hits.hits.length > 0).to.be(true); - expect(sloSummaryData.hits.hits.length > 0).to.be(true); - - // Delete the SLO - const response = await sloApi.waitForSloToBeDeleted({ - sloId, - roleAuthc, - }); - expect(response.status).to.be(204); - - // Saved object definition - const savedObjectAfterDelete = await kibanaServer.savedObjects.find({ - type: SO_SLO_TYPE, - }); - expect(savedObjectAfterDelete.total).to.eql(0); - - // Transforms - await transform.api.getTransform(sloTransformId, 404); - await transform.api.getTransform(sloSummaryTransformId, 404); - - await retry.waitForWithTimeout('SLO summary data is deleted', 60 * 1000, async () => { - const sloSummaryDataAfterDeletion = await sloApi.getSloData({ - sloId, - indexName: SLO_SUMMARY_DESTINATION_INDEX_PATTERN, - }); - if (sloSummaryDataAfterDeletion.hits.hits.length > 0) { - throw new Error('SLO summary data not deleted yet'); - } - return true; - }); - }); - }); - }); -} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/slos/fetch_historical_summary.ts b/x-pack/test_serverless/api_integration/test_suites/observability/slos/fetch_historical_summary.ts deleted file mode 100644 index 2f8db3098fccf..0000000000000 --- a/x-pack/test_serverless/api_integration/test_suites/observability/slos/fetch_historical_summary.ts +++ /dev/null @@ -1,146 +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 expect from '@kbn/expect'; -import { - SLO_DESTINATION_INDEX_NAME, - SLO_DESTINATION_INDEX_PATTERN, -} from '@kbn/slo-plugin/common/constants'; - -import { ALL_VALUE } from '@kbn/slo-schema'; -import moment from 'moment'; -import { RoleCredentials } from '../../../../shared/services'; -import { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ getService }: FtrProviderContext) { - const esClient = getService('es'); - const esDeleteAllIndices = getService('esDeleteAllIndices'); - const sloApi = getService('sloApi'); - const svlUserManager = getService('svlUserManager'); - - const SLO_ID = 'slo-fake-1'; - describe('fetch historical summary', () => { - let roleAuthc: RoleCredentials; - - before(async () => { - const now = moment().startOf('minute'); - const curr = now.clone().subtract(30, 'days'); - const end = now.clone().add(5, 'minutes'); - - const batchOperations = []; - - while (curr.isSameOrBefore(end)) { - batchOperations.push([ - { index: { _index: SLO_DESTINATION_INDEX_NAME } }, - { - '@timestamp': curr.toISOString(), - slo: { - id: SLO_ID, - revision: 1, - instanceId: ALL_VALUE, - numerator: 90, - denominator: 100, - isGoodSlice: 1, - groupings: {}, - }, - }, - ]); - curr.add(1, 'minute'); - } - - await esClient.bulk({ - index: SLO_DESTINATION_INDEX_NAME, - operations: batchOperations.flat(), - refresh: 'wait_for', - }); - - await esClient.indices.refresh({ index: SLO_DESTINATION_INDEX_NAME }); - roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('admin'); - }); - - after(async () => { - await esDeleteAllIndices(SLO_DESTINATION_INDEX_PATTERN); - await svlUserManager.invalidateM2mApiKeyWithRoleScope(roleAuthc); - }); - - it('computes the historical summary for a rolling occurrences SLO', async () => { - const response = await sloApi.fetchHistoricalSummary( - { - list: [ - { - sloId: SLO_ID, - instanceId: ALL_VALUE, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.9, - }, - groupBy: ALL_VALUE, - revision: 1, - }, - ], - }, - roleAuthc - ); - expect(response[0].sloId).to.eql(SLO_ID); - expect(response[0].instanceId).to.eql(ALL_VALUE); - const numberOfBuckets = response[0].data.length; - expect(numberOfBuckets).to.be.within(168, 170); // 7 days * 24 hours/day * 1 bucket/hour + 2 extra bucket due to histogram agg rounding - const last = response[0].data.pop(); - expect(last?.errorBudget).to.eql({ - consumed: 1, - initial: 0.1, - isEstimated: false, - remaining: 0, - }); - expect(last?.sliValue).to.eql(0.9); - expect(last?.status).to.eql('HEALTHY'); - }); - - it('computes the historical summary for a rolling timeslices SLO', async () => { - const response = await sloApi.fetchHistoricalSummary( - { - list: [ - { - sloId: SLO_ID, - instanceId: ALL_VALUE, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'timeslices', - objective: { - target: 0.9, - timesliceTarget: 0.8, - timesliceWindow: '1m', - }, - groupBy: ALL_VALUE, - revision: 1, - }, - ], - }, - roleAuthc - ); - expect(response[0].sloId).to.eql(SLO_ID); - expect(response[0].instanceId).to.eql(ALL_VALUE); - const numberOfBuckets = response[0].data.length; - expect(numberOfBuckets).to.be.within(168, 170); // 7 days * 24 hours/day * 1 bucket/hour + 2 extra bucket due to histogram agg rounding - const last = response[0].data.pop(); - expect(last?.errorBudget).to.eql({ - consumed: 0, - initial: 0.1, - isEstimated: false, - remaining: 1, - }); - expect(last?.sliValue).to.eql(1); - expect(last?.status).to.eql('HEALTHY'); - }); - }); -} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/slos/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/slos/index.ts deleted file mode 100644 index 8df59e6f3b624..0000000000000 --- a/x-pack/test_serverless/api_integration/test_suites/observability/slos/index.ts +++ /dev/null @@ -1,15 +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 { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ loadTestFile }: FtrProviderContext) { - describe('SLOs', function () { - loadTestFile(require.resolve('./create_slo')); - loadTestFile(require.resolve('./delete_slo')); - loadTestFile(require.resolve('./fetch_historical_summary')); - }); -} diff --git a/x-pack/test_serverless/tsconfig.json b/x-pack/test_serverless/tsconfig.json index 388a4732fdd9e..ed9a78fde0f6f 100644 --- a/x-pack/test_serverless/tsconfig.json +++ b/x-pack/test_serverless/tsconfig.json @@ -78,7 +78,6 @@ "@kbn/ftr-common-functional-ui-services", "@kbn/saved-objects-management-plugin", "@kbn/es", - "@kbn/infra-forge", "@kbn/reporting-common", "@kbn/es-query", "@kbn/slo-plugin", From aceb5debdba66c2d34e6358fe2a11c015a09eac8 Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Mon, 28 Oct 2024 09:24:34 -0400 Subject: [PATCH 068/135] [Response Ops][Task Manager] change task claiming interface to stop using observables (#196196) Resolves https://github.com/elastic/kibana/issues/184952 ## Summary Changing task claimers to return promises instead of observables. This is a code refactor and should not have any effect on task claiming functionality. --------- Co-authored-by: Elastic Machine --- .../task_manager/server/lib/fill_pool.test.ts | 93 ++--- .../task_manager/server/lib/fill_pool.ts | 109 ++---- .../server/polling_lifecycle.test.ts | 134 +++---- .../task_manager/server/polling_lifecycle.ts | 77 ++--- .../server/queries/task_claiming.ts | 42 ++- .../server/task_claimers/index.ts | 4 +- .../task_claimers/strategy_mget.test.ts | 162 ++++----- .../server/task_claimers/strategy_mget.ts | 23 +- .../strategy_update_by_query.test.ts | 326 +++++++++++------- .../task_claimers/strategy_update_by_query.ts | 84 +++-- 10 files changed, 515 insertions(+), 539 deletions(-) diff --git a/x-pack/plugins/task_manager/server/lib/fill_pool.test.ts b/x-pack/plugins/task_manager/server/lib/fill_pool.test.ts index d3533ac058314..e1591feee9271 100644 --- a/x-pack/plugins/task_manager/server/lib/fill_pool.test.ts +++ b/x-pack/plugins/task_manager/server/lib/fill_pool.test.ts @@ -12,68 +12,58 @@ import { TaskPoolRunResult } from '../task_pool'; import { asOk, Result } from './result_type'; import { ConcreteTaskInstance, TaskStatus } from '../task'; import { TaskManagerRunner } from '../task_running/task_runner'; -import { from, Observable } from 'rxjs'; import { ClaimOwnershipResult } from '../queries/task_claiming'; jest.mock('../task_running/task_runner'); describe('fillPool', () => { function mockFetchAvailableTasks( - tasksToMock: number[][] - ): () => Observable> { - const claimCycles: ConcreteTaskInstance[][] = tasksToMock.map((ids) => mockTaskInstances(ids)); + tasksToMock: number[] + ): () => Promise> { + const tasks: ConcreteTaskInstance[] = tasksToMock.map((id) => mockTaskInstance(id)); return () => - from( - claimCycles.map((tasks) => - asOk({ - stats: { - tasksUpdated: tasks?.length ?? 0, - tasksConflicted: 0, - tasksClaimed: 0, - }, - docs: tasks, - }) - ) + Promise.resolve( + asOk({ + stats: { + tasksUpdated: tasks?.length ?? 0, + tasksConflicted: 0, + tasksClaimed: 0, + }, + docs: tasks, + }) ); } - const mockTaskInstances = (ids: number[]): ConcreteTaskInstance[] => - ids.map((id) => ({ - id: `${id}`, - attempts: 0, - status: TaskStatus.Running, - version: '123', - runAt: new Date(0), - scheduledAt: new Date(0), + const mockTaskInstance = (id: number): ConcreteTaskInstance => ({ + id: `${id}`, + attempts: 0, + status: TaskStatus.Running, + version: '123', + runAt: new Date(0), + scheduledAt: new Date(0), + startedAt: new Date(0), + retryAt: new Date(0), + state: { startedAt: new Date(0), - retryAt: new Date(0), - state: { - startedAt: new Date(0), - }, - taskType: '', - params: {}, - ownerId: null, - })); - - test('fills task pool with all claimed tasks until fetchAvailableTasks stream closes', async () => { - const tasks = [ - [1, 2, 3], - [4, 5], - ]; + }, + taskType: '', + params: {}, + ownerId: null, + }); + + test('fills task pool with all claimed tasks', async () => { + const tasks = [1, 2, 3, 4, 5]; const fetchAvailableTasks = mockFetchAvailableTasks(tasks); const run = sinon.spy(async () => TaskPoolRunResult.RunningAllClaimedTasks); const converter = _.identity; await fillPool(fetchAvailableTasks, converter, run); - expect(_.flattenDeep(run.args)).toEqual(mockTaskInstances([1, 2, 3, 4, 5])); + expect(_.flattenDeep(run.args)).toEqual(tasks.map((id) => mockTaskInstance(id))); }); test('calls the converter on the records prior to running', async () => { - const tasks = [ - [1, 2, 3], - [4, 5], - ]; + const tasks = [1, 2, 3, 4, 5]; const fetchAvailableTasks = mockFetchAvailableTasks(tasks); const run = sinon.spy(async () => TaskPoolRunResult.RanOutOfCapacity); const converter = (instance: ConcreteTaskInstance) => @@ -91,14 +81,13 @@ describe('fillPool', () => { instance.id as unknown as TaskManagerRunner; try { - const fetchAvailableTasks = () => - new Observable>((obs) => - obs.error('fetch is not working') - ); + const fetchAvailableTasks = () => { + throw new Error('fetch is not working'); + }; await fillPool(fetchAvailableTasks, converter, run); } catch (err) { - expect(err.toString()).toBe('fetch is not working'); + expect(err.toString()).toBe('Error: fetch is not working'); expect(run.called).toBe(false); } }); @@ -109,10 +98,7 @@ describe('fillPool', () => { instance.id as unknown as TaskManagerRunner; try { - const tasks = [ - [1, 2, 3], - [4, 5], - ]; + const tasks = [1, 2, 3, 4, 5]; const fetchAvailableTasks = mockFetchAvailableTasks(tasks); await fillPool(fetchAvailableTasks, converter, run); @@ -123,10 +109,7 @@ describe('fillPool', () => { test('throws exception from converter', async () => { try { - const tasks = [ - [1, 2, 3], - [4, 5], - ]; + const tasks = [1, 2, 3, 4, 5]; const fetchAvailableTasks = mockFetchAvailableTasks(tasks); const run = sinon.spy(async () => TaskPoolRunResult.RanOutOfCapacity); const converter = (instance: ConcreteTaskInstance) => { diff --git a/x-pack/plugins/task_manager/server/lib/fill_pool.ts b/x-pack/plugins/task_manager/server/lib/fill_pool.ts index bf1ed95da363b..42c8320e81db7 100644 --- a/x-pack/plugins/task_manager/server/lib/fill_pool.ts +++ b/x-pack/plugins/task_manager/server/lib/fill_pool.ts @@ -5,14 +5,12 @@ * 2.0. */ -import { Observable } from 'rxjs'; -import { concatMap, last } from 'rxjs'; import { ClaimOwnershipResult } from '../queries/task_claiming'; import { ConcreteTaskInstance } from '../task'; import { WithTaskTiming, startTaskTimer } from '../task_events'; import { TaskPoolRunResult } from '../task_pool'; import { TaskManagerRunner } from '../task_running'; -import { Result, map as mapResult, asErr, asOk } from './result_type'; +import { Result, isOk } from './result_type'; export enum FillPoolResult { Failed = 'Failed', @@ -23,17 +21,6 @@ export enum FillPoolResult { PoolFilled = 'PoolFilled', } -type FillPoolAndRunResult = Result< - { - result: TaskPoolRunResult; - stats?: ClaimOwnershipResult['stats']; - }, - { - result: FillPoolResult; - stats?: ClaimOwnershipResult['stats']; - } ->; - export type ClaimAndFillPoolResult = Partial> & { result: FillPoolResult; }; @@ -52,66 +39,44 @@ export type TimedFillPoolResult = WithTaskTiming; * @param converter - a function that converts task records to the appropriate task runner */ export async function fillPool( - fetchAvailableTasks: () => Observable>, + fetchAvailableTasks: () => Promise>, converter: (taskInstance: ConcreteTaskInstance) => TaskManagerRunner, run: (tasks: TaskManagerRunner[]) => Promise ): Promise { - return new Promise((resolve, reject) => { - const stopTaskTimer = startTaskTimer(); - const augmentTimingTo = ( - result: FillPoolResult, - stats?: ClaimOwnershipResult['stats'] - ): TimedFillPoolResult => ({ - result, - stats, - timing: stopTaskTimer(), - }); - fetchAvailableTasks() - .pipe( - // each ClaimOwnershipResult will be sequencially consumed an ran using the `run` handler - concatMap(async (res) => - mapResult>( - res, - async ({ docs, stats }) => { - if (!docs.length) { - return asOk({ result: TaskPoolRunResult.NoTaskWereRan, stats }); - } - return asOk( - await run(docs.map(converter)).then((runResult) => ({ - result: runResult, - stats, - })) - ); - }, - async (fillPoolResult) => asErr({ result: fillPoolResult }) - ) - ), - // when the final call to `run` completes, we'll complete the stream and emit the - // final accumulated result - last() - ) - .subscribe( - (claimResults) => { - resolve( - mapResult( - claimResults, - ({ result, stats }) => { - switch (result) { - case TaskPoolRunResult.RanOutOfCapacity: - return augmentTimingTo(FillPoolResult.RanOutOfCapacity, stats); - case TaskPoolRunResult.RunningAtCapacity: - return augmentTimingTo(FillPoolResult.RunningAtCapacity, stats); - case TaskPoolRunResult.NoTaskWereRan: - return augmentTimingTo(FillPoolResult.NoTasksClaimed, stats); - default: - return augmentTimingTo(FillPoolResult.PoolFilled, stats); - } - }, - ({ result, stats }) => augmentTimingTo(result, stats) - ) - ); - }, - (err) => reject(err) - ); + const stopTaskTimer = startTaskTimer(); + const augmentTimingTo = ( + result: FillPoolResult, + stats?: ClaimOwnershipResult['stats'] + ): TimedFillPoolResult => ({ + result, + stats, + timing: stopTaskTimer(), }); + + const claimResults = await fetchAvailableTasks(); + if (isOk(claimResults)) { + if (!claimResults.value.docs.length) { + return augmentTimingTo(FillPoolResult.NoTasksClaimed, claimResults.value.stats); + } + + const taskPoolRunResult = await run(claimResults.value.docs.map(converter)).then( + (runResult) => ({ + result: runResult, + stats: claimResults.value.stats, + }) + ); + + switch (taskPoolRunResult.result) { + case TaskPoolRunResult.RanOutOfCapacity: + return augmentTimingTo(FillPoolResult.RanOutOfCapacity, taskPoolRunResult.stats); + case TaskPoolRunResult.RunningAtCapacity: + return augmentTimingTo(FillPoolResult.RunningAtCapacity, taskPoolRunResult.stats); + case TaskPoolRunResult.NoTaskWereRan: + return augmentTimingTo(FillPoolResult.NoTasksClaimed, taskPoolRunResult.stats); + default: + return augmentTimingTo(FillPoolResult.PoolFilled, taskPoolRunResult.stats); + } + } + + return augmentTimingTo(claimResults.error); } diff --git a/x-pack/plugins/task_manager/server/polling_lifecycle.test.ts b/x-pack/plugins/task_manager/server/polling_lifecycle.test.ts index 6e3b7416ad787..1f244f7f4c8a5 100644 --- a/x-pack/plugins/task_manager/server/polling_lifecycle.test.ts +++ b/x-pack/plugins/task_manager/server/polling_lifecycle.test.ts @@ -6,7 +6,7 @@ */ import sinon from 'sinon'; -import { Observable, of, Subject } from 'rxjs'; +import { of, Subject } from 'rxjs'; import { TaskPollingLifecycle, claimAvailableTasks, TaskLifecycleEvent } from './polling_lifecycle'; import { createInitialMiddleware } from './lib/middleware'; @@ -16,9 +16,8 @@ import { mockLogger } from './test_utils'; import { taskClaimingMock } from './queries/task_claiming.mock'; import { TaskClaiming, ClaimOwnershipResult } from './queries/task_claiming'; import type { TaskClaiming as TaskClaimingClass } from './queries/task_claiming'; -import { asOk, Err, isErr, isOk, Result } from './lib/result_type'; +import { asOk, Err, isErr, isOk, Ok } from './lib/result_type'; import { FillPoolResult } from './lib/fill_pool'; -import { ElasticsearchResponseError } from './lib/identify_es_error'; import { executionContextServiceMock } from '@kbn/core/server/mocks'; import { TaskCost } from './task'; import { CLAIM_STRATEGY_MGET, DEFAULT_KIBANAS_PER_PARTITION } from './config'; @@ -40,6 +39,18 @@ jest.mock('./constants', () => ({ CONCURRENCY_ALLOW_LIST_BY_TASK_TYPE: ['report', 'quickReport'], })); +interface EsError extends Error { + name: string; + statusCode: number; + meta: { + body: { + error: { + type: string; + }; + }; + }; +} + describe('TaskPollingLifecycle', () => { let clock: sinon.SinonFakeTimers; const taskManagerLogger = mockLogger(); @@ -273,18 +284,19 @@ describe('TaskPollingLifecycle', () => { describe('claimAvailableTasks', () => { test('should claim Available Tasks when there are available workers', async () => { + const claimResult = { + docs: [], + stats: { tasksUpdated: 0, tasksConflicted: 0, tasksClaimed: 0 }, + }; const logger = mockLogger(); const taskClaiming = taskClaimingMock.create({}); taskClaiming.claimAvailableTasksIfCapacityIsAvailable.mockImplementation(() => - of( - asOk({ - docs: [], - stats: { tasksUpdated: 0, tasksConflicted: 0, tasksClaimed: 0 }, - }) - ) + Promise.resolve(asOk(claimResult)) ); - expect(isOk(await getFirstAsPromise(claimAvailableTasks(taskClaiming, logger)))).toBeTruthy(); + const result = await claimAvailableTasks(taskClaiming, logger); + expect(isOk(result)).toBeTruthy(); + expect((result as Ok).value).toEqual(claimResult); expect(taskClaiming.claimAvailableTasksIfCapacityIsAvailable).toHaveBeenCalledTimes(1); }); @@ -296,56 +308,54 @@ describe('TaskPollingLifecycle', () => { test('handles failure due to inline scripts being disabled', async () => { const logger = mockLogger(); const taskClaiming = taskClaimingMock.create({}); - taskClaiming.claimAvailableTasksIfCapacityIsAvailable.mockImplementation( - () => - new Observable>((observer) => { - observer.error({ - name: 'ResponseError', - meta: { - body: { - error: { - root_cause: [ - { - type: 'illegal_argument_exception', - reason: 'cannot execute [inline] scripts', - }, - ], - type: 'search_phase_execution_exception', - reason: 'all shards failed', - phase: 'query', - grouped: true, - failed_shards: [ - { - shard: 0, - index: '.kibana_task_manager_1', - node: '24A4QbjHSK6prvtopAKLKw', - reason: { - type: 'illegal_argument_exception', - reason: 'cannot execute [inline] scripts', - }, - }, - ], - caused_by: { - type: 'illegal_argument_exception', - reason: 'cannot execute [inline] scripts', - caused_by: { - type: 'illegal_argument_exception', - reason: 'cannot execute [inline] scripts', - }, - }, + taskClaiming.claimAvailableTasksIfCapacityIsAvailable.mockImplementation(() => { + const error = new Error(`fail`) as EsError; + error.name = 'ResponseError'; + error.meta = { + body: { + error: { + // @ts-ignore + root_cause: [ + { + type: 'illegal_argument_exception', + reason: 'cannot execute [inline] scripts', + }, + ], + type: 'search_phase_execution_exception', + reason: 'all shards failed', + phase: 'query', + grouped: true, + failed_shards: [ + { + shard: 0, + index: '.kibana_task_manager_1', + node: '24A4QbjHSK6prvtopAKLKw', + reason: { + type: 'illegal_argument_exception', + reason: 'cannot execute [inline] scripts', }, - status: 400, + }, + ], + caused_by: { + type: 'illegal_argument_exception', + reason: 'cannot execute [inline] scripts', + caused_by: { + type: 'illegal_argument_exception', + reason: 'cannot execute [inline] scripts', }, }, - statusCode: 400, - } as ElasticsearchResponseError); - }) - ); + }, + status: 400, + }, + }; + error.statusCode = 400; + throw error; + }); - const err = await getFirstAsPromise(claimAvailableTasks(taskClaiming, logger)); + const claimErr = await claimAvailableTasks(taskClaiming, logger); - expect(isErr(err)).toBeTruthy(); - expect((err as Err).error).toEqual(FillPoolResult.Failed); + expect(isErr(claimErr)).toBeTruthy(); + expect((claimErr as Err).error).toEqual(FillPoolResult.Failed); expect(logger.warn).toHaveBeenCalledTimes(1); expect(logger.warn).toHaveBeenCalledWith( @@ -358,7 +368,7 @@ describe('TaskPollingLifecycle', () => { test('should emit event when polling is successful', async () => { clock.restore(); mockTaskClaiming.claimAvailableTasksIfCapacityIsAvailable.mockImplementation(() => - of( + Promise.resolve( asOk({ docs: [], stats: { tasksUpdated: 0, tasksConflicted: 0, tasksClaimed: 0 }, @@ -398,7 +408,7 @@ describe('TaskPollingLifecycle', () => { test('should set utilization to max when capacity is not fully reached but there are tasks left unclaimed', async () => { clock.restore(); mockTaskClaiming.claimAvailableTasksIfCapacityIsAvailable.mockImplementation(() => - of( + Promise.resolve( asOk({ docs: [], stats: { tasksUpdated: 0, tasksConflicted: 0, tasksClaimed: 0, tasksLeftUnclaimed: 2 }, @@ -466,7 +476,7 @@ describe('TaskPollingLifecycle', () => { test('should emit success event when polling is successful', async () => { clock.restore(); mockTaskClaiming.claimAvailableTasksIfCapacityIsAvailable.mockImplementation(() => - of( + Promise.resolve( asOk({ docs: [], stats: { tasksUpdated: 0, tasksConflicted: 0, tasksClaimed: 0 }, @@ -549,7 +559,7 @@ describe('TaskPollingLifecycle', () => { test('should emit failure event when polling is successful but individual task errors reported', async () => { clock.restore(); mockTaskClaiming.claimAvailableTasksIfCapacityIsAvailable.mockImplementation(() => - of( + Promise.resolve( asOk({ docs: [], stats: { tasksUpdated: 0, tasksConflicted: 0, tasksClaimed: 0, tasksErrors: 2 }, @@ -588,12 +598,6 @@ describe('TaskPollingLifecycle', () => { }); }); -function getFirstAsPromise(obs$: Observable): Promise { - return new Promise((resolve, reject) => { - obs$.subscribe(resolve, reject); - }); -} - type RetryableFunction = () => boolean; const RETRY_UNTIL_DEFAULT_COUNT = 20; diff --git a/x-pack/plugins/task_manager/server/polling_lifecycle.ts b/x-pack/plugins/task_manager/server/polling_lifecycle.ts index 7d8be75c2330c..0b1710ae7fa2f 100644 --- a/x-pack/plugins/task_manager/server/polling_lifecycle.ts +++ b/x-pack/plugins/task_manager/server/polling_lifecycle.ts @@ -12,7 +12,7 @@ import { tap } from 'rxjs'; import { UsageCounter } from '@kbn/usage-collection-plugin/server'; import type { Logger, ExecutionContextStart } from '@kbn/core/server'; -import { Result, asErr, mapErr, asOk, map, mapOk } from './lib/result_type'; +import { Result, asErr, mapErr, asOk, map, mapOk, isOk } from './lib/result_type'; import { ManagedConfiguration } from './lib/create_managed_configuration'; import { TaskManagerConfig, CLAIM_STRATEGY_UPDATE_BY_QUERY } from './config'; @@ -246,18 +246,19 @@ export class TaskPollingLifecycle implements ITaskEventEmitter => { return fillPool( // claim available tasks - () => { - return claimAvailableTasks(this.taskClaiming, this.logger).pipe( - tap( - mapOk(({ timing }: ClaimOwnershipResult) => { - if (timing) { - this.emitEvent( - asTaskManagerStatEvent('claimDuration', asOk(timing.stop - timing.start)) - ); - } - }) - ) - ); + async () => { + const result = await claimAvailableTasks(this.taskClaiming, this.logger); + + if (isOk(result) && result.value.timing) { + this.emitEvent( + asTaskManagerStatEvent( + 'claimDuration', + asOk(result.value.timing.stop - result.value.timing.start) + ) + ); + } + + return result; }, // wrap each task in a Task Runner this.createTaskRunnerForTask, @@ -352,39 +353,23 @@ export class TaskPollingLifecycle implements ITaskEventEmitter> { - return new Observable((observer) => { - taskClaiming - .claimAvailableTasksIfCapacityIsAvailable({ - claimOwnershipUntil: intervalFromNow('30s')!, - }) - .subscribe( - (claimResult) => { - observer.next(claimResult); - }, - (ex) => { - // if the `taskClaiming` stream errors out we want to catch it and see if - // we can identify the reason - // if we can - we emit an FillPoolResult error rather than erroring out the wrapping Observable - // returned by `claimAvailableTasks` - if (isEsCannotExecuteScriptError(ex)) { - logger.warn( - `Task Manager cannot operate when inline scripts are disabled in Elasticsearch` - ); - observer.next(asErr(FillPoolResult.Failed)); - observer.complete(); - } else { - const esError = identifyEsError(ex); - // as we could't identify the reason - we'll error out the wrapping Observable too - observer.error(esError.length > 0 ? esError : ex); - } - }, - () => { - observer.complete(); - } - ); - }); +): Promise> { + try { + return taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: intervalFromNow('30s')!, + }); + } catch (err) { + // if we can identify the reason for the error, emit a FillPoolResult error + if (isEsCannotExecuteScriptError(err)) { + logger.warn(`Task Manager cannot operate when inline scripts are disabled in Elasticsearch`); + return asErr(FillPoolResult.Failed); + } else { + const esError = identifyEsError(err); + // as we could't identify the reason - propagate the error + throw esError.length > 0 ? esError : err; + } + } } diff --git a/x-pack/plugins/task_manager/server/queries/task_claiming.ts b/x-pack/plugins/task_manager/server/queries/task_claiming.ts index 5116c25c38f3f..c9bca31755408 100644 --- a/x-pack/plugins/task_manager/server/queries/task_claiming.ts +++ b/x-pack/plugins/task_manager/server/queries/task_claiming.ts @@ -8,8 +8,7 @@ /* * This module contains helpers for managing the task manager storage layer. */ -import { Subject, Observable, of } from 'rxjs'; -import { map } from 'rxjs'; +import { Subject, Observable } from 'rxjs'; import { groupBy, isPlainObject } from 'lodash'; import { Logger } from '@kbn/core/server'; @@ -168,29 +167,34 @@ export class TaskClaiming { return this.events$; } - public claimAvailableTasksIfCapacityIsAvailable( + public async claimAvailableTasksIfCapacityIsAvailable( claimingOptions: Omit - ): Observable> { + ): Promise> { if (this.getAvailableCapacity()) { - const opts: TaskClaimerOpts = { - batches: this.getClaimingBatches(), - claimOwnershipUntil: claimingOptions.claimOwnershipUntil, - taskStore: this.taskStore, - events$: this.events$, - getCapacity: this.getAvailableCapacity, - unusedTypes: this.unusedTypes, - definitions: this.definitions, - taskMaxAttempts: this.taskMaxAttempts, - excludedTaskTypes: this.excludedTaskTypes, - logger: this.logger, - taskPartitioner: this.taskPartitioner, - }; - return this.taskClaimer(opts).pipe(map((claimResult) => asOk(claimResult))); + try { + const opts: TaskClaimerOpts = { + batches: this.getClaimingBatches(), + claimOwnershipUntil: claimingOptions.claimOwnershipUntil, + taskStore: this.taskStore, + events$: this.events$, + getCapacity: this.getAvailableCapacity, + unusedTypes: this.unusedTypes, + definitions: this.definitions, + taskMaxAttempts: this.taskMaxAttempts, + excludedTaskTypes: this.excludedTaskTypes, + logger: this.logger, + taskPartitioner: this.taskPartitioner, + }; + const result = await this.taskClaimer(opts); + return asOk(result); + } catch (err) { + throw err; + } } this.logger.debug( `[Task Ownership]: Task Manager has skipped Claiming Ownership of available tasks at it has ran out Available Workers.` ); - return of(asErr(FillPoolResult.NoAvailableWorkers)); + return asErr(FillPoolResult.NoAvailableWorkers); } } diff --git a/x-pack/plugins/task_manager/server/task_claimers/index.ts b/x-pack/plugins/task_manager/server/task_claimers/index.ts index a6e013cd8b338..4b6c8b96d6ca4 100644 --- a/x-pack/plugins/task_manager/server/task_claimers/index.ts +++ b/x-pack/plugins/task_manager/server/task_claimers/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { Subject, Observable } from 'rxjs'; +import { Subject } from 'rxjs'; import { Logger } from '@kbn/core/server'; import minimatch from 'minimatch'; @@ -45,7 +45,7 @@ export interface ClaimOwnershipResult { timing?: TaskTiming; } -export type TaskClaimerFn = (opts: TaskClaimerOpts) => Observable; +export type TaskClaimerFn = (opts: TaskClaimerOpts) => Promise; let WarnedOnInvalidClaimer = false; diff --git a/x-pack/plugins/task_manager/server/task_claimers/strategy_mget.test.ts b/x-pack/plugins/task_manager/server/task_claimers/strategy_mget.test.ts index 593be2d5497ec..0d3560c3bec6e 100644 --- a/x-pack/plugins/task_manager/server/task_claimers/strategy_mget.test.ts +++ b/x-pack/plugins/task_manager/server/task_claimers/strategy_mget.test.ts @@ -8,7 +8,7 @@ import _ from 'lodash'; import sinon from 'sinon'; import { v4 as uuidv4 } from 'uuid'; -import { filter, take, toArray } from 'rxjs'; +import { filter, take } from 'rxjs'; import { CLAIM_STRATEGY_MGET, DEFAULT_KIBANAS_PER_PARTITION } from '../config'; @@ -31,7 +31,6 @@ import { TaskClaimingOpts, TASK_MANAGER_MARK_AS_CLAIMED, } from '../queries/task_claiming'; -import { Observable } from 'rxjs'; import { taskStoreMock } from '../task_store.mock'; import apm from 'elastic-apm-node'; import { TASK_MANAGER_TRANSACTION_TYPE } from '../task_running'; @@ -223,21 +222,15 @@ describe('TaskClaiming', () => { hits, }); - const resultsOrErr = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable(claimingOpts) - ); - for (const resultOrErr of resultsOrErr) { - if (!isOk(resultOrErr)) { - expect(resultOrErr).toBe(undefined); - } + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable(claimingOpts); + if (!isOk(resultOrErr)) { + expect(resultOrErr).toBe(undefined); } - const results = resultsOrErr.map((resultOrErr) => { - if (!isOk(resultOrErr)) { - expect(resultOrErr).toBe(undefined); - } - return unwrap(resultOrErr) as ClaimOwnershipResult; - }); + if (!isOk(resultOrErr)) { + expect(resultOrErr).toBe(undefined); + } + const result = unwrap(resultOrErr) as ClaimOwnershipResult; expect(apm.startTransaction).toHaveBeenCalledWith( TASK_MANAGER_MARK_AS_CLAIMED, @@ -247,14 +240,14 @@ describe('TaskClaiming', () => { expect(store.msearch.mock.calls).toMatchObject({}); expect(store.getDocVersions.mock.calls).toMatchObject({}); - return results.map((result, index) => ({ + return { result, args: { - search: store.msearch.mock.calls[index][0] as SearchOpts[] & { + search: store.msearch.mock.calls[0][0] as SearchOpts[] & { query: MustNotCondition; }, }, - })); + }; } test('makes calls to APM as expected when markAvailableTasksAsClaimed throws error', async () => { @@ -287,11 +280,9 @@ describe('TaskClaiming', () => { store.msearch.mockRejectedValue(new Error('Oh no')); await expect( - getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ - claimOwnershipUntil: new Date(), - }) - ) + taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }) ).rejects.toMatchInlineSnapshot(`[Error: Oh no]`); expect(apm.startTransaction).toHaveBeenCalledWith( @@ -369,9 +360,9 @@ describe('TaskClaiming', () => { taskPartitioner, }); - const [resultOrErr] = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ); + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); if (!isOk(resultOrErr)) { expect(resultOrErr).toBe(undefined); @@ -479,9 +470,9 @@ describe('TaskClaiming', () => { taskPartitioner, }); - const [resultOrErr] = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ); + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); if (!isOk(resultOrErr)) { expect(resultOrErr).toBe(undefined); @@ -586,9 +577,9 @@ describe('TaskClaiming', () => { taskPartitioner, }); - const [resultOrErr] = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ); + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); if (!isOk(resultOrErr)) { expect(resultOrErr).toBe(undefined); @@ -683,9 +674,9 @@ describe('TaskClaiming', () => { taskPartitioner, }); - const [resultOrErr] = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ); + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); if (!isOk(resultOrErr)) { expect(resultOrErr).toBe(undefined); @@ -771,9 +762,9 @@ describe('TaskClaiming', () => { taskPartitioner, }); - const [resultOrErr] = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ); + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); if (!isOk(resultOrErr)) { expect(resultOrErr).toBe(undefined); @@ -837,9 +828,9 @@ describe('TaskClaiming', () => { taskPartitioner, }); - const [resultOrErr] = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ); + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); if (!isOk(resultOrErr)) { expect(resultOrErr).toBe(undefined); @@ -930,9 +921,9 @@ describe('TaskClaiming', () => { taskPartitioner, }); - const [resultOrErr] = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ); + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); if (!isOk(resultOrErr)) { expect(resultOrErr).toBe(undefined); @@ -1023,9 +1014,9 @@ describe('TaskClaiming', () => { taskPartitioner, }); - const [resultOrErr] = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ); + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); if (!isOk(resultOrErr)) { expect(resultOrErr).toBe(undefined); @@ -1122,9 +1113,9 @@ describe('TaskClaiming', () => { taskPartitioner, }); - const [resultOrErr] = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ); + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); if (!isOk(resultOrErr)) { expect(resultOrErr).toBe(undefined); @@ -1253,9 +1244,9 @@ describe('TaskClaiming', () => { taskPartitioner, }); - const [resultOrErr] = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ); + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); if (!isOk(resultOrErr)) { expect(resultOrErr).toBe(undefined); @@ -1381,9 +1372,9 @@ describe('TaskClaiming', () => { taskPartitioner, }); - const [resultOrErr] = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ); + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); if (!isOk(resultOrErr)) { expect(resultOrErr).toBe(undefined); @@ -1508,9 +1499,7 @@ describe('TaskClaiming', () => { }); await expect(() => - getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ) + taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) ).rejects.toThrowErrorMatchingInlineSnapshot(`"oh no"`); expect(apm.startTransaction).toHaveBeenCalledWith( @@ -1624,9 +1613,9 @@ describe('TaskClaiming', () => { taskPartitioner, }); - const [resultOrErr] = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ); + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); if (!isOk(resultOrErr)) { expect(resultOrErr).toBe(undefined); @@ -1757,9 +1746,9 @@ describe('TaskClaiming', () => { taskPartitioner, }); - const [resultOrErr] = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ); + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); if (!isOk(resultOrErr)) { expect(resultOrErr).toBe(undefined); @@ -1874,9 +1863,7 @@ describe('TaskClaiming', () => { }); await expect(() => - getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) - ) + taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ claimOwnershipUntil: new Date() }) ).rejects.toThrowErrorMatchingInlineSnapshot(`"oh no"`); expect(apm.startTransaction).toHaveBeenCalledWith( @@ -1964,13 +1951,11 @@ describe('TaskClaiming', () => { claimOwnershipUntil: new Date(), }, }); - const [ - { - args: { - search: [{ query }], - }, + const { + args: { + search: [{ query }], }, - ] = claimedResults; + } = claimedResults; expect(query).toMatchInlineSnapshot(` Object { @@ -2122,13 +2107,11 @@ describe('TaskClaiming', () => { claimOwnershipUntil: new Date(), }, }); - const [ - { - args: { - search: [{ query }], - }, + const { + args: { + search: [{ query }], }, - ] = claimedResults; + } = claimedResults; expect(taskManagerLogger.warn).toHaveBeenCalledWith( 'Background task node "test" has no assigned partitions, claiming against all partitions', @@ -2404,11 +2387,9 @@ describe('TaskClaiming', () => { ) .toPromise(); - await getFirstAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ - claimOwnershipUntil: new Date(), - }) - ); + await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); const event = await promise; expect(event).toMatchObject( @@ -2476,14 +2457,3 @@ function mockInstance(instance: Partial = {}) { instance ); } - -function getFirstAsPromise(obs$: Observable): Promise { - return new Promise((resolve, reject) => { - obs$.subscribe(resolve, reject); - }); -} -function getAllAsPromise(obs$: Observable): Promise { - return new Promise((resolve, reject) => { - obs$.pipe(toArray()).subscribe(resolve, reject); - }); -} diff --git a/x-pack/plugins/task_manager/server/task_claimers/strategy_mget.ts b/x-pack/plugins/task_manager/server/task_claimers/strategy_mget.ts index 407cf6b90dd6c..4b7e5ec6b3691 100644 --- a/x-pack/plugins/task_manager/server/task_claimers/strategy_mget.ts +++ b/x-pack/plugins/task_manager/server/task_claimers/strategy_mget.ts @@ -14,7 +14,7 @@ // capacity and the cost of each task type to run import apm, { Logger } from 'elastic-apm-node'; -import { Subject, Observable } from 'rxjs'; +import { Subject } from 'rxjs'; import { createWrappedLogger } from '../lib/wrapped_logger'; import { TaskTypeDictionary } from '../task_type_dictionary'; @@ -70,24 +70,9 @@ interface OwnershipClaimingOpts { const SIZE_MULTIPLIER_FOR_TASK_FETCH = 4; -export function claimAvailableTasksMget(opts: TaskClaimerOpts): Observable { - const taskClaimOwnership$ = new Subject(); - - claimAvailableTasksApm(opts) - .then((result) => { - taskClaimOwnership$.next(result); - }) - .catch((err) => { - taskClaimOwnership$.error(err); - }) - .finally(() => { - taskClaimOwnership$.complete(); - }); - - return taskClaimOwnership$; -} - -async function claimAvailableTasksApm(opts: TaskClaimerOpts): Promise { +export async function claimAvailableTasksMget( + opts: TaskClaimerOpts +): Promise { const apmTrans = apm.startTransaction( TASK_MANAGER_MARK_AS_CLAIMED, TASK_MANAGER_TRANSACTION_TYPE diff --git a/x-pack/plugins/task_manager/server/task_claimers/strategy_update_by_query.test.ts b/x-pack/plugins/task_manager/server/task_claimers/strategy_update_by_query.test.ts index 9453bced9f7ba..13e6faf2de0fd 100644 --- a/x-pack/plugins/task_manager/server/task_claimers/strategy_update_by_query.test.ts +++ b/x-pack/plugins/task_manager/server/task_claimers/strategy_update_by_query.test.ts @@ -7,7 +7,7 @@ import _ from 'lodash'; import { v1 as uuidv1, v4 as uuidv4 } from 'uuid'; -import { filter, take, toArray } from 'rxjs'; +import { filter, take } from 'rxjs'; import { TaskStatus, ConcreteTaskInstance, TaskPriority } from '../task'; import { SearchOpts, StoreOpts, UpdateByQueryOpts, UpdateByQuerySearchOpts } from '../task_store'; @@ -22,7 +22,6 @@ import { TaskClaimingOpts, TASK_MANAGER_MARK_AS_CLAIMED, } from '../queries/task_claiming'; -import { Observable } from 'rxjs'; import { taskStoreMock } from '../task_store.mock'; import apm from 'elastic-apm-node'; import { TASK_MANAGER_TRANSACTION_TYPE } from '../task_running'; @@ -174,21 +173,12 @@ describe('TaskClaiming', () => { versionConflicts, }); - const resultsOrErr = await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable(claimingOpts) - ); - for (const resultOrErr of resultsOrErr) { - if (!isOk(resultOrErr)) { - expect(resultOrErr).toBe(undefined); - } + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable(claimingOpts); + if (!isOk(resultOrErr)) { + expect(resultOrErr).toBe(undefined); } - const results = resultsOrErr.map((resultOrErr) => { - if (!isOk(resultOrErr)) { - expect(resultOrErr).toBe(undefined); - } - return unwrap(resultOrErr) as ClaimOwnershipResult; - }); + const result = unwrap(resultOrErr) as ClaimOwnershipResult; expect(apm.startTransaction).toHaveBeenCalledWith( TASK_MANAGER_MARK_AS_CLAIMED, @@ -200,18 +190,19 @@ describe('TaskClaiming', () => { max_docs: getCapacity(), }); expect(store.fetch.mock.calls[0][0]).toMatchObject({ size: getCapacity() }); - return results.map((result, index) => ({ + return { result, + store, args: { - search: store.fetch.mock.calls[index][0] as SearchOpts & { + search: store.fetch.mock.calls[0][0] as SearchOpts & { query: MustNotCondition; }, - updateByQuery: store.updateByQuery.mock.calls[index] as [ + updateByQuery: store.updateByQuery.mock.calls[0] as [ UpdateByQuerySearchOpts, UpdateByQueryOpts ], }, - })); + }; } test('makes calls to APM as expected when markAvailableTasksAsClaimed throws error', async () => { @@ -243,11 +234,9 @@ describe('TaskClaiming', () => { store.updateByQuery.mockRejectedValue(new Error('Oh no')); await expect( - getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ - claimOwnershipUntil: new Date(), - }) - ) + taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }) ).rejects.toMatchInlineSnapshot(`[Error: Oh no]`); expect(apm.startTransaction).toHaveBeenCalledWith( @@ -280,13 +269,11 @@ describe('TaskClaiming', () => { }, }); - const [ - { - args: { - updateByQuery: [{ query, sort }], - }, + const { + args: { + updateByQuery: [{ query, sort }], }, - ] = await testClaimAvailableTasks({ + } = await testClaimAvailableTasks({ storeOpts: { definitions, }, @@ -446,7 +433,7 @@ if (doc['task.runAt'].size()!=0) { createTaskRunner: jest.fn(), }, }); - const results = await testClaimAvailableTasks({ + const { store } = await testClaimAvailableTasks({ storeOpts: { taskManagerId, definitions, @@ -470,10 +457,9 @@ if (doc['task.runAt'].size()!=0) { }, }); - expect(results.length).toEqual(4); - - expect(results[0].args.updateByQuery[1].max_docs).toEqual(10); - expect(results[0].args.updateByQuery[0].script).toMatchObject({ + expect(store.updateByQuery).toHaveBeenCalledTimes(4); + expect(store.updateByQuery.mock.calls[0][1]?.max_docs).toEqual(10); + expect(store.updateByQuery.mock.calls[0][0]?.script).toMatchObject({ source: expect.any(String), lang: 'painless', params: { @@ -492,8 +478,8 @@ if (doc['task.runAt'].size()!=0) { }, }); - expect(results[1].args.updateByQuery[1].max_docs).toEqual(1); - expect(results[1].args.updateByQuery[0].script).toMatchObject({ + expect(store.updateByQuery.mock.calls[1][1]?.max_docs).toEqual(1); + expect(store.updateByQuery.mock.calls[1][0]?.script).toMatchObject({ source: expect.any(String), lang: 'painless', params: { @@ -507,14 +493,15 @@ if (doc['task.runAt'].size()!=0) { 'anotherLimitedToOne', 'limitedToTwo', ], + unusedTaskTypes: [], taskMaxAttempts: { limitedToOne: maxAttempts, }, }, }); - expect(results[2].args.updateByQuery[1].max_docs).toEqual(1); - expect(results[2].args.updateByQuery[0].script).toMatchObject({ + expect(store.updateByQuery.mock.calls[2][1]?.max_docs).toEqual(1); + expect(store.updateByQuery.mock.calls[2][0]?.script).toMatchObject({ source: expect.any(String), lang: 'painless', params: { @@ -534,8 +521,8 @@ if (doc['task.runAt'].size()!=0) { }, }); - expect(results[3].args.updateByQuery[1].max_docs).toEqual(2); - expect(results[3].args.updateByQuery[0].script).toMatchObject({ + expect(store.updateByQuery.mock.calls[3][1]?.max_docs).toEqual(2); + expect(store.updateByQuery.mock.calls[3][0]?.script).toMatchObject({ source: expect.any(String), lang: 'painless', params: { @@ -556,6 +543,130 @@ if (doc['task.runAt'].size()!=0) { }); }); + test('it should return tasks from all batches', async () => { + const maxAttempts = _.random(2, 43); + const definitions = new TaskTypeDictionary(mockLogger()); + const taskManagerId = uuidv1(); + definitions.registerTaskDefinitions({ + unlimited: { + title: 'unlimited', + createTaskRunner: jest.fn(), + }, + limitedToZero: { + title: 'limitedToZero', + maxConcurrency: 0, + createTaskRunner: jest.fn(), + }, + anotherUnlimited: { + title: 'anotherUnlimited', + createTaskRunner: jest.fn(), + }, + finalUnlimited: { + title: 'finalUnlimited', + createTaskRunner: jest.fn(), + }, + limitedToOne: { + title: 'limitedToOne', + maxConcurrency: 1, + createTaskRunner: jest.fn(), + }, + anotherLimitedToOne: { + title: 'anotherLimitedToOne', + maxConcurrency: 1, + createTaskRunner: jest.fn(), + }, + limitedToTwo: { + title: 'limitedToTwo', + maxConcurrency: 2, + createTaskRunner: jest.fn(), + }, + }); + const store = taskStoreMock.create({ taskManagerId }); + store.convertToSavedObjectIds.mockImplementation((ids) => ids.map((id) => `task:${id}`)); + + // mock the return values for 4 batches + const batch1Docs = [mockInstance({ id: `task:id-1` })]; + store.fetch.mockResolvedValueOnce({ docs: batch1Docs, versionMap: new Map() }); + store.updateByQuery.mockResolvedValueOnce({ + updated: batch1Docs.length, + version_conflicts: 0, + total: batch1Docs.length, + }); + + const batch2Docs = [mockInstance({ id: `task:id-2` })]; + store.fetch.mockResolvedValueOnce({ docs: batch2Docs, versionMap: new Map() }); + store.updateByQuery.mockResolvedValueOnce({ + updated: batch2Docs.length, + version_conflicts: 1, + total: batch2Docs.length, + }); + + const batch3Docs = [mockInstance({ id: `task:id-3` }), mockInstance({ id: `task:id-4` })]; + store.fetch.mockResolvedValueOnce({ docs: batch3Docs, versionMap: new Map() }); + store.updateByQuery.mockResolvedValueOnce({ + updated: batch3Docs.length, + version_conflicts: 0, + total: batch3Docs.length, + }); + + const batch4Docs = [ + mockInstance({ id: `task:id-5` }), + mockInstance({ id: `task:id-6` }), + mockInstance({ id: `task:id-7` }), + ]; + store.fetch.mockResolvedValueOnce({ docs: batch4Docs, versionMap: new Map() }); + store.updateByQuery.mockResolvedValueOnce({ + updated: batch4Docs.length, + version_conflicts: 2, + total: batch4Docs.length, + }); + + const taskClaiming = new TaskClaiming({ + logger: taskManagerLogger, + strategy: 'default', + definitions, + taskStore: store, + maxAttempts, + getAvailableCapacity: (type) => { + switch (type) { + case 'limitedToOne': + case 'anotherLimitedToOne': + return 1; + case 'limitedToTwo': + return 2; + default: + return 10; + } + }, + taskPartitioner, + excludedTaskTypes: [], + unusedTypes: [], + }); + + const resultOrErr = await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); + + if (!isOk(resultOrErr)) { + expect(resultOrErr).toBe(undefined); + } + + const result = unwrap(resultOrErr) as ClaimOwnershipResult; + + expect(store.updateByQuery).toHaveBeenCalledTimes(4); + + // result should be an accumulation of all returned updateByQueryResults + expect(result).toEqual({ + stats: { + tasksClaimed: 7, + tasksConflicted: 3, + tasksUpdated: 7, + }, + timing: expect.any(Object), + docs: [...batch1Docs, ...batch2Docs, ...batch3Docs, ...batch4Docs], + }); + }); + test('it should reduce the available capacity from batch to batch', async () => { const maxAttempts = _.random(2, 43); const definitions = new TaskTypeDictionary(mockLogger()); @@ -576,7 +687,7 @@ if (doc['task.runAt'].size()!=0) { createTaskRunner: jest.fn(), }, }); - const results = await testClaimAvailableTasks({ + const { store } = await testClaimAvailableTasks({ storeOpts: { taskManagerId, definitions, @@ -640,15 +751,15 @@ if (doc['task.runAt'].size()!=0) { }, }); - expect(results.length).toEqual(3); + expect(store.updateByQuery).toHaveBeenCalledTimes(3); - expect(results[0].args.updateByQuery[1].max_docs).toEqual(10); + expect(store.updateByQuery.mock.calls[0][1]?.max_docs).toEqual(10); // only capacity for 3, even though 5 are allowed - expect(results[1].args.updateByQuery[1].max_docs).toEqual(3); + expect(store.updateByQuery.mock.calls[1][1]?.max_docs).toEqual(3); // only capacity for 1, even though 2 are allowed - expect(results[2].args.updateByQuery[1].max_docs).toEqual(1); + expect(store.updateByQuery.mock.calls[2][1]?.max_docs).toEqual(1); }); test('it shuffles the types claimed in batches to ensure no type starves another', async () => { @@ -706,36 +817,34 @@ if (doc['task.runAt'].size()!=0) { }, }); - async function getUpdateByQueryScriptParams() { - return ( - await getAllAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ - claimOwnershipUntil: new Date(), - }) - ) - ).map( - (result, index) => - ( - store.updateByQuery.mock.calls[index][0] as { - query: MustNotCondition; - size: number; - sort: string | string[]; - script: { - params: { - [claimableTaskTypes: string]: string[]; - }; - }; - } - ).script.params.claimableTaskTypes - ); + interface UBQParams { + script: { + params: { + [claimableTaskTypes: string]: string[]; + }; + }; } - const firstCycle = await getUpdateByQueryScriptParams(); + // first cycle + await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); + expect(store.updateByQuery).toHaveBeenCalledTimes(4); + const firstCycle = store.updateByQuery.mock.calls.map( + (call) => (call[0] as UBQParams).script.params.claimableTaskTypes + ); + store.updateByQuery.mockClear(); - const secondCycle = await getUpdateByQueryScriptParams(); - expect(firstCycle.length).toEqual(4); - expect(secondCycle.length).toEqual(4); + // second cycle + await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); + expect(store.updateByQuery).toHaveBeenCalledTimes(4); + const secondCycle = store.updateByQuery.mock.calls.map( + (call) => (call[0] as UBQParams).script.params.claimableTaskTypes + ); + expect(firstCycle).not.toMatchObject(secondCycle); }); @@ -765,13 +874,11 @@ if (doc['task.runAt'].size()!=0) { }, }); - const [ - { - args: { - updateByQuery: [{ query, script }], - }, + const { + args: { + updateByQuery: [{ query, script }], }, - ] = await testClaimAvailableTasks({ + } = await testClaimAvailableTasks({ storeOpts: { definitions, taskManagerId, @@ -871,13 +978,11 @@ if (doc['task.runAt'].size()!=0) { ownerId: taskManagerId, retryAt: claimOwnershipUntil, }; - const [ - { - args: { - updateByQuery: [{ script }], - }, + const { + args: { + updateByQuery: [{ script }], }, - ] = await testClaimAvailableTasks({ + } = await testClaimAvailableTasks({ storeOpts: { taskManagerId, }, @@ -921,14 +1026,12 @@ if (doc['task.runAt'].size()!=0) { ownerId: taskManagerId, }), ]; - const [ - { - result: { docs }, - args: { - search: { query }, - }, + const { + result: { docs }, + args: { + search: { query }, }, - ] = await testClaimAvailableTasks({ + } = await testClaimAvailableTasks({ storeOpts: { taskManagerId, }, @@ -1022,14 +1125,12 @@ if (doc['task.runAt'].size()!=0) { ownerId: taskManagerId, }), ]; - const [ - { - result: { docs }, - args: { - search: { query }, - }, + const { + result: { docs }, + args: { + search: { query }, }, - ] = await testClaimAvailableTasks({ + } = await testClaimAvailableTasks({ storeOpts: { taskManagerId, }, @@ -1135,13 +1236,11 @@ if (doc['task.runAt'].size()!=0) { }), ]; const maxDocs = 10; - const [ - { - result: { - stats: { tasksUpdated, tasksConflicted, tasksClaimed }, - }, + const { + result: { + stats: { tasksUpdated, tasksConflicted, tasksClaimed }, }, - ] = await testClaimAvailableTasks({ + } = await testClaimAvailableTasks({ storeOpts: { taskManagerId, }, @@ -1279,11 +1378,9 @@ if (doc['task.runAt'].size()!=0) { ) .toPromise(); - await getFirstAsPromise( - taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ - claimOwnershipUntil: new Date(), - }) - ); + await taskClaiming.claimAvailableTasksIfCapacityIsAvailable({ + claimOwnershipUntil: new Date(), + }); const event = await promise; expect(event).toMatchObject( @@ -1339,14 +1436,3 @@ function mockInstance(instance: Partial = {}) { instance ); } - -function getFirstAsPromise(obs$: Observable): Promise { - return new Promise((resolve, reject) => { - obs$.subscribe(resolve, reject); - }); -} -function getAllAsPromise(obs$: Observable): Promise { - return new Promise((resolve, reject) => { - obs$.pipe(toArray()).subscribe(resolve, reject); - }); -} diff --git a/x-pack/plugins/task_manager/server/task_claimers/strategy_update_by_query.ts b/x-pack/plugins/task_manager/server/task_claimers/strategy_update_by_query.ts index 807ee8ca4397f..5a4bccb43b984 100644 --- a/x-pack/plugins/task_manager/server/task_claimers/strategy_update_by_query.ts +++ b/x-pack/plugins/task_manager/server/task_claimers/strategy_update_by_query.ts @@ -9,8 +9,7 @@ * This module contains helpers for managing the task manager storage layer. */ import apm from 'elastic-apm-node'; -import { Subject, Observable, from, of } from 'rxjs'; -import { mergeScan } from 'rxjs'; +import { Subject } from 'rxjs'; import { groupBy, pick } from 'lodash'; import { asOk } from '../lib/result_type'; @@ -57,52 +56,47 @@ interface OwnershipClaimingOpts { taskMaxAttempts: Record; } -export function claimAvailableTasksUpdateByQuery( +export async function claimAvailableTasksUpdateByQuery( opts: TaskClaimerOpts -): Observable { +): Promise { const { getCapacity, claimOwnershipUntil, batches, events$, taskStore } = opts; const { definitions, unusedTypes, excludedTaskTypes, taskMaxAttempts } = opts; const initialCapacity = getCapacity(); - return from(batches).pipe( - mergeScan( - (accumulatedResult, batch) => { - const stopTaskTimer = startTaskTimer(); - const capacity = Math.min( - initialCapacity - accumulatedResult.stats.tasksClaimed, - isLimited(batch) ? getCapacity(batch.tasksTypes) : getCapacity() - ); - // if we have no more capacity, short circuit here - if (capacity <= 0) { - return of(accumulatedResult); - } - return from( - executeClaimAvailableTasks({ - claimOwnershipUntil, - size: capacity, - events$, - taskTypes: isLimited(batch) ? new Set([batch.tasksTypes]) : batch.tasksTypes, - taskStore, - definitions, - unusedTypes, - excludedTaskTypes, - taskMaxAttempts, - }).then((result) => { - const { stats, docs } = accumulateClaimOwnershipResults(accumulatedResult, result); - stats.tasksConflicted = correctVersionConflictsForContinuation( - stats.tasksClaimed, - stats.tasksConflicted, - initialCapacity - ); - return { stats, docs, timing: stopTaskTimer() }; - }) - ); - }, - // initialise the accumulation with no results - accumulateClaimOwnershipResults(), - // only run one batch at a time - 1 - ) - ); + + let accumulatedResult = getEmptyClaimOwnershipResult(); + const stopTaskTimer = startTaskTimer(); + for (const batch of batches) { + const capacity = Math.min( + initialCapacity - accumulatedResult.stats.tasksClaimed, + isLimited(batch) ? getCapacity(batch.tasksTypes) : getCapacity() + ); + + // if we have no more capacity, short circuit here + if (capacity <= 0) { + return accumulatedResult; + } + + const result = await executeClaimAvailableTasks({ + claimOwnershipUntil, + size: capacity, + events$, + taskTypes: isLimited(batch) ? new Set([batch.tasksTypes]) : batch.tasksTypes, + taskStore, + definitions, + unusedTypes, + excludedTaskTypes, + taskMaxAttempts, + }); + + accumulatedResult = accumulateClaimOwnershipResults(accumulatedResult, result); + accumulatedResult.stats.tasksConflicted = correctVersionConflictsForContinuation( + accumulatedResult.stats.tasksClaimed, + accumulatedResult.stats.tasksConflicted, + initialCapacity + ); + } + + return { ...accumulatedResult, timing: stopTaskTimer() }; } async function executeClaimAvailableTasks( @@ -230,7 +224,7 @@ function accumulateClaimOwnershipResults( tasksConflicted: stats.tasksConflicted + prev.stats.tasksConflicted, tasksClaimed: stats.tasksClaimed + prev.stats.tasksClaimed, }, - docs, + docs: [...prev.docs, ...docs], timing, }; return res; From 079e929a1cfaac103dea4e301c9b697e561ffd17 Mon Sep 17 00:00:00 2001 From: Cristina Amico Date: Mon, 28 Oct 2024 15:00:00 +0100 Subject: [PATCH 069/135] [Fleet] Fix agents count in agent list table and add tooltip with correct info (#197834) Fixes https://github.com/elastic/kibana/issues/195441 ## Summary Selection agent count on agent list table gets incorrect when there are multiple hosted agents, especially if they are on inactive state. In fact to calculate the selected number of agents we were getting hosted agents, but without taking into account the filtering applied on the page, i.e. we were always getting all the hosted agent (inactive too). This caused the final calculation to be off. In this PR I'm fixing [the query](https://github.com/elastic/kibana/pull/197834/files#diff-9707a4b93a96749876e4cf173a0b39cd5a620e311e2652c5ed4b8670ca7e6becR309-R320) used to get those agents to take in account the filters and I'm also adding a small tooltip that breaks up the number of agents (selected, total, hosted) ### Testing - Make sure to have many agents, hosted and not in different states (inactive, unenrolled) - To make a hosted agent inactive follow the steps explained [here](https://github.com/elastic/kibana/issues/195441) - Verify that the selection numbers are correct: select agents on all pages and hover on the new tooltip shown besides the "selected agents". This number should match the number shown on the actions dropdown ### Screenshots Screenshot 2024-10-25 at 17 00 44 Screenshot 2024-10-25 at 17 00 59 https://github.com/user-attachments/assets/c153c491-29a1-481c-a3e3-25bab6412963 ### 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 - [ ] [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: Elastic Machine --- .../components/agents_selection_status.tsx | 50 ++++++++++++++++--- .../components/bulk_actions.tsx | 2 +- .../components/table_header.tsx | 3 ++ .../hooks/use_fetch_agents_data.tsx | 21 +++++--- .../sections/agents/agent_list_page/index.tsx | 1 + 5 files changed, 62 insertions(+), 15 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agents_selection_status.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agents_selection_status.tsx index 682aaa91af6b6..618a7a6b8e112 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agents_selection_status.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agents_selection_status.tsx @@ -7,7 +7,7 @@ import React from 'react'; import styled from 'styled-components'; -import { EuiFlexGroup, EuiFlexItem, EuiText, EuiButtonEmpty } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiText, EuiButtonEmpty, EuiIconTip } from '@elastic/eui'; import { FormattedMessage, FormattedNumber } from '@kbn/i18n-react'; import { SO_SEARCH_LIMIT } from '../../../../constants'; @@ -33,6 +33,7 @@ const Button = styled(EuiButtonEmpty)` export const AgentsSelectionStatus: React.FunctionComponent<{ totalAgents: number; + totalManagedAgents: number; selectableAgents: number; managedAgentsOnCurrentPage: number; selectionMode: SelectionMode; @@ -41,6 +42,7 @@ export const AgentsSelectionStatus: React.FunctionComponent<{ setSelectedAgents: (agents: Agent[]) => void; }> = ({ totalAgents, + totalManagedAgents, selectableAgents, managedAgentsOnCurrentPage, selectionMode, @@ -71,11 +73,28 @@ export const AgentsSelectionStatus: React.FunctionComponent<{ }} /> ) : ( - + <> + {' '} + + } + /> + )} @@ -96,7 +115,24 @@ export const AgentsSelectionStatus: React.FunctionComponent<{ selectionMode, count: selectedAgents.length, }} - /> + />{' '} + {selectionMode === 'query' && ( + + } + /> + )} {showSelectEverything ? ( diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.tsx index e0235fab01446..c5fd1c2caec81 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/bulk_actions.tsx @@ -77,7 +77,7 @@ export const AgentBulkActions: React.FunctionComponent = ({ const [isRequestDiagnosticsModalOpen, setIsRequestDiagnosticsModalOpen] = useState(false); - // update the query removing the "managed" agents + // update the query removing the "managed" agents in any state (unenrolled, offline, etc) const selectionQuery = useMemo(() => { if (totalManagedAgentIds.length) { const excludedKuery = `${AGENTS_PREFIX}.agent.id : (${totalManagedAgentIds diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_header.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_header.tsx index bcac45801be05..48757ecebdd80 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_header.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/table_header.tsx @@ -21,6 +21,7 @@ export const AgentTableHeader: React.FunctionComponent<{ agentStatus?: { [k in SimplifiedAgentStatus]: number }; totalAgents: number; selectableAgents: number; + totalManagedAgents: number; managedAgentsOnCurrentPage: number; selectionMode: SelectionMode; setSelectionMode: (mode: SelectionMode) => void; @@ -31,6 +32,7 @@ export const AgentTableHeader: React.FunctionComponent<{ }> = ({ agentStatus, totalAgents, + totalManagedAgents, selectableAgents, managedAgentsOnCurrentPage, selectionMode, @@ -47,6 +49,7 @@ export const AgentTableHeader: React.FunctionComponent<{ `policy_id:"${policy.id}"`) - .join(' or '); + // Find all the agents that have managed policies + // to the correct ids we need to build the kuery applying the same filters as the global ones + const managedPoliciesKuery = getKuery({ + search, + selectedAgentPolicies: managedAgentPolicies.map((policy) => policy.id), + selectedTags, + selectedStatus, + }); const response = await sendGetAgents({ - kuery: `NOT (status:unenrolled) and ${policiesKuery}`, + kuery: `${managedPoliciesKuery}`, perPage: SO_SEARCH_LIMIT, - showInactive: true, + showInactive, }); if (response.error) { throw new Error(response.error.message); @@ -350,7 +354,6 @@ export function useFetchAgentsData() { fetchDataAsync(); }, [ - fullAgentPolicyFecher, pagination.currentPage, pagination.pageSize, kuery, @@ -359,8 +362,12 @@ export function useFetchAgentsData() { showInactive, showUpgradeable, displayAgentMetrics, + fullAgentPolicyFecher, allTags, latestAgentActionErrors, + search, + selectedTags, + selectedStatus, notifications.toasts, ] ); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx index 51f3fe68a9d95..a4171a8d5197a 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/index.tsx @@ -434,6 +434,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { {/* Agent total, bulk actions and status bar */} Date: Mon, 28 Oct 2024 15:09:47 +0100 Subject: [PATCH 070/135] [Cloud Security] exclude unknown findings from compliance score calculation (#197829) ## Summary Findings from 3rd party date can have `result.evaluation: unknown`. This leads to incorrect posture/compliance score in our flows. This PR removes these findings from the score calculation and graphical representation. properly introducing `unknown` in the compliance score UX flows will be solved separately - fixes https://github.com/elastic/security-team/issues/10913 ### Screenshots Screenshot 2024-10-25 at 14 19 03 ### 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) - [ ] [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 - [ ] 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)) - [x] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] 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) --- .../src/constants/component_constants.ts | 1 + .../components/compliance_score_bar.test.tsx | 49 +++++++++ .../components/compliance_score_bar.tsx | 18 +++- .../public/components/test_subjects.ts | 4 + .../latest_findings_group_renderer.test.tsx | 101 ++++++++++++++++++ .../latest_findings_group_renderer.tsx | 8 +- .../misconfiguration_preview.tsx | 11 +- 7 files changed, 181 insertions(+), 11 deletions(-) create mode 100644 x-pack/plugins/cloud_security_posture/public/components/compliance_score_bar.test.tsx create mode 100644 x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.test.tsx diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/constants/component_constants.ts b/x-pack/packages/kbn-cloud-security-posture/public/src/constants/component_constants.ts index 04a47f0fc12a1..d4d436e981cc4 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/src/constants/component_constants.ts +++ b/x-pack/packages/kbn-cloud-security-posture/public/src/constants/component_constants.ts @@ -9,4 +9,5 @@ import { euiThemeVars } from '@kbn/ui-theme'; export const statusColors = { passed: euiThemeVars.euiColorSuccess, failed: euiThemeVars.euiColorVis9, + unknown: euiThemeVars.euiColorLightShade, }; diff --git a/x-pack/plugins/cloud_security_posture/public/components/compliance_score_bar.test.tsx b/x-pack/plugins/cloud_security_posture/public/components/compliance_score_bar.test.tsx new file mode 100644 index 0000000000000..166fb1184e0b9 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/components/compliance_score_bar.test.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; 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 { ComplianceScoreBar } from './compliance_score_bar'; +import { + COMPLIANCE_SCORE_BAR_UNKNOWN, + COMPLIANCE_SCORE_BAR_PASSED, + COMPLIANCE_SCORE_BAR_FAILED, +} from './test_subjects'; + +describe('', () => { + it('should display 0% compliance score with status unknown when both passed and failed are 0', () => { + render(); + expect(screen.getByText('0%')).toBeInTheDocument(); + expect(screen.queryByTestId(COMPLIANCE_SCORE_BAR_UNKNOWN)).not.toBeNull(); + expect(screen.queryByTestId(COMPLIANCE_SCORE_BAR_FAILED)).toBeNull(); + expect(screen.queryByTestId(COMPLIANCE_SCORE_BAR_PASSED)).toBeNull(); + }); + + it('should display 100% compliance score when passed is greater than 0 and failed is 0', () => { + render(); + expect(screen.getByText('100%')).toBeInTheDocument(); + expect(screen.queryByTestId(COMPLIANCE_SCORE_BAR_PASSED)).not.toBeNull(); + expect(screen.queryByTestId(COMPLIANCE_SCORE_BAR_FAILED)).toBeNull(); + expect(screen.queryByTestId(COMPLIANCE_SCORE_BAR_UNKNOWN)).toBeNull(); + }); + + it('should display 0% compliance score when passed is 0 and failed is greater than 0', () => { + render(); + expect(screen.getByText('0%')).toBeInTheDocument(); + expect(screen.queryByTestId(COMPLIANCE_SCORE_BAR_FAILED)).not.toBeNull(); + expect(screen.queryByTestId(COMPLIANCE_SCORE_BAR_PASSED)).toBeNull(); + expect(screen.queryByTestId(COMPLIANCE_SCORE_BAR_UNKNOWN)).toBeNull(); + }); + + it('should display 50% compliance score when passed is equal to failed', () => { + render(); + expect(screen.getByText('50%')).toBeInTheDocument(); + expect(screen.queryByTestId(COMPLIANCE_SCORE_BAR_FAILED)).not.toBeNull(); + expect(screen.queryByTestId(COMPLIANCE_SCORE_BAR_PASSED)).not.toBeNull(); + expect(screen.queryByTestId(COMPLIANCE_SCORE_BAR_UNKNOWN)).toBeNull(); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/components/compliance_score_bar.tsx b/x-pack/plugins/cloud_security_posture/public/components/compliance_score_bar.tsx index d4acbc97ab10c..3829542829909 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/compliance_score_bar.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/compliance_score_bar.tsx @@ -11,7 +11,12 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { statusColors } from '@kbn/cloud-security-posture'; import { calculatePostureScore } from '../../common/utils/helpers'; -import { CSP_FINDINGS_COMPLIANCE_SCORE } from './test_subjects'; +import { + CSP_FINDINGS_COMPLIANCE_SCORE, + COMPLIANCE_SCORE_BAR_UNKNOWN, + COMPLIANCE_SCORE_BAR_FAILED, + COMPLIANCE_SCORE_BAR_PASSED, +} from './test_subjects'; /** * This component will take 100% of the width set by the parent @@ -59,12 +64,22 @@ export const ComplianceScoreBar = ({ gap: 1px; `} > + {!totalPassed && !totalFailed && ( + + )} {!!totalPassed && ( )} {!!totalFailed && ( @@ -73,6 +88,7 @@ export const ComplianceScoreBar = ({ flex: ${totalFailed}; background: ${statusColors.failed}; `} + data-test-subj={COMPLIANCE_SCORE_BAR_FAILED} /> )} 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 d29971d3352e3..b609950720ecd 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 @@ -92,3 +92,7 @@ export const CIS_GCP_INPUT_FIELDS_TEST_SUBJECTS = { }; export const SUBSCRIPTION_NOT_ALLOWED_TEST_SUBJECT = 'cloud_posture_page_subscription_not_allowed'; + +export const COMPLIANCE_SCORE_BAR_UNKNOWN = 'complianceScoreBarUnknown'; +export const COMPLIANCE_SCORE_BAR_FAILED = 'complianceScoreBarFailed'; +export const COMPLIANCE_SCORE_BAR_PASSED = 'complianceScoreBarPassed'; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.test.tsx new file mode 100644 index 0000000000000..60aa64aa88141 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.test.tsx @@ -0,0 +1,101 @@ +/* + * 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 } from '@testing-library/react'; +import { useEuiTheme } from '@elastic/eui'; +import { ComplianceBarComponent } from './latest_findings_group_renderer'; +import { RawBucket } from '@kbn/grouping/src'; +import { FindingsGroupingAggregation } from './use_grouped_findings'; +import { ComplianceScoreBar } from '../../../components/compliance_score_bar'; + +jest.mock('@elastic/eui', () => { + const actual = jest.requireActual('@elastic/eui'); + return { + ...actual, + useEuiTheme: jest.fn(), + }; +}); + +jest.mock('../../../components/compliance_score_bar', () => ({ + ComplianceScoreBar: jest.fn(() => null), +})); + +jest.mock('../../../components/cloud_security_grouping'); + +describe('', () => { + beforeEach(() => { + (useEuiTheme as jest.Mock).mockReturnValue({ euiTheme: { size: { s: 's' } } }); + (ComplianceScoreBar as jest.Mock).mockClear(); + }); + + it('renders ComplianceScoreBar with correct totalFailed and totalPassed, when total = failed+passed', () => { + const bucket = { + doc_count: 10, + failedFindings: { + doc_count: 4, + }, + passedFindings: { + doc_count: 6, + }, + } as RawBucket; + + render(); + + expect(ComplianceScoreBar).toHaveBeenCalledWith( + expect.objectContaining({ + totalFailed: 4, + totalPassed: 6, + }), + {} + ); + }); + + it('renders ComplianceScoreBar with correct totalFailed and totalPassed, when there are unknown findings', () => { + const bucket = { + doc_count: 10, + failedFindings: { + doc_count: 3, + }, + passedFindings: { + doc_count: 6, + }, + } as RawBucket; + + render(); + + expect(ComplianceScoreBar).toHaveBeenCalledWith( + expect.objectContaining({ + totalFailed: 3, + totalPassed: 6, + }), + {} + ); + }); + + it('renders ComplianceScoreBar with correct totalFailed and totalPassed, when there are no findings', () => { + const bucket = { + doc_count: 10, + failedFindings: { + doc_count: 0, + }, + passedFindings: { + doc_count: 0, + }, + } as RawBucket; + + render(); + + expect(ComplianceScoreBar).toHaveBeenCalledWith( + expect.objectContaining({ + totalFailed: 0, + totalPassed: 0, + }), + {} + ); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.tsx b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.tsx index b4ad5d15ec8e9..b41c5e4996db1 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/configurations/latest_findings/latest_findings_group_renderer.tsx @@ -198,11 +198,15 @@ const FindingsCountComponent = ({ bucket }: { bucket: RawBucket }) => { +export const ComplianceBarComponent = ({ + bucket, +}: { + bucket: RawBucket; +}) => { const { euiTheme } = useEuiTheme(); const totalFailed = bucket.failedFindings?.doc_count || 0; - const totalPassed = bucket.doc_count - totalFailed; + const totalPassed = bucket.passedFindings?.doc_count || 0; return ( ; - numberOfPassedFindings?: number; - numberOfFailedFindings?: number; }) => { return ( From a1684580bc3d6a54dc7e4375384ebaee1410b186 Mon Sep 17 00:00:00 2001 From: Sid Date: Mon, 28 Oct 2024 15:12:23 +0100 Subject: [PATCH 071/135] [Authz] OAS Descriptions for Route Authz (#197001) Closes https://github.com/elastic/kibana/issues/191714 ## Summary Update process router to generate authz descriptions based on the new Route Security objects. ### 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: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine --- .../src/extract_authz_description.test.ts | 81 +++++++++++++++++++ .../src/extract_authz_description.ts | 60 ++++++++++++++ .../src/process_router.test.ts | 35 +++++++- .../src/process_router.ts | 13 ++- .../src/process_versioned_router.test.ts | 21 +++++ .../src/process_versioned_router.ts | 9 +++ .../kbn-router-to-openapispec/src/type.ts | 3 + .../kbn-router-to-openapispec/tsconfig.json | 2 +- 8 files changed, 219 insertions(+), 5 deletions(-) create mode 100644 packages/kbn-router-to-openapispec/src/extract_authz_description.test.ts create mode 100644 packages/kbn-router-to-openapispec/src/extract_authz_description.ts diff --git a/packages/kbn-router-to-openapispec/src/extract_authz_description.test.ts b/packages/kbn-router-to-openapispec/src/extract_authz_description.test.ts new file mode 100644 index 0000000000000..8da2324e68f02 --- /dev/null +++ b/packages/kbn-router-to-openapispec/src/extract_authz_description.test.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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { schema } from '@kbn/config-schema'; +import { extractAuthzDescription } from './extract_authz_description'; +import { InternalRouterRoute } from './type'; +import { RouteSecurity } from '@kbn/core-http-server'; + +describe('extractAuthzDescription', () => { + it('should return empty if route does not require privileges', () => { + const route: InternalRouterRoute = { + path: '/foo', + options: { access: 'internal' }, + handler: jest.fn(), + validationSchemas: { request: { body: schema.object({}) } }, + method: 'get', + isVersioned: false, + }; + const description = extractAuthzDescription(route.security); + expect(description).toBe(''); + }); + + it('should return route authz description for simple privileges', () => { + const routeSecurity: RouteSecurity = { + authz: { + requiredPrivileges: ['manage_spaces'], + }, + }; + const description = extractAuthzDescription(routeSecurity); + expect(description).toBe('[Authz] Route required privileges: ALL of [manage_spaces].'); + }); + + it('should return route authz description for privilege groups', () => { + { + const routeSecurity: RouteSecurity = { + authz: { + requiredPrivileges: [{ allRequired: ['console'] }], + }, + }; + const description = extractAuthzDescription(routeSecurity); + expect(description).toBe('[Authz] Route required privileges: ALL of [console].'); + } + { + const routeSecurity: RouteSecurity = { + authz: { + requiredPrivileges: [ + { + anyRequired: ['manage_spaces', 'taskmanager'], + }, + ], + }, + }; + const description = extractAuthzDescription(routeSecurity); + expect(description).toBe( + '[Authz] Route required privileges: ANY of [manage_spaces OR taskmanager].' + ); + } + { + const routeSecurity: RouteSecurity = { + authz: { + requiredPrivileges: [ + { + allRequired: ['console', 'filesManagement'], + anyRequired: ['manage_spaces', 'taskmanager'], + }, + ], + }, + }; + const description = extractAuthzDescription(routeSecurity); + expect(description).toBe( + '[Authz] Route required privileges: ALL of [console, filesManagement] AND ANY of [manage_spaces OR taskmanager].' + ); + } + }); +}); diff --git a/packages/kbn-router-to-openapispec/src/extract_authz_description.ts b/packages/kbn-router-to-openapispec/src/extract_authz_description.ts new file mode 100644 index 0000000000000..4cd6875913780 --- /dev/null +++ b/packages/kbn-router-to-openapispec/src/extract_authz_description.ts @@ -0,0 +1,60 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { AuthzEnabled, AuthzDisabled, InternalRouteSecurity } from '@kbn/core-http-server'; + +interface PrivilegeGroupValue { + allRequired: string[]; + anyRequired: string[]; +} + +export const extractAuthzDescription = (routeSecurity: InternalRouteSecurity | undefined) => { + if (!routeSecurity) { + return ''; + } + if (!('authz' in routeSecurity) || (routeSecurity.authz as AuthzDisabled).enabled === false) { + return ''; + } + + const privileges = (routeSecurity.authz as AuthzEnabled).requiredPrivileges; + + const groupedPrivileges = privileges.reduce( + (groups, privilege) => { + if (typeof privilege === 'string') { + groups.allRequired.push(privilege); + + return groups; + } + groups.allRequired.push(...(privilege.allRequired ?? [])); + groups.anyRequired.push(...(privilege.anyRequired ?? [])); + + return groups; + }, + { + anyRequired: [], + allRequired: [], + } + ); + + const getPrivilegesDescription = (allRequired: string[], anyRequired: string[]) => { + const allDescription = allRequired.length ? `ALL of [${allRequired.join(', ')}]` : ''; + const anyDescription = anyRequired.length ? `ANY of [${anyRequired.join(' OR ')}]` : ''; + + return `${allDescription}${allDescription && anyDescription ? ' AND ' : ''}${anyDescription}`; + }; + + const getDescriptionForRoute = () => { + const allRequired = [...groupedPrivileges.allRequired]; + const anyRequired = [...groupedPrivileges.anyRequired]; + + return `Route required privileges: ${getPrivilegesDescription(allRequired, anyRequired)}.`; + }; + + return `[Authz] ${getDescriptionForRoute()}`; +}; diff --git a/packages/kbn-router-to-openapispec/src/process_router.test.ts b/packages/kbn-router-to-openapispec/src/process_router.test.ts index 22e03efdf08fc..96a10b25d648a 100644 --- a/packages/kbn-router-to-openapispec/src/process_router.test.ts +++ b/packages/kbn-router-to-openapispec/src/process_router.test.ts @@ -11,7 +11,8 @@ import { schema } from '@kbn/config-schema'; import { Router } from '@kbn/core-http-router-server-internal'; import { OasConverter } from './oas_converter'; import { createOperationIdCounter } from './operation_id_counter'; -import { extractResponses, processRouter, type InternalRouterRoute } from './process_router'; +import { extractResponses, processRouter } from './process_router'; +import { type InternalRouterRoute } from './type'; describe('extractResponses', () => { let oasConverter: OasConverter; @@ -102,6 +103,24 @@ describe('processRouter', () => { handler: jest.fn(), validationSchemas: { request: { body: schema.object({}) } }, }, + { + path: '/qux', + method: 'post', + options: {}, + handler: jest.fn(), + validationSchemas: { request: { body: schema.object({}) } }, + security: { + authz: { + requiredPrivileges: [ + 'manage_spaces', + { + allRequired: ['taskmanager'], + anyRequired: ['console'], + }, + ], + }, + }, + }, ], } as unknown as Router; @@ -110,11 +129,23 @@ describe('processRouter', () => { version: '2023-10-31', }); - expect(Object.keys(result1.paths!)).toHaveLength(3); + expect(Object.keys(result1.paths!)).toHaveLength(4); const result2 = processRouter(testRouter, new OasConverter(), createOperationIdCounter(), { version: '2024-10-31', }); expect(Object.keys(result2.paths!)).toHaveLength(0); }); + + it('updates description with privileges required', () => { + const result = processRouter(testRouter, new OasConverter(), createOperationIdCounter(), { + version: '2023-10-31', + }); + + expect(result.paths['/qux']?.post).toBeDefined(); + + expect(result.paths['/qux']?.post?.description).toEqual( + '[Authz] Route required privileges: ALL of [manage_spaces, taskmanager] AND ANY of [console].' + ); + }); }); diff --git a/packages/kbn-router-to-openapispec/src/process_router.ts b/packages/kbn-router-to-openapispec/src/process_router.ts index f0d37fd208b7b..cb55af3735b34 100644 --- a/packages/kbn-router-to-openapispec/src/process_router.ts +++ b/packages/kbn-router-to-openapispec/src/process_router.ts @@ -27,7 +27,8 @@ import { } from './util'; import type { OperationIdCounter } from './operation_id_counter'; import type { GenerateOpenApiDocumentOptionsFilters } from './generate_oas'; -import type { CustomOperationObject } from './type'; +import type { CustomOperationObject, InternalRouterRoute } from './type'; +import { extractAuthzDescription } from './extract_authz_description'; export const processRouter = ( appRouter: Router, @@ -63,10 +64,19 @@ export const processRouter = ( parameters.push(...pathObjects, ...queryObjects); } + let description = ''; + if (route.security) { + const authzDescription = extractAuthzDescription(route.security); + + description = `${route.options.description ?? ''}${authzDescription ?? ''}`; + } + const hasDeprecations = !!route.options.deprecated; + const operation: CustomOperationObject = { summary: route.options.summary ?? '', tags: route.options.tags ? extractTags(route.options.tags) : [], + ...(description ? { description } : {}), ...(route.options.description ? { description: route.options.description } : {}), ...(hasDeprecations ? { deprecated: true } : {}), ...(route.options.discontinued ? { 'x-discontinued': route.options.discontinued } : {}), @@ -99,7 +109,6 @@ export const processRouter = ( return { paths }; }; -export type InternalRouterRoute = ReturnType[0]; export const extractResponses = (route: InternalRouterRoute, converter: OasConverter) => { const responses: OpenAPIV3.ResponsesObject = {}; if (!route.validationSchemas) return responses; diff --git a/packages/kbn-router-to-openapispec/src/process_versioned_router.test.ts b/packages/kbn-router-to-openapispec/src/process_versioned_router.test.ts index f9f4f4898c1d0..3738c207f1f78 100644 --- a/packages/kbn-router-to-openapispec/src/process_versioned_router.test.ts +++ b/packages/kbn-router-to-openapispec/src/process_versioned_router.test.ts @@ -144,6 +144,22 @@ describe('processVersionedRouter', () => { 'application/test+json; Elastic-Api-Version=2023-10-31', ]); }); + + it('correctly updates the authz description for routes that require privileges', () => { + const results = processVersionedRouter( + { getRoutes: () => [createTestRoute()] } as unknown as CoreVersionedRouter, + new OasConverter(), + createOperationIdCounter(), + {} + ); + expect(results.paths['/foo']).toBeDefined(); + + expect(results.paths['/foo']!.get).toBeDefined(); + + expect(results.paths['/foo']!.get!.description).toBe( + '[Authz] Route required privileges: ALL of [manage_spaces].' + ); + }); }); const createTestRoute: () => VersionedRouterRoute = () => ({ @@ -155,6 +171,11 @@ const createTestRoute: () => VersionedRouterRoute = () => ({ deprecated: true, discontinued: 'discontinued versioned router', options: { body: { access: ['application/test+json'] } as any }, + security: { + authz: { + requiredPrivileges: ['manage_spaces'], + }, + }, }, handlers: [ { diff --git a/packages/kbn-router-to-openapispec/src/process_versioned_router.ts b/packages/kbn-router-to-openapispec/src/process_versioned_router.ts index 7eee0d20c11d2..5dad5677c94ac 100644 --- a/packages/kbn-router-to-openapispec/src/process_versioned_router.ts +++ b/packages/kbn-router-to-openapispec/src/process_versioned_router.ts @@ -14,6 +14,7 @@ import { } from '@kbn/core-http-router-server-internal'; import type { RouteMethod, VersionedRouterRoute } from '@kbn/core-http-server'; import type { OpenAPIV3 } from 'openapi-types'; +import { extractAuthzDescription } from './extract_authz_description'; import type { GenerateOpenApiDocumentOptionsFilters } from './generate_oas'; import type { OasConverter } from './oas_converter'; import { isReferenceObject } from './oas_converter/common'; @@ -90,6 +91,13 @@ export const processVersionedRouter = ( ]; } + let description = ''; + if (route.options.security) { + const authzDescription = extractAuthzDescription(route.options.security); + + description = `${route.options.description ?? ''}${authzDescription ?? ''}`; + } + const hasBody = Boolean(extractValidationSchemaFromVersionedHandler(handler)?.request?.body); const contentType = extractContentType(route.options.options?.body); const hasVersionFilter = Boolean(filters?.version); @@ -98,6 +106,7 @@ export const processVersionedRouter = ( const operation: OpenAPIV3.OperationObject = { summary: route.options.summary ?? '', tags: route.options.options?.tags ? extractTags(route.options.options.tags) : [], + ...(description ? { description } : {}), ...(route.options.description ? { description: route.options.description } : {}), ...(hasDeprecations ? { deprecated: true } : {}), ...(route.options.discontinued ? { 'x-discontinued': route.options.discontinued } : {}), diff --git a/packages/kbn-router-to-openapispec/src/type.ts b/packages/kbn-router-to-openapispec/src/type.ts index 5c5f992a0de0f..f57e4d00ad7db 100644 --- a/packages/kbn-router-to-openapispec/src/type.ts +++ b/packages/kbn-router-to-openapispec/src/type.ts @@ -7,6 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import type { Router } from '@kbn/core-http-router-server-internal'; import type { OpenAPIV3 } from '../openapi-types'; export type { OpenAPIV3 } from '../openapi-types'; export interface KnownParameters { @@ -39,3 +40,5 @@ export type CustomOperationObject = OpenAPIV3.OperationObject<{ // Custom OpenAPI from ES API spec based on @availability 'x-state'?: 'Technical Preview' | 'Beta'; }>; + +export type InternalRouterRoute = ReturnType[0]; diff --git a/packages/kbn-router-to-openapispec/tsconfig.json b/packages/kbn-router-to-openapispec/tsconfig.json index d82ca0bf48910..3536a90a8256f 100644 --- a/packages/kbn-router-to-openapispec/tsconfig.json +++ b/packages/kbn-router-to-openapispec/tsconfig.json @@ -17,6 +17,6 @@ "@kbn/core-http-router-server-internal", "@kbn/core-http-server", "@kbn/config-schema", - "@kbn/zod" + "@kbn/zod", ] } From e6bb35ac3d2376b616df4e687517d8ae650dca50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Mon, 28 Oct 2024 10:21:25 -0400 Subject: [PATCH 072/135] Add tags to connector run failures indicating if it's user or framework error (#197818) Resolves https://github.com/elastic/kibana/issues/197315 In this PR, I'm adding the following tags to the connector failure logs so it makes it easier to filter for systematic errors. - `connector-run-failed` for logs specific to connector run failures - `user-error` for errors caused by the user - `framework-error` for systematic errors ## To verify You can either use the jest test to observe the returned flags or set your logging to JSON and make connectors fail. kibana.yml to set logging to JSON ``` logging: appenders: json-layout: type: console layout: type: json root: appenders: [json-layout] ``` --- .../server/lib/task_runner_factory.test.ts | 15 ++++++-- .../actions/server/lib/task_runner_factory.ts | 36 ++++++++++++++----- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts b/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts index 6c4cdd31ccf6c..9733b56638d77 100644 --- a/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts +++ b/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts @@ -885,7 +885,8 @@ describe('Task Runner Factory', () => { expect(err).toBeDefined(); expect(isRetryableError(err)).toEqual(false); expect(taskRunnerFactoryInitializerParams.logger.error as jest.Mock).toHaveBeenCalledWith( - `Action '2' failed: Error message` + `Action '2' failed: Error message`, + { tags: ['connector-run-failed', 'framework-error'] } ); expect(getErrorSource(err)).toBe(TaskErrorSource.FRAMEWORK); }); @@ -934,7 +935,8 @@ describe('Task Runner Factory', () => { expect(err).toBeDefined(); expect(taskRunnerFactoryInitializerParams.logger.error as jest.Mock).toHaveBeenCalledWith( - `Action '2' failed: Error message: Service message` + `Action '2' failed: Error message: Service message`, + { tags: ['connector-run-failed', 'framework-error'] } ); }); @@ -1033,7 +1035,8 @@ describe('Task Runner Factory', () => { } expect(err).toBeDefined(); expect(taskRunnerFactoryInitializerParams.logger.error as jest.Mock).toHaveBeenCalledWith( - `Action '2' failed: Fail` + `Action '2' failed: Fail`, + { tags: ['connector-run-failed', 'framework-error'] } ); expect(thrownError).toEqual(err); expect(getErrorSource(err)).toBe(TaskErrorSource.FRAMEWORK); @@ -1140,10 +1143,16 @@ describe('Task Runner Factory', () => { try { await taskRunner.run(); + throw new Error('Should have thrown'); } catch (e) { expect(mockedEncryptedSavedObjectsClient.getDecryptedAsInternalUser).toHaveBeenCalledTimes(1); expect(getErrorSource(e)).toBe(TaskErrorSource.FRAMEWORK); expect(e).toEqual(error); + + expect(taskRunnerFactoryInitializerParams.logger.error).toHaveBeenCalledWith( + `Failed to load action task params ${mockedTaskInstance.params.actionTaskParamsId}: test`, + { tags: ['connector-run-failed', 'framework-error'] } + ); } }); }); diff --git a/x-pack/plugins/actions/server/lib/task_runner_factory.ts b/x-pack/plugins/actions/server/lib/task_runner_factory.ts index d6b418c481ea5..d067ddaaae7ad 100644 --- a/x-pack/plugins/actions/server/lib/task_runner_factory.ts +++ b/x-pack/plugins/actions/server/lib/task_runner_factory.ts @@ -115,7 +115,8 @@ export class TaskRunnerFactory { } = await getActionTaskParams( actionTaskExecutorParams, encryptedSavedObjectsClient, - spaceIdToNamespace + spaceIdToNamespace, + logger ); const { spaceId } = actionTaskExecutorParams; @@ -139,12 +140,18 @@ export class TaskRunnerFactory { ...getSource(references, source), }); } catch (e) { - logger.error(`Action '${actionId}' failed: ${e.message}`); + const errorSource = + e instanceof ActionTypeDisabledError + ? TaskErrorSource.USER + : getErrorSource(e) || TaskErrorSource.FRAMEWORK; + logger.error(`Action '${actionId}' failed: ${e.message}`, { + tags: ['connector-run-failed', `${errorSource}-error`], + }); if (e instanceof ActionTypeDisabledError) { // We'll stop re-trying due to action being forbidden - throwUnrecoverableError(createTaskRunError(e, TaskErrorSource.USER)); + throwUnrecoverableError(createTaskRunError(e, errorSource)); } - throw createTaskRunError(e, getErrorSource(e) || TaskErrorSource.FRAMEWORK); + throw createTaskRunError(e, errorSource); } inMemoryMetrics.increment(IN_MEMORY_METRICS.ACTION_EXECUTIONS); @@ -155,7 +162,9 @@ export class TaskRunnerFactory { if (executorResult.serviceMessage) { message = `${message}: ${executorResult.serviceMessage}`; } - logger.error(`Action '${actionId}' failed: ${message}`); + logger.error(`Action '${actionId}' failed: ${message}`, { + tags: ['connector-run-failed', `${executorResult.errorSource}-error`], + }); // Task manager error handler only kicks in when an error thrown (at this time) // So what we have to do is throw when the return status is `error`. @@ -175,7 +184,8 @@ export class TaskRunnerFactory { } = await getActionTaskParams( actionTaskExecutorParams, encryptedSavedObjectsClient, - spaceIdToNamespace + spaceIdToNamespace, + logger ); const request = getFakeRequest(apiKey); @@ -239,7 +249,8 @@ function getFakeRequest(apiKey?: string) { async function getActionTaskParams( executorParams: ActionTaskExecutorParams, encryptedSavedObjectsClient: EncryptedSavedObjectsClient, - spaceIdToNamespace: SpaceIdToNamespaceFunction + spaceIdToNamespace: SpaceIdToNamespaceFunction, + logger: Logger ): Promise { const { spaceId } = executorParams; const namespace = spaceIdToNamespace(spaceId); @@ -268,10 +279,17 @@ async function getActionTaskParams( }, }; } catch (e) { + const errorSource = SavedObjectsErrorHelpers.isNotFoundError(e) + ? TaskErrorSource.USER + : TaskErrorSource.FRAMEWORK; + logger.error( + `Failed to load action task params ${executorParams.actionTaskParamsId}: ${e.message}`, + { tags: ['connector-run-failed', `${errorSource}-error`] } + ); if (SavedObjectsErrorHelpers.isNotFoundError(e)) { - throw createRetryableError(createTaskRunError(e, TaskErrorSource.USER), true); + throw createRetryableError(createTaskRunError(e, errorSource), true); } - throw createRetryableError(createTaskRunError(e, TaskErrorSource.FRAMEWORK), true); + throw createRetryableError(createTaskRunError(e, errorSource), true); } } else { return { attributes: executorParams.taskParams, references: executorParams.references ?? [] }; From 962f73130b96df919473de79b6a9b0067652e607 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Mon, 28 Oct 2024 15:44:29 +0100 Subject: [PATCH 073/135] [EDR Workflows] Fix Cypress tests failing on Alerts step (#197384) --- .../all/alerts_automated_action_results.cy.ts | 3 +- .../cypress/e2e/all/alerts_cases.cy.ts | 6 +- .../cypress/e2e/all/alerts_linked_apps.cy.ts | 4 +- .../e2e/all/alerts_multiple_agents.cy.ts | 3 +- .../cypress/e2e/all/ecs_mappings.cy.ts | 3 +- .../osquery/cypress/tasks/api_fixtures.ts | 2 +- .../osquery/cypress/tasks/live_query.ts | 3 +- .../automated_response_actions.cy.ts | 91 +++++++++---------- .../management/cypress/tasks/api_fixtures.ts | 2 +- .../public/management/cypress/tsconfig.json | 1 + 10 files changed, 53 insertions(+), 65 deletions(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts index 1bc058b188fcc..4c7c9663b2d40 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts @@ -11,8 +11,7 @@ import { checkActionItemsInResults, loadRuleAlerts } from '../../tasks/live_quer const UUID_REGEX = '[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}'; -// FLAKY: https://github.com/elastic/kibana/issues/169727 -describe.skip('Alert Flyout Automated Action Results', () => { +describe('Alert Flyout Automated Action Results', () => { let ruleId: string; before(() => { diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts index 2dbd905b4df93..1817a81e46821 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_cases.cy.ts @@ -49,8 +49,7 @@ describe.skip('Alert Event Details - Cases', { tags: ['@ess', '@serverless'] }, cleanupRule(ruleId); }); - // FLAKY: https://github.com/elastic/kibana/issues/197151 - describe.skip('Case creation', () => { + describe('Case creation', () => { let caseId: string; before(() => { @@ -86,8 +85,7 @@ describe.skip('Alert Event Details - Cases', { tags: ['@ess', '@serverless'] }, }); }); - // FLAKY: https://github.com/elastic/kibana/issues/176783 - describe.skip('Case', () => { + describe('Case', () => { let caseId: string; beforeEach(() => { diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts index f7585d32a2bba..2b04a99bd4f9c 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts @@ -18,9 +18,7 @@ import { import { closeModalIfVisible, closeToastIfVisible } from '../../tasks/integrations'; import { RESULTS_TABLE, RESULTS_TABLE_BUTTON } from '../../screens/live_query'; -// Failing: See https://github.com/elastic/kibana/issues/181889 -// Failing: See https://github.com/elastic/kibana/issues/181889 -describe.skip( +describe( 'Alert Event Details', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'], diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_multiple_agents.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_multiple_agents.cy.ts index 4f6d30dd71431..95f0d947b8e84 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_multiple_agents.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_multiple_agents.cy.ts @@ -15,8 +15,7 @@ import { } from '../../tasks/live_query'; import { OSQUERY_FLYOUT_BODY_EDITOR } from '../../screens/live_query'; -// FLAKY: https://github.com/elastic/kibana/issues/170157 -describe.skip( +describe( 'Alert Event Details - dynamic params', { tags: ['@ess', '@serverless'], diff --git a/x-pack/plugins/osquery/cypress/e2e/all/ecs_mappings.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/ecs_mappings.cy.ts index 89881c47083fd..5330b7869e6f4 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/ecs_mappings.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/ecs_mappings.cy.ts @@ -18,8 +18,7 @@ import { typeInOsqueryFieldInput, } from '../../tasks/live_query'; -// Failing: See https://github.com/elastic/kibana/issues/192128 -describe.skip('EcsMapping', { tags: ['@ess', '@serverless'] }, () => { +describe('EcsMapping', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { initializeDataViews(); }); diff --git a/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts b/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts index 2b0db52f45699..4aa2879883b38 100644 --- a/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts +++ b/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts @@ -231,7 +231,7 @@ export const loadRule = (includeResponseActions = false) => { tags: [], license: '', interval: '1m', - from: 'now-120s', + from: 'now-360s', to: 'now', meta: { from: '1m', kibana_siem_app_url: 'http://localhost:5620/app/security' }, actions: [], diff --git a/x-pack/plugins/osquery/cypress/tasks/live_query.ts b/x-pack/plugins/osquery/cypress/tasks/live_query.ts index c8ef188010130..910427272c5ff 100644 --- a/x-pack/plugins/osquery/cypress/tasks/live_query.ts +++ b/x-pack/plugins/osquery/cypress/tasks/live_query.ts @@ -58,7 +58,7 @@ export const verifyQueryTimeout = (timeout: string) => { // sometimes the results get stuck in the tests, this is a workaround export const checkResults = () => { - cy.getBySel('osqueryResultsTable').then(($table) => { + cy.getBySel('osqueryResultsTable', { timeout: 120000 }).then(($table) => { if ($table.find('div .euiDataGridRow').length > 0) { cy.getBySel('dataGridRowCell', { timeout: 120000 }).should('have.lengthOf.above', 0); } else { @@ -158,6 +158,7 @@ export const checkActionItemsInResults = ({ cases: boolean; timeline: boolean; }) => { + checkResults(); cy.contains('View in Discover').should(discover ? 'exist' : 'not.exist'); cy.contains('View in Lens').should(lens ? 'exist' : 'not.exist'); cy.contains('Add to Case').should(cases ? 'exist' : 'not.exist'); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts index 887fa47d03918..86e07e65e83ae 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts @@ -5,13 +5,13 @@ * 2.0. */ +import { waitForAlertsToPopulate } from '@kbn/test-suites-xpack/security_solution_cypress/cypress/tasks/create_new_rule'; +import { login } from '../../tasks/login'; +import { waitForEndpointListPageToBeLoaded } from '../../tasks/response_console'; import type { PolicyData } from '../../../../../common/endpoint/types'; -import { APP_ENDPOINTS_PATH } from '../../../../../common/constants'; import { closeAllToasts } from '../../tasks/toasts'; import { toggleRuleOffAndOn, visitRuleAlerts } from '../../tasks/isolate'; import { cleanupRule, loadRule } from '../../tasks/api_fixtures'; -import { login } from '../../tasks/login'; -import { loadPage } from '../../tasks/common'; import type { IndexedFleetEndpointPolicyResponse } from '../../../../../common/endpoint/data_loaders/index_fleet_endpoint_policy'; import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../tasks/fleet'; import { changeAlertsFilter } from '../../tasks/alerts'; @@ -38,21 +38,33 @@ describe( let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; + let ruleId: string; + let ruleName: string; + beforeEach(() => { + login(); + }); before(() => { - getEndpointIntegrationVersion().then((version) => - createAgentPolicyTask(version, 'automated_response_actions').then((data) => { - indexedPolicy = data; - policy = indexedPolicy.integrationPolicies[0]; - - return enableAllPolicyProtections(policy.id).then(() => { - // Create and enroll a new Endpoint host - return createEndpointHost(policy.policy_ids[0]).then((host) => { - createdHost = host as CreateAndEnrollEndpointHostResponse; + getEndpointIntegrationVersion() + .then((version) => + createAgentPolicyTask(version, 'automated_response_actions').then((data) => { + indexedPolicy = data; + policy = indexedPolicy.integrationPolicies[0]; + + return enableAllPolicyProtections(policy.id).then(() => { + // Create and enroll a new Endpoint host + return createEndpointHost(policy.policy_ids[0]).then((host) => { + createdHost = host as CreateAndEnrollEndpointHostResponse; + }); }); + }) + ) + .then(() => { + loadRule().then((data) => { + ruleId = data.id; + ruleName = data.name; }); - }) - ); + }); }); after(() => { @@ -67,48 +79,29 @@ describe( if (createdHost) { deleteAllLoadedEndpointData({ endpointAgentIds: [createdHost.agentId] }); } - }); - beforeEach(() => { - login(); + if (ruleId) { + cleanupRule(ruleId); + } }); - // FLAKY: https://github.com/elastic/kibana/issues/169828 - describe.skip('From alerts', () => { - let ruleId: string; - let ruleName: string; - - before(() => { - loadRule().then((data) => { - ruleId = data.id; - ruleName = data.name; - }); - }); - - after(() => { - if (ruleId) { - cleanupRule(ruleId); - } - }); - - it('should have generated endpoint and rule', () => { - loadPage(APP_ENDPOINTS_PATH); - cy.contains(createdHost.hostname).should('exist'); + it('should have been called against a created host', () => { + waitForEndpointListPageToBeLoaded(createdHost.hostname); + toggleRuleOffAndOn(ruleName); - toggleRuleOffAndOn(ruleName); + visitRuleAlerts(ruleName); + closeAllToasts(); - visitRuleAlerts(ruleName); - closeAllToasts(); + changeAlertsFilter(`process.name: "agentbeat" and agent.id: "${createdHost.agentId}"`); + waitForAlertsToPopulate(); - changeAlertsFilter(`process.name: "agentbeat" and agent.id: "${createdHost.agentId}"`); - cy.getByTestSubj('expand-event').first().click(); - cy.getByTestSubj('securitySolutionFlyoutNavigationExpandDetailButton').click(); - cy.getByTestSubj('securitySolutionFlyoutResponseTab').click(); + cy.getByTestSubj('expand-event').first().click(); + cy.getByTestSubj('securitySolutionFlyoutNavigationExpandDetailButton').click(); + cy.getByTestSubj('securitySolutionFlyoutResponseTab').click(); - cy.contains(/isolate is pending|isolate completed successfully/g); - cy.contains(/kill-process is pending|kill-process completed successfully/g); - cy.contains('The action was called with a non-existing event field name: entity_id'); - }); + cy.contains(/isolate is pending|isolate completed successfully/g); + cy.contains(/kill-process is pending|kill-process completed successfully/g); + cy.contains('The action was called with a non-existing event field name: entity_id'); }); } ); diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/api_fixtures.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/api_fixtures.ts index 1bd0e5652b442..e6e44e7e5517a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/api_fixtures.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/api_fixtures.ts @@ -55,7 +55,7 @@ export const loadRule = (body = {}, includeResponseActions = true) => tags: [], license: '', interval: '1m', - from: 'now-120s', + from: 'now-360s', to: 'now', meta: { from: '1m', kibana_siem_app_url: 'http://localhost:5620/app/security' }, actions: [], diff --git a/x-pack/plugins/security_solution/public/management/cypress/tsconfig.json b/x-pack/plugins/security_solution/public/management/cypress/tsconfig.json index 5d124d1035259..c983368164906 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tsconfig.json +++ b/x-pack/plugins/security_solution/public/management/cypress/tsconfig.json @@ -34,5 +34,6 @@ "@kbn/security-solution-serverless", "@kbn/dev-utils", "@kbn/spaces-plugin", + "@kbn/test-suites-xpack/security_solution_cypress/cypress", ] } From ffc88107f0f136481662f1fe3d1a19e23319eecd Mon Sep 17 00:00:00 2001 From: Jared Burgett <147995946+jaredburgettelastic@users.noreply.github.com> Date: Mon, 28 Oct 2024 09:59:01 -0500 Subject: [PATCH 074/135] Delete data when clearing security entity store (#197938) ## Summary Fixed a bug where the "Clear all entities" button in the security entity store didn't delete data due to a missing query parameter. --- .../public/entity_analytics/api/entity_store.ts | 3 ++- .../components/entity_store/hooks/use_entity_store.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/entity_analytics/api/entity_store.ts b/x-pack/plugins/security_solution/public/entity_analytics/api/entity_store.ts index 34789402c89a5..54f5415d24a35 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/api/entity_store.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/api/entity_store.ts @@ -43,9 +43,10 @@ export const useEntityStoreRoutes = () => { }); }; - const deleteEntityEngine = async (entityType: EntityType) => { + const deleteEntityEngine = async (entityType: EntityType, deleteData: boolean) => { return http.fetch(`/api/entity_store/engines/${entityType}`, { method: 'DELETE', + query: { data: deleteData }, version: API_VERSIONS.public.v1, }); }; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entity_store.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entity_store.ts index 29e9e6c5098c4..0ac684555fd0d 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entity_store.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entity_store.ts @@ -110,7 +110,7 @@ export const useDeleteEntityEngineMutation = (options?: UseMutationOptions<{}>) const invalidateEntityEngineStatusQuery = useInvalidateEntityEngineStatusQuery(); const { deleteEntityEngine } = useEntityStoreRoutes(); return useMutation( - () => Promise.all([deleteEntityEngine('user'), deleteEntityEngine('host')]), + () => Promise.all([deleteEntityEngine('user', true), deleteEntityEngine('host', true)]), { ...options, mutationKey: DELETE_ENTITY_ENGINE_STATUS_KEY, From 7b211bdb55a5c4ea6a41c2eb0bbbef682803e1be Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Mon, 28 Oct 2024 16:00:12 +0100 Subject: [PATCH 075/135] FTR SAML Auth - Adjust stateful internal request header (#197994) ## Summary This PR adds the `x-elastic-internal-origin` header to the stateful internal request headers used by FTR. This fixes an issue that we're seeing when running deployment agnostic tests against ESS on 9.0.0-SNAPSHOT. --- .../services/saml_auth/default_request_headers.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kbn-ftr-common-functional-services/services/saml_auth/default_request_headers.ts b/packages/kbn-ftr-common-functional-services/services/saml_auth/default_request_headers.ts index e81f3383c9e93..b07ac58c56854 100644 --- a/packages/kbn-ftr-common-functional-services/services/saml_auth/default_request_headers.ts +++ b/packages/kbn-ftr-common-functional-services/services/saml_auth/default_request_headers.ts @@ -14,6 +14,7 @@ export const COMMON_REQUEST_HEADERS = { // possible change in 9.0 to match serverless const STATEFUL_INTERNAL_REQUEST_HEADERS = { ...COMMON_REQUEST_HEADERS, + 'x-elastic-internal-origin': 'kibana', }; const SERVERLESS_INTERNAL_REQUEST_HEADERS = { From 7ae6f481b6657fe47bb4e6332745b35cf207e7a6 Mon Sep 17 00:00:00 2001 From: Tre Date: Mon, 28 Oct 2024 15:01:35 +0000 Subject: [PATCH 076/135] [SKIP ON MKI] reporting datastream (#197958) ## Summary See details: https://github.com/elastic/kibana/issues/197955 --- .../api_integration/test_suites/common/reporting/datastream.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/x-pack/test_serverless/api_integration/test_suites/common/reporting/datastream.ts b/x-pack/test_serverless/api_integration/test_suites/common/reporting/datastream.ts index 671b42f5a02a3..f2b78426ec644 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/reporting/datastream.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/reporting/datastream.ts @@ -33,6 +33,9 @@ export default function ({ getService }: FtrProviderContext) { }; describe('Data Stream', function () { + // see details: https://github.com/elastic/kibana/issues/197955 + this.tags(['failsOnMKI']); + const generatedReports = new Set(); before(async () => { roleAuthc = await svlUserManager.createM2mApiKeyWithRoleScope('admin'); From 6b91b154874801e9599f46f7932d051571e1ad81 Mon Sep 17 00:00:00 2001 From: Tre Date: Mon, 28 Oct 2024 15:02:00 +0000 Subject: [PATCH 077/135] [SKIP ON MKI] discover reporting (#197959) # Summary See details: https://github.com/elastic/kibana/issues/197957 --- .../test_suites/common/discover/x_pack/reporting.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/reporting.ts b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/reporting.ts index 76c95ebbd890e..c944865d06327 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/reporting.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/x_pack/reporting.ts @@ -58,7 +58,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return res; }; - describe('Discover CSV Export', () => { + describe('Discover CSV Export', function () { + // see details: https://github.com/elastic/kibana/issues/197957 + this.tags(['failsOnMKI']); describe('Check Available', () => { before(async () => { await PageObjects.svlCommonPage.loginAsAdmin(); From 0220874130fd9bb900d2d262d6e415f5a9e1bd7c Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Mon, 28 Oct 2024 17:07:49 +0200 Subject: [PATCH 078/135] fix: [Stateful:Connectors:New connector page]Configuration form missing instructions and field names from announcement (#197963) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes: #197586 ## Description Forms, requiring user input, should have clear instructions on how to fill them. Specific fields can have their own help (guidance) text on how to fill them with examples. All fields which are present in the form can be programmatically determined, especially for the users using assistive technology to understand what fields are present, what input is expected. ## What was changed: 1. `aria-label` values ​​are explicitly set for `ConnectorConfigurationField` child components. I suspect that due to the dynamic nature of this component, the standard mechanism does not work properly. ## Screen: image --- .../configuration/connector_configuration_field.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/kbn-search-connectors/components/configuration/connector_configuration_field.tsx b/packages/kbn-search-connectors/components/configuration/connector_configuration_field.tsx index a43163caa6091..08b91ffc1842c 100644 --- a/packages/kbn-search-connectors/components/configuration/connector_configuration_field.tsx +++ b/packages/kbn-search-connectors/components/configuration/connector_configuration_field.tsx @@ -52,7 +52,7 @@ export const ConfigInputField: React.FC = ({ isLoading, validateAndSetConfigValue, }) => { - const { isValid, required, placeholder, value } = configEntry; + const { isValid, required, placeholder, value, label } = configEntry; const [innerValue, setInnerValue] = useState(value); return ( = ({ validateAndSetConfigValue(event.target.value); }} placeholder={placeholder} + aria-label={label} /> ); }; @@ -74,7 +75,7 @@ export const ConfigInputTextArea: React.FC = ({ configEntry, validateAndSetConfigValue, }) => { - const { isValid, required, placeholder, value } = configEntry; + const { isValid, required, placeholder, value, label } = configEntry; const [innerValue, setInnerValue] = useState(value); return ( = ({ validateAndSetConfigValue(event.target.value); }} placeholder={placeholder} + aria-label={label} /> ); }; @@ -129,7 +131,7 @@ export const ConfigInputPassword: React.FC = ({ configEntry, validateAndSetConfigValue, }) => { - const { required, value } = configEntry; + const { required, value, label } = configEntry; const [innerValue, setInnerValue] = useState(value); return ( = ({ setInnerValue(event.target.value); validateAndSetConfigValue(event.target.value); }} + aria-label={label} /> ); }; @@ -170,6 +173,7 @@ export const ConnectorConfigurationField: React.FC { validateAndSetConfigValue(event.target.value); }} + aria-label={label} /> ) : ( { validateAndSetConfigValue(id); }} + aria-label={label} /> ); @@ -227,6 +232,7 @@ export const ConnectorConfigurationField: React.FC { validateAndSetConfigValue(event.target.checked); }} + aria-label={label} /> {!hasPlatinumLicense && ( From a5f0c1916e6348d82306e14c772c66f195ae781e Mon Sep 17 00:00:00 2001 From: Drew Tate Date: Mon, 28 Oct 2024 09:31:48 -0600 Subject: [PATCH 079/135] [ES|QL] detect the type of `COUNT(*)` (#197914) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary We weren't properly detecting the type of the expression `COUNT(*)`. Now we are! Before: Screenshot 2024-10-25 at 4 38 08 PM After: Screenshot 2024-10-25 at 4 35 44 PM ### 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: Stratoula Kalafateli --- .../src/shared/helpers.test.ts | 76 +++++++------------ .../src/shared/helpers.ts | 32 ++++++-- 2 files changed, 53 insertions(+), 55 deletions(-) diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts index 0078e0fac119c..e2e6397005e22 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts @@ -225,79 +225,47 @@ describe('getExpressionType', () => { }); it('detects the return type of a function', () => { - expect( - getExpressionType(getASTForExpression('returns_keyword()'), new Map(), new Map()) - ).toBe('keyword'); + expect(getExpressionType(getASTForExpression('returns_keyword()'))).toBe('keyword'); }); it('selects the correct signature based on the arguments', () => { - expect(getExpressionType(getASTForExpression('test("foo")'), new Map(), new Map())).toBe( - 'keyword' - ); - expect(getExpressionType(getASTForExpression('test(1.)'), new Map(), new Map())).toBe( - 'double' - ); - expect(getExpressionType(getASTForExpression('test(1., "foo")'), new Map(), new Map())).toBe( - 'long' - ); + expect(getExpressionType(getASTForExpression('test("foo")'))).toBe('keyword'); + expect(getExpressionType(getASTForExpression('test(1.)'))).toBe('double'); + expect(getExpressionType(getASTForExpression('test(1., "foo")'))).toBe('long'); }); it('supports nested functions', () => { expect( - getExpressionType( - getASTForExpression('test(1., test(test(test(returns_keyword()))))'), - new Map(), - new Map() - ) + getExpressionType(getASTForExpression('test(1., test(test(test(returns_keyword()))))')) ).toBe('long'); }); it('supports functions with casted results', () => { - expect( - getExpressionType(getASTForExpression('test(1.)::keyword'), new Map(), new Map()) - ).toBe('keyword'); + expect(getExpressionType(getASTForExpression('test(1.)::keyword'))).toBe('keyword'); }); it('handles nulls and string-date casting', () => { - expect(getExpressionType(getASTForExpression('test(NULL)'), new Map(), new Map())).toBe( - 'null' - ); - expect(getExpressionType(getASTForExpression('test(NULL, NULL)'), new Map(), new Map())).toBe( - 'null' - ); - expect( - getExpressionType(getASTForExpression('accepts_dates("", "")'), new Map(), new Map()) - ).toBe('keyword'); + expect(getExpressionType(getASTForExpression('test(NULL)'))).toBe('null'); + expect(getExpressionType(getASTForExpression('test(NULL, NULL)'))).toBe('null'); + expect(getExpressionType(getASTForExpression('accepts_dates("", "")'))).toBe('keyword'); }); it('deals with functions that do not exist', () => { - expect(getExpressionType(getASTForExpression('does_not_exist()'), new Map(), new Map())).toBe( - 'unknown' - ); + expect(getExpressionType(getASTForExpression('does_not_exist()'))).toBe('unknown'); }); it('deals with bad function invocations', () => { - expect( - getExpressionType(getASTForExpression('test(1., "foo", "bar")'), new Map(), new Map()) - ).toBe('unknown'); + expect(getExpressionType(getASTForExpression('test(1., "foo", "bar")'))).toBe('unknown'); - expect(getExpressionType(getASTForExpression('test()'), new Map(), new Map())).toBe( - 'unknown' - ); + expect(getExpressionType(getASTForExpression('test()'))).toBe('unknown'); - expect(getExpressionType(getASTForExpression('test("foo", 1.)'), new Map(), new Map())).toBe( - 'unknown' - ); + expect(getExpressionType(getASTForExpression('test("foo", 1.)'))).toBe('unknown'); }); it('deals with the CASE function', () => { - expect(getExpressionType(getASTForExpression('CASE(true, 1, 2)'), new Map(), new Map())).toBe( - 'integer' - ); + expect(getExpressionType(getASTForExpression('CASE(true, 1, 2)'))).toBe('integer'); - expect( - getExpressionType(getASTForExpression('CASE(true, 1., true, 1., 2.)'), new Map(), new Map()) - ).toBe('double'); + expect(getExpressionType(getASTForExpression('CASE(true, 1., true, 1., 2.)'))).toBe('double'); expect( getExpressionType( @@ -306,6 +274,20 @@ describe('getExpressionType', () => { new Map() ) ).toBe('keyword'); + + expect( + getExpressionType( + getASTForExpression('CASE(true, "", true, "", keywordVar)'), + new Map(), + new Map([ + [`keywordVar`, [{ name: 'keywordVar', type: 'keyword', location: { min: 0, max: 0 } }]], + ]) + ) + ).toBe('keyword'); + }); + + it('supports COUNT(*)', () => { + expect(getExpressionType(getASTForExpression('COUNT(*)'))).toBe('long'); }); }); diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts index 2392a44814997..18d6ae6faa246 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts @@ -815,15 +815,31 @@ export function getExpressionType( return 'unknown'; } + /** + * Special case for COUNT(*) because + * the "*" column doesn't match any + * of COUNT's function definitions + */ + if ( + fnDefinition.name === 'count' && + root.args[0] && + isColumnItem(root.args[0]) && + root.args[0].name === '*' + ) { + return 'long'; + } + if (fnDefinition.name === 'case' && root.args.length) { - // The CASE function doesn't fit our system of function definitions - // and needs special handling. This is imperfect, but it's a start because - // at least we know that the final argument to case will never be a conditional - // expression, always a result expression. - // - // One problem with this is that if a false case is not provided, the return type - // will be null, which we aren't detecting. But this is ok because we consider - // variables and fields to be nullable anyways and account for that during validation. + /** + * The CASE function doesn't fit our system of function definitions + * and needs special handling. This is imperfect, but it's a start because + * at least we know that the final argument to case will never be a conditional + * expression, always a result expression. + * + * One problem with this is that if a false case is not provided, the return type + * will be null, which we aren't detecting. But this is ok because we consider + * variables and fields to be nullable anyways and account for that during validation. + */ return getExpressionType(root.args[root.args.length - 1], fields, variables); } From 88a86b29b82e13a065744859ee3c1540a01657e1 Mon Sep 17 00:00:00 2001 From: Drew Tate Date: Mon, 28 Oct 2024 09:41:01 -0600 Subject: [PATCH 080/135] [ES|QL] remove signatures from function suggestion labels (#197842) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Showing a single acceptable function signature in the suggestions list is confusing since it may imply that other options are not accepted. Instead, this PR follows the Typescript tooling and simply shows the function name in the list. ![Screenshot 2024-10-25 at 8 17 38 AM](https://github.com/user-attachments/assets/9caf4998-b144-45d4-8a53-b41846714d5b) The signatures are still available in the details flyout. Screenshot 2024-10-25 at 8 50 01 AM ### 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: Stratoula Kalafateli --- .../src/autocomplete/__tests__/helpers.ts | 7 +------ .../src/autocomplete/factories.ts | 2 +- .../src/validation/esql_validation_meta_tests.json | 4 ++-- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/helpers.ts index 93fd194d93a54..fa16a3df7026f 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/helpers.ts @@ -18,7 +18,6 @@ import * as autocomplete from '../autocomplete'; import type { ESQLCallbacks } from '../../shared/types'; import type { EditorContext, SuggestionRawDefinition } from '../types'; import { TIME_SYSTEM_PARAMS, TRIGGER_SUGGESTION_COMMAND, getSafeInsertText } from '../factories'; -import { getFunctionSignatures } from '../../definitions/helpers'; import { ESQLRealField } from '../../validation/types'; import { FieldType, @@ -214,13 +213,9 @@ export function getFunctionSignaturesByReturnType( label: name.toUpperCase(), }; } - const printedSignatures = getFunctionSignatures(definition, { - withTypes: true, - capitalize: true, - }); return { text: `${name.toUpperCase()}($0)`, - label: printedSignatures[0].declaration, + label: name.toUpperCase(), }; }); } diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts index 43f6f8ccff365..85c8d035d33b1 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts @@ -64,7 +64,7 @@ function getSafeInsertSourceText(text: string) { export function getSuggestionFunctionDefinition(fn: FunctionDefinition): SuggestionRawDefinition { const fullSignatures = getFunctionSignatures(fn, { capitalize: true, withTypes: true }); return { - label: fullSignatures[0].declaration, + label: fn.name.toUpperCase(), text: `${fn.name.toUpperCase()}($0)`, asSnippet: true, kind: 'Function', 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 c66aaadf98df8..f1e71c9ff6a97 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 @@ -9976,7 +9976,7 @@ { "query": "from index [METADATA _id, _source2]", "error": [ - "Metadata field [_source2] is not available. Available metadata fields are: [_version, _id, _index, _source, _ignored]" + "Metadata field [_source2] is not available. Available metadata fields are: [_version, _id, _index, _source, _ignored, _index_mode]" ], "warning": [ "Square brackets '[]' need to be removed from FROM METADATA declaration" @@ -10014,7 +10014,7 @@ { "query": "from index METADATA _id, _source2", "error": [ - "Metadata field [_source2] is not available. Available metadata fields are: [_version, _id, _index, _source, _ignored]" + "Metadata field [_source2] is not available. Available metadata fields are: [_version, _id, _index, _source, _ignored, _index_mode]" ], "warning": [] }, From 043e18b6a097f4405ff37a99396c0c8c92db6b44 Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Mon, 28 Oct 2024 11:43:51 -0400 Subject: [PATCH 081/135] [Response Ops][Task Manager] Propagate `msearch` error status code so backpressure mechanism responds correctly (#197501) Resolves https://github.com/elastic/response-ops-team/issues/240 ## Summary Creating an `MsearchError` class that preserves the status code from any msearch errors. These errors are already piped to the managed configuration observable that watches for and responds to ES errors from the update by query claim strategy so I updated that filter to filter for msearch 429 and 503 errors as well. ## To Verify 1. Make sure you're using the mget claim strategy (`xpack.task_manager.claim_strategy: 'mget'`) and start ES and Kibana. 2. Inject a 429 error into an msearch response. ``` --- a/x-pack/plugins/task_manager/server/task_store.ts +++ b/x-pack/plugins/task_manager/server/task_store.ts @@ -571,6 +571,8 @@ export class TaskStore { }); const { responses } = result; + responses[0].status = 429; + const versionMap = this.createVersionMap([]); ``` 3. See task manager log the msearch errors and eventually reduce polling capacity ``` [2024-10-23T15:35:59.255-04:00][ERROR][plugins.taskManager] Failed to poll for work: Unexpected status code from taskStore::msearch: 429 [2024-10-23T15:35:59.756-04:00][ERROR][plugins.taskManager] Failed to poll for work: Unexpected status code from taskStore::msearch: 429 [2024-10-23T15:36:00.257-04:00][ERROR][plugins.taskManager] Failed to poll for work: Unexpected status code from taskStore::msearch: 429 [2024-10-23T15:36:00.757-04:00][ERROR][plugins.taskManager] Failed to poll for work: Unexpected status code from taskStore::msearch: 429 ... [2024-10-23T15:36:06.267-04:00][WARN ][plugins.taskManager] Poll interval configuration is temporarily increased after Elasticsearch returned 19 "too many request" and/or "execute [inline] script" error(s). [2024-10-23T15:36:06.268-04:00][WARN ][plugins.taskManager] Capacity configuration is temporarily reduced after Elasticsearch returned 19 "too many request" and/or "execute [inline] script" error(s). ``` --------- Co-authored-by: Elastic Machine --- .../lib/create_managed_configuration.test.ts | 29 +++++++++++++------ .../lib/create_managed_configuration.ts | 5 +++- .../task_manager/server/lib/msearch_error.ts | 25 ++++++++++++++++ .../task_manager/server/task_store.test.ts | 12 ++++++-- .../plugins/task_manager/server/task_store.ts | 3 +- 5 files changed, 60 insertions(+), 14 deletions(-) create mode 100644 x-pack/plugins/task_manager/server/lib/msearch_error.ts diff --git a/x-pack/plugins/task_manager/server/lib/create_managed_configuration.test.ts b/x-pack/plugins/task_manager/server/lib/create_managed_configuration.test.ts index d863fb9b300fd..5e0a5ed4f2e67 100644 --- a/x-pack/plugins/task_manager/server/lib/create_managed_configuration.test.ts +++ b/x-pack/plugins/task_manager/server/lib/create_managed_configuration.test.ts @@ -14,6 +14,7 @@ import { } from './create_managed_configuration'; import { mockLogger } from '../test_utils'; import { CLAIM_STRATEGY_UPDATE_BY_QUERY, CLAIM_STRATEGY_MGET, TaskManagerConfig } from '../config'; +import { MsearchError } from './msearch_error'; describe('createManagedConfiguration()', () => { let clock: sinon.SinonFakeTimers; @@ -235,9 +236,9 @@ describe('createManagedConfiguration()', () => { }); describe('mget claim strategy', () => { - test('should decrease configuration at the next interval when an error is emitted', async () => { - const { subscription, errors$ } = setupScenario(10, CLAIM_STRATEGY_MGET); - errors$.next(SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b')); + test('should decrease configuration at the next interval when an msearch 429 error is emitted', async () => { + const { subscription, errors$ } = setupScenario(10); + errors$.next(new MsearchError(429)); clock.tick(ADJUST_THROUGHPUT_INTERVAL - 1); expect(subscription).toHaveBeenCalledTimes(1); expect(subscription).toHaveBeenNthCalledWith(1, 10); @@ -246,9 +247,9 @@ describe('createManagedConfiguration()', () => { expect(subscription).toHaveBeenNthCalledWith(2, 8); }); - test('should decrease configuration at the next interval when a 503 error is emitted', async () => { - const { subscription, errors$ } = setupScenario(10, CLAIM_STRATEGY_MGET); - errors$.next(SavedObjectsErrorHelpers.createGenericNotFoundEsUnavailableError('a', 'b')); + test('should decrease configuration at the next interval when an msearch 503 error is emitted', async () => { + const { subscription, errors$ } = setupScenario(10); + errors$.next(new MsearchError(503)); clock.tick(ADJUST_THROUGHPUT_INTERVAL - 1); expect(subscription).toHaveBeenCalledTimes(1); expect(subscription).toHaveBeenNthCalledWith(1, 10); @@ -257,9 +258,19 @@ describe('createManagedConfiguration()', () => { expect(subscription).toHaveBeenNthCalledWith(2, 8); }); + test('should not change configuration at the next interval when other msearch error is emitted', async () => { + const { subscription, errors$ } = setupScenario(10); + errors$.next(new MsearchError(404)); + clock.tick(ADJUST_THROUGHPUT_INTERVAL - 1); + expect(subscription).toHaveBeenCalledTimes(1); + expect(subscription).toHaveBeenNthCalledWith(1, 10); + clock.tick(1); + expect(subscription).toHaveBeenCalledTimes(1); + }); + test('should log a warning when the configuration changes from the starting value', async () => { const { errors$ } = setupScenario(10, CLAIM_STRATEGY_MGET); - errors$.next(SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b')); + errors$.next(new MsearchError(429)); clock.tick(ADJUST_THROUGHPUT_INTERVAL); expect(logger.warn).toHaveBeenCalledWith( 'Capacity configuration is temporarily reduced after Elasticsearch returned 1 "too many request" and/or "execute [inline] script" error(s).' @@ -268,7 +279,7 @@ describe('createManagedConfiguration()', () => { test('should increase configuration back to normal incrementally after an error is emitted', async () => { const { subscription, errors$ } = setupScenario(10, CLAIM_STRATEGY_MGET); - errors$.next(SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b')); + errors$.next(new MsearchError(429)); clock.tick(ADJUST_THROUGHPUT_INTERVAL * 10); expect(subscription).toHaveBeenNthCalledWith(1, 10); expect(subscription).toHaveBeenNthCalledWith(2, 8); @@ -281,7 +292,7 @@ describe('createManagedConfiguration()', () => { test('should keep reducing configuration when errors keep emitting until it reaches minimum', async () => { const { subscription, errors$ } = setupScenario(10, CLAIM_STRATEGY_MGET); for (let i = 0; i < 20; i++) { - errors$.next(SavedObjectsErrorHelpers.createTooManyRequestsError('a', 'b')); + errors$.next(new MsearchError(429)); clock.tick(ADJUST_THROUGHPUT_INTERVAL); } expect(subscription).toHaveBeenNthCalledWith(1, 10); diff --git a/x-pack/plugins/task_manager/server/lib/create_managed_configuration.ts b/x-pack/plugins/task_manager/server/lib/create_managed_configuration.ts index a0adee6d05818..8a76029efb8eb 100644 --- a/x-pack/plugins/task_manager/server/lib/create_managed_configuration.ts +++ b/x-pack/plugins/task_manager/server/lib/create_managed_configuration.ts @@ -12,6 +12,7 @@ import { Logger } from '@kbn/core/server'; import { isEsCannotExecuteScriptError } from './identify_es_error'; import { CLAIM_STRATEGY_MGET, DEFAULT_CAPACITY, MAX_CAPACITY, TaskManagerConfig } from '../config'; import { TaskCost } from '../task'; +import { getMsearchStatusCode } from './msearch_error'; const FLUSH_MARKER = Symbol('flush'); export const ADJUST_THROUGHPUT_INTERVAL = 10 * 1000; @@ -164,7 +165,9 @@ function countErrors(errors$: Observable, countInterval: number): Observa (e) => SavedObjectsErrorHelpers.isTooManyRequestsError(e) || SavedObjectsErrorHelpers.isEsUnavailableError(e) || - isEsCannotExecuteScriptError(e) + isEsCannotExecuteScriptError(e) || + getMsearchStatusCode(e) === 429 || + getMsearchStatusCode(e) === 503 ) ) ).pipe( diff --git a/x-pack/plugins/task_manager/server/lib/msearch_error.ts b/x-pack/plugins/task_manager/server/lib/msearch_error.ts new file mode 100644 index 0000000000000..8cd61a53dd2a7 --- /dev/null +++ b/x-pack/plugins/task_manager/server/lib/msearch_error.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 class MsearchError extends Error { + private _statusCode?: number; + + constructor(statusCode?: number) { + super(`Unexpected status code from taskStore::msearch: ${statusCode ?? 'unknown'}`); + this._statusCode = statusCode; + } + + public get statusCode() { + return this._statusCode; + } +} + +export function getMsearchStatusCode(error: Error | MsearchError): number | undefined { + if (Boolean(error && error instanceof MsearchError)) { + return (error as MsearchError).statusCode; + } +} diff --git a/x-pack/plugins/task_manager/server/task_store.test.ts b/x-pack/plugins/task_manager/server/task_store.test.ts index 18dc3fa3c44ce..f1374f6d27b76 100644 --- a/x-pack/plugins/task_manager/server/task_store.test.ts +++ b/x-pack/plugins/task_manager/server/task_store.test.ts @@ -30,6 +30,7 @@ import { mockLogger } from './test_utils'; import { AdHocTaskCounter } from './lib/adhoc_task_counter'; import { asErr, asOk } from './lib/result_type'; import { UpdateByQueryResponse } from '@elastic/elasticsearch/lib/api/types'; +import { MsearchError } from './lib/msearch_error'; const mockGetValidatedTaskInstanceFromReading = jest.fn(); const mockGetValidatedTaskInstanceForUpdating = jest.fn(); @@ -490,9 +491,14 @@ describe('TaskStore', () => { }, ], } as estypes.MsearchResponse); - await expect(store.msearch([{}])).rejects.toThrowErrorMatchingInlineSnapshot( - `"Unexpected status code from taskStore::msearch: 429"` - ); + + try { + await store.msearch([{}]); + throw new Error('should have thrown'); + } catch (err) { + expect(err instanceof MsearchError).toBe(true); + expect(err.statusCode).toEqual(429); + } expect(await firstErrorPromise).toMatchInlineSnapshot( `[Error: Unexpected status code from taskStore::msearch: 429]` ); diff --git a/x-pack/plugins/task_manager/server/task_store.ts b/x-pack/plugins/task_manager/server/task_store.ts index 83c69ebdb2d88..2b3440e87c0f8 100644 --- a/x-pack/plugins/task_manager/server/task_store.ts +++ b/x-pack/plugins/task_manager/server/task_store.ts @@ -47,6 +47,7 @@ import { TaskValidator } from './task_validator'; import { claimSort } from './queries/mark_available_tasks_as_claimed'; import { MAX_PARTITIONS } from './lib/task_partitioner'; import { ErrorOutput } from './lib/bulk_operation_buffer'; +import { MsearchError } from './lib/msearch_error'; export interface StoreOpts { esClient: ElasticsearchClient; @@ -575,7 +576,7 @@ export class TaskStore { for (const response of responses) { if (response.status !== 200) { - const err = new Error(`Unexpected status code from taskStore::msearch: ${response.status}`); + const err = new MsearchError(response.status); this.errors$.next(err); throw err; } From 0405fb7b139c9ef7434e29d878636202a3cd541a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loix?= Date: Mon, 28 Oct 2024 15:50:45 +0000 Subject: [PATCH 082/135] [Stateful sidenav] Fix dashboard listing breadcrumbs (#197986) --- .../listing_page/dashboard_listing_page.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/plugins/dashboard/public/dashboard_app/listing_page/dashboard_listing_page.tsx b/src/plugins/dashboard/public/dashboard_app/listing_page/dashboard_listing_page.tsx index 034ee2f8e45f4..59b3b3926060a 100644 --- a/src/plugins/dashboard/public/dashboard_app/listing_page/dashboard_listing_page.tsx +++ b/src/plugins/dashboard/public/dashboard_app/listing_page/dashboard_listing_page.tsx @@ -50,11 +50,16 @@ export const DashboardListingPage = ({ }, []); useEffect(() => { - coreServices.chrome.setBreadcrumbs([ + coreServices.chrome.setBreadcrumbs( + [ + { + text: getDashboardBreadcrumb(), + }, + ], { - text: getDashboardBreadcrumb(), - }, - ]); + project: { value: [] }, + } + ); if (serverlessService) { // if serverless breadcrumbs available, From 8fc7df26a5b0f57e30f7f6a0dfdf0beb57333fb7 Mon Sep 17 00:00:00 2001 From: Thom Heymann <190132+thomheymann@users.noreply.github.com> Date: Mon, 28 Oct 2024 15:52:18 +0000 Subject: [PATCH 083/135] [Onboarding] Check for user privileges before creating an API key (#197964) Resolves https://github.com/elastic/kibana/issues/192983 Check for user privileges before creating an API key Screenshot 2024-10-28 at 10 28 58 --- .../quickstart_flows/otel_logs/index.tsx | 23 +++++++++++-------- .../server/routes/logs/route.ts | 7 ++++++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_logs/index.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_logs/index.tsx index bb3b76556a617..4d0de71d6faaf 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_logs/index.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/otel_logs/index.tsx @@ -30,9 +30,9 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import useAsyncFn from 'react-use/lib/useAsyncFn'; import { FormattedMessage } from '@kbn/i18n-react'; import { ObservabilityOnboardingAppServices } from '../../..'; -import { ApiKeyBanner } from '../custom_logs/api_key_banner'; import { useFetcher } from '../../../hooks/use_fetcher'; import { MultiIntegrationInstallBanner } from './multi_integration_install_banner'; +import { EmptyPrompt } from '../shared/empty_prompt'; import { FeedbackButtons } from '../shared/feedback_buttons'; const HOST_COMMAND = i18n.translate( @@ -46,11 +46,15 @@ const HOST_COMMAND = i18n.translate( export const OtelLogsPanel: React.FC = () => { const { data: apiKeyData, - status: apiKeyStatus, error, - } = useFetcher((callApi) => { - return callApi('POST /internal/observability_onboarding/otel/api_key', {}); - }, []); + refetch, + } = useFetcher( + (callApi) => { + return callApi('POST /internal/observability_onboarding/otel/api_key', {}); + }, + [], + { showToastOnError: false } + ); const { data: setup } = useFetcher((callApi) => { return callApi('GET /internal/observability_onboarding/logs/setup/environment'); @@ -116,15 +120,14 @@ rm ./otel.yml && cp ./otel_samples/platformlogs_hostmetrics.yml ./otel.yml && mk const selectedContent = installTabContents.find((tab) => tab.id === selectedTab)!; + if (error) { + return ; + } + return ( - {error && ( - - - - )} Date: Mon, 28 Oct 2024 12:00:12 -0400 Subject: [PATCH 084/135] [Fleet] Couple agent and package policies spaces (#197487) --- x-pack/plugins/fleet/server/mocks/index.ts | 1 + .../server/services/package_policy.test.ts | 68 ++++++++- .../fleet/server/services/package_policy.ts | 111 +++++++++++--- .../services/spaces/agent_policy.test.ts | 136 ++++++++++++++++++ .../server/services/spaces/agent_policy.ts | 9 +- .../server/services/spaces/package_policy.ts | 41 ++++++ .../change_space_agent_policies.ts | 4 +- 7 files changed, 346 insertions(+), 24 deletions(-) create mode 100644 x-pack/plugins/fleet/server/services/spaces/agent_policy.test.ts create mode 100644 x-pack/plugins/fleet/server/services/spaces/package_policy.ts diff --git a/x-pack/plugins/fleet/server/mocks/index.ts b/x-pack/plugins/fleet/server/mocks/index.ts index ac806c1448a24..f032c1f7bb8c7 100644 --- a/x-pack/plugins/fleet/server/mocks/index.ts +++ b/x-pack/plugins/fleet/server/mocks/index.ts @@ -113,6 +113,7 @@ export const createAppContextStartContractMock = ( experimentalFeatures: { agentTamperProtectionEnabled: true, diagnosticFileUploadEnabled: true, + enableReusableIntegrationPolicies: true, } as ExperimentalFeatures, isProductionMode: true, configInitialValue: { diff --git a/x-pack/plugins/fleet/server/services/package_policy.test.ts b/x-pack/plugins/fleet/server/services/package_policy.test.ts index 30523448e721d..7ea6ae290708b 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.test.ts @@ -76,9 +76,12 @@ import { sendTelemetryEvents } from './upgrade_sender'; import { auditLoggingService } from './audit_logging'; import { agentPolicyService } from './agent_policy'; import { isSpaceAwarenessEnabled } from './spaces/helpers'; +import { licenseService } from './license'; jest.mock('./spaces/helpers'); +jest.mock('./license'); + const mockedSendTelemetryEvents = sendTelemetryEvents as jest.MockedFunction< typeof sendTelemetryEvents >; @@ -207,7 +210,7 @@ const mockedAuditLoggingService = auditLoggingService as jest.Mocked { +const mockAgentPolicyGet = (spaceIds: string[] = ['default']) => { mockAgentPolicyService.get.mockImplementation( (_soClient: SavedObjectsClientContract, id: string, _force = false, _errorMessage?: string) => { return Promise.resolve({ @@ -220,9 +223,29 @@ const mockAgentPolicyGet = () => { updated_by: 'test', revision: 1, is_protected: false, + space_ids: spaceIds, }); } ); + mockAgentPolicyService.getByIDs.mockImplementation( + // @ts-ignore + (_soClient: SavedObjectsClientContract, ids: string[]) => { + return Promise.resolve( + ids.map((id) => ({ + id, + name: 'Test Agent Policy', + namespace: 'test', + status: 'active', + is_managed: false, + updated_at: new Date().toISOString(), + updated_by: 'test', + revision: 1, + is_protected: false, + space_ids: spaceIds, + })) + ); + } + ); }; describe('Package policy service', () => { @@ -240,6 +263,9 @@ describe('Package policy service', () => { }); describe('create', () => { + beforeEach(() => { + jest.mocked(licenseService.hasAtLeast).mockReturnValue(true); + }); it('should call audit logger', async () => { const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; const soClient = savedObjectsClientMock.create(); @@ -279,6 +305,46 @@ describe('Package policy service', () => { savedObjectType: LEGACY_PACKAGE_POLICY_SAVED_OBJECT_TYPE, }); }); + + it('should not allow to add a reusable integration policies to an agent policies belonging to multiple spaces', async () => { + jest.mocked(isSpaceAwarenessEnabled).mockResolvedValue(true); + + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + const soClient = savedObjectsClientMock.create(); + + soClient.create.mockResolvedValueOnce({ + id: 'test-package-policy', + attributes: {}, + references: [], + type: PACKAGE_POLICY_SAVED_OBJECT_TYPE, + }); + + mockAgentPolicyGet(['test', 'default']); + + await expect( + packagePolicyService.create( + soClient, + esClient, + { + name: 'Test Package Policy', + namespace: 'test', + enabled: true, + policy_id: 'test', + policy_ids: ['test1', 'test2'], + inputs: [], + package: { + name: 'test', + title: 'Test', + version: '0.0.1', + }, + }, + // Skipping unique name verification just means we have to less mocking/setup + { id: 'test-package-policy', skipUniqueNameVerification: true } + ) + ).rejects.toThrowError( + /Reusable integration policies cannot be used with agent policies belonging to multiple spaces./ + ); + }); }); describe('inspect', () => { diff --git a/x-pack/plugins/fleet/server/services/package_policy.ts b/x-pack/plugins/fleet/server/services/package_policy.ts index daa08844d5fbc..bc5bce9eea2a3 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.ts @@ -7,6 +7,7 @@ /* eslint-disable max-classes-per-file */ import { omit, partition, isEqual, cloneDeep, without } from 'lodash'; +import { indexBy } from 'lodash/fp'; import { i18n } from '@kbn/i18n'; import semverLt from 'semver/functions/lt'; import { getFlattenedObject } from '@kbn/std'; @@ -144,6 +145,7 @@ import { validateAgentPolicyOutputForIntegration } from './agent_policies/output import type { PackagePolicyClientFetchAllItemIdsOptions } from './package_policy_service'; import { validatePolicyNamespaceForSpace } from './spaces/policy_namespaces'; import { isSpaceAwarenessEnabled, isSpaceAwarenessMigrationPending } from './spaces/helpers'; +import { updatePackagePolicySpaces } from './spaces/package_policy'; export type InputsOverride = Partial & { vars?: Array; @@ -227,6 +229,7 @@ class PackagePolicyClientImpl implements PackagePolicyClient { context?: RequestHandlerContext, request?: KibanaRequest ): Promise { + const useSpaceAwareness = await isSpaceAwarenessEnabled(); const packagePolicyId = options?.id || uuidv4(); let authorizationHeader = options.authorizationHeader; @@ -274,6 +277,10 @@ class PackagePolicyClientImpl implements PackagePolicyClient { for (const policyId of enrichedPackagePolicy.policy_ids) { const agentPolicy = await agentPolicyService.get(soClient, policyId, true); + if (!agentPolicy) { + throw new AgentPolicyNotFoundError('Agent policy not found'); + } + agentPolicies.push(agentPolicy); // If package policy did not set an output_id, see if the agent policy's output is compatible @@ -285,7 +292,10 @@ class PackagePolicyClientImpl implements PackagePolicyClient { ); } - await validateIsNotHostedPolicy(soClient, policyId, options?.force); + validateIsNotHostedPolicy(agentPolicy, options?.force); + if (useSpaceAwareness) { + validateReusableIntegrationsAndSpaceAwareness(enrichedPackagePolicy, agentPolicies); + } } // trailing whitespace causes issues creating API keys @@ -413,6 +423,21 @@ class PackagePolicyClientImpl implements PackagePolicyClient { { ...options, id: packagePolicyId } ); + for (const agentPolicy of agentPolicies) { + if ( + useSpaceAwareness && + agentPolicy && + agentPolicy.space_ids && + agentPolicy.space_ids.length > 1 + ) { + await updatePackagePolicySpaces({ + packagePolicyId: newSo.id, + currentSpaceId: soClient.getCurrentNamespace() ?? DEFAULT_SPACE_ID, + newSpaceIds: agentPolicy.space_ids, + }); + } + } + if (options?.bumpRevision ?? true) { for (const policyId of enrichedPackagePolicy.policy_ids) { await agentPolicyService.bumpRevision(soClient, esClient, policyId, { @@ -460,6 +485,7 @@ class PackagePolicyClientImpl implements PackagePolicyClient { created: PackagePolicy[]; failed: Array<{ packagePolicy: NewPackagePolicy; error?: Error | SavedObjectError }>; }> { + const useSpaceAwareness = await isSpaceAwarenessEnabled(); const savedObjectType = await getPackagePolicySavedObjectType(); for (const packagePolicy of packagePolicies) { const basePkgInfo = packagePolicy.package @@ -486,8 +512,20 @@ class PackagePolicyClientImpl implements PackagePolicyClient { const agentPolicyIds = new Set(packagePolicies.flatMap((pkgPolicy) => pkgPolicy.policy_ids)); - for (const agentPolicyId of agentPolicyIds) { - await validateIsNotHostedPolicy(soClient, agentPolicyId, options?.force); + const agentPolicies = await agentPolicyService.getByIDs(soClient, [...agentPolicyIds]); + const agentPoliciesIndexById = indexBy('id', agentPolicies); + for (const agentPolicy of agentPolicies) { + validateIsNotHostedPolicy(agentPolicy, options?.force); + } + if (useSpaceAwareness) { + for (const packagePolicy of packagePolicies) { + validateReusableIntegrationsAndSpaceAwareness( + packagePolicy, + packagePolicy.policy_ids + .map((policyId) => agentPoliciesIndexById[policyId]) + .filter((policy) => policy !== undefined) + ); + } } const packageInfos = await getPackageInfoForPackagePolicies(packagePolicies, soClient); @@ -604,6 +642,23 @@ class PackagePolicyClientImpl implements PackagePolicyClient { } }); + if (useSpaceAwareness) { + for (const newSo of newSos) { + // Do not support multpile spaces for reusable integrations + if (newSo.attributes.policy_ids.length > 1) { + continue; + } + const agentPolicy = agentPoliciesIndexById[newSo.attributes.policy_ids[0]]; + if (agentPolicy && agentPolicy.space_ids && agentPolicy.space_ids.length > 1) { + await updatePackagePolicySpaces({ + packagePolicyId: newSo.id, + currentSpaceId: soClient.getCurrentNamespace() ?? DEFAULT_SPACE_ID, + newSpaceIds: agentPolicy.space_ids, + }); + } + } + } + // Assign it to the given agent policy if (options?.bumpRevision ?? true) { @@ -1001,6 +1056,17 @@ class PackagePolicyClientImpl implements PackagePolicyClient { } } + if ((packagePolicyUpdate.policy_ids?.length ?? 0) > 1) { + for (const policyId of packagePolicyUpdate.policy_ids) { + const agentPolicy = await agentPolicyService.get(soClient, policyId, true); + if ((agentPolicy?.space_ids?.length ?? 0) > 1) { + throw new FleetError( + 'Reusable integration policies cannot be used with agent policies belonging to multiple spaces.' + ); + } + } + } + // Handle component template/mappings updates for experimental features, e.g. synthetic source await handleExperimentalDatastreamFeatureOptIn({ soClient, @@ -1391,9 +1457,13 @@ class PackagePolicyClientImpl implements PackagePolicyClient { for (const agentPolicyId of uniqueAgentPolicyIds) { try { - const agentPolicy = await validateIsNotHostedPolicy( - soClient, - agentPolicyId, + const agentPolicy = await agentPolicyService.get(soClient, agentPolicyId); + if (!agentPolicy) { + throw new AgentPolicyNotFoundError('Agent policy not found'); + } + + validateIsNotHostedPolicy( + agentPolicy, options?.force, 'Cannot remove integrations of hosted agent policy' ); @@ -3025,27 +3095,30 @@ export function _validateRestrictedFieldsNotModifiedOrThrow(opts: { } } -async function validateIsNotHostedPolicy( - soClient: SavedObjectsClientContract, - id: string, - force = false, - errorMessage?: string -): Promise { - const agentPolicy = await agentPolicyService.get(soClient, id, false); - - if (!agentPolicy) { - throw new AgentPolicyNotFoundError('Agent policy not found'); +function validateReusableIntegrationsAndSpaceAwareness( + packagePolicy: Pick, + agentPolicies: AgentPolicy[] +) { + if ((packagePolicy.policy_ids.length ?? 0) <= 1) { + return; } + for (const agentPolicy of agentPolicies) { + if ((agentPolicy?.space_ids?.length ?? 0) > 1) { + throw new FleetError( + 'Reusable integration policies cannot be used with agent policies belonging to multiple spaces.' + ); + } + } +} +function validateIsNotHostedPolicy(agentPolicy: AgentPolicy, force = false, errorMessage?: string) { const isManagedPolicyWithoutServerlessSupport = agentPolicy.is_managed && !force; if (isManagedPolicyWithoutServerlessSupport) { throw new HostedAgentPolicyRestrictionRelatedError( - errorMessage ?? `Cannot update integrations of hosted agent policy ${id}` + errorMessage ?? `Cannot update integrations of hosted agent policy ${agentPolicy.id}` ); } - - return agentPolicy; } export function sendUpdatePackagePolicyTelemetryEvent( diff --git a/x-pack/plugins/fleet/server/services/spaces/agent_policy.test.ts b/x-pack/plugins/fleet/server/services/spaces/agent_policy.test.ts new file mode 100644 index 0000000000000..6c2c8e4d6fa50 --- /dev/null +++ b/x-pack/plugins/fleet/server/services/spaces/agent_policy.test.ts @@ -0,0 +1,136 @@ +/* + * 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 { createAppContextStartContractMock } from '../../mocks'; +import { agentPolicyService } from '../agent_policy'; +import { appContextService } from '../app_context'; +import { packagePolicyService } from '../package_policy'; + +import { updateAgentPolicySpaces } from './agent_policy'; +import { isSpaceAwarenessEnabled } from './helpers'; + +jest.mock('./helpers'); +jest.mock('../agent_policy'); +jest.mock('../package_policy'); + +describe('updateAgentPolicySpaces', () => { + beforeEach(() => { + jest.mocked(isSpaceAwarenessEnabled).mockResolvedValue(true); + jest.mocked(agentPolicyService.get).mockResolvedValue({ + id: 'policy1', + space_ids: ['default'], + } as any); + jest.mocked(packagePolicyService.findAllForAgentPolicy).mockResolvedValue([ + { + id: 'package-policy-1', + policy_ids: ['policy1'], + }, + { + id: 'package-policy-2', + policy_ids: ['policy1'], + }, + ] as any); + appContextService.start(createAppContextStartContractMock()); + + jest + .mocked(appContextService.getInternalUserSOClientWithoutSpaceExtension()) + .updateObjectsSpaces.mockResolvedValue({ objects: [] }); + }); + + it('does nothings if agent policy already in correct space', async () => { + await updateAgentPolicySpaces({ + agentPolicyId: 'policy1', + currentSpaceId: 'default', + newSpaceIds: ['default'], + authorizedSpaces: ['default'], + }); + expect( + appContextService.getInternalUserSOClientWithoutSpaceExtension().updateObjectsSpaces + ).not.toBeCalled(); + }); + + it('does nothing if feature flag is not enabled', async () => { + jest.mocked(isSpaceAwarenessEnabled).mockResolvedValue(false); + await updateAgentPolicySpaces({ + agentPolicyId: 'policy1', + currentSpaceId: 'default', + newSpaceIds: ['test'], + authorizedSpaces: ['test', 'default'], + }); + + expect( + appContextService.getInternalUserSOClientWithoutSpaceExtension().updateObjectsSpaces + ).not.toBeCalled(); + }); + + it('allow to change spaces', async () => { + await updateAgentPolicySpaces({ + agentPolicyId: 'policy1', + currentSpaceId: 'default', + newSpaceIds: ['test'], + authorizedSpaces: ['test', 'default'], + }); + + expect( + appContextService.getInternalUserSOClientWithoutSpaceExtension().updateObjectsSpaces + ).toBeCalledWith( + [ + { id: 'policy1', type: 'fleet-agent-policies' }, + { id: 'package-policy-1', type: 'fleet-package-policies' }, + { id: 'package-policy-2', type: 'fleet-package-policies' }, + ], + ['test'], + ['default'], + { namespace: 'default', refresh: 'wait_for' } + ); + }); + + it('throw when trying to change space to a policy with reusable package policies', async () => { + jest.mocked(packagePolicyService.findAllForAgentPolicy).mockResolvedValue([ + { + id: 'package-policy-1', + policy_ids: ['policy1'], + }, + { + id: 'package-policy-2', + policy_ids: ['policy1', 'policy2'], + }, + ] as any); + await expect( + updateAgentPolicySpaces({ + agentPolicyId: 'policy1', + currentSpaceId: 'default', + newSpaceIds: ['test'], + authorizedSpaces: ['test', 'default'], + }) + ).rejects.toThrowError( + /Agent policies using reusable integration policies cannot be moved to a different space./ + ); + }); + + it('throw when trying to add a space with missing permissions', async () => { + await expect( + updateAgentPolicySpaces({ + agentPolicyId: 'policy1', + currentSpaceId: 'default', + newSpaceIds: ['default', 'test'], + authorizedSpaces: ['default'], + }) + ).rejects.toThrowError(/Not enough permissions to create policies in space test/); + }); + + it('throw when trying to remove a space with missing permissions', async () => { + await expect( + updateAgentPolicySpaces({ + agentPolicyId: 'policy1', + currentSpaceId: 'default', + newSpaceIds: ['test'], + authorizedSpaces: ['test'], + }) + ).rejects.toThrowError(/Not enough permissions to remove policies from space default/); + }); +}); diff --git a/x-pack/plugins/fleet/server/services/spaces/agent_policy.ts b/x-pack/plugins/fleet/server/services/spaces/agent_policy.ts index f488a89297265..905f7980af994 100644 --- a/x-pack/plugins/fleet/server/services/spaces/agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/spaces/agent_policy.ts @@ -54,6 +54,11 @@ export async function updateAgentPolicySpaces({ return; } + if (existingPackagePolicies.some((packagePolicy) => packagePolicy.policy_ids.length > 1)) { + throw new FleetError( + 'Agent policies using reusable integration policies cannot be moved to a different space.' + ); + } const spacesToAdd = newSpaceIds.filter( (spaceId) => !existingPolicy?.space_ids?.includes(spaceId) ?? true ); @@ -63,13 +68,13 @@ export async function updateAgentPolicySpaces({ // Privileges check for (const spaceId of spacesToAdd) { if (!authorizedSpaces.includes(spaceId)) { - throw new FleetError(`No enough permissions to create policies in space ${spaceId}`); + throw new FleetError(`Not enough permissions to create policies in space ${spaceId}`); } } for (const spaceId of spacesToRemove) { if (!authorizedSpaces.includes(spaceId)) { - throw new FleetError(`No enough permissions to remove policies from space ${spaceId}`); + throw new FleetError(`Not enough permissions to remove policies from space ${spaceId}`); } } diff --git a/x-pack/plugins/fleet/server/services/spaces/package_policy.ts b/x-pack/plugins/fleet/server/services/spaces/package_policy.ts new file mode 100644 index 0000000000000..3abf796061a07 --- /dev/null +++ b/x-pack/plugins/fleet/server/services/spaces/package_policy.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '../../../common/constants'; + +import { appContextService } from '../app_context'; + +export async function updatePackagePolicySpaces({ + packagePolicyId, + currentSpaceId, + newSpaceIds, +}: { + packagePolicyId: string; + currentSpaceId: string; + newSpaceIds: string[]; +}) { + const soClientWithoutSpaceExtension = + appContextService.getInternalUserSOClientWithoutSpaceExtension(); + + const results = await soClientWithoutSpaceExtension.updateObjectsSpaces( + [ + { + id: packagePolicyId, + type: PACKAGE_POLICY_SAVED_OBJECT_TYPE, + }, + ], + newSpaceIds, + [], + { refresh: 'wait_for', namespace: currentSpaceId } + ); + + for (const soRes of results.objects) { + if (soRes.error) { + throw soRes.error; + } + } +} diff --git a/x-pack/test/fleet_api_integration/apis/space_awareness/change_space_agent_policies.ts b/x-pack/test/fleet_api_integration/apis/space_awareness/change_space_agent_policies.ts index 5fed20f71e664..7a803fd4f66db 100644 --- a/x-pack/test/fleet_api_integration/apis/space_awareness/change_space_agent_policies.ts +++ b/x-pack/test/fleet_api_integration/apis/space_awareness/change_space_agent_policies.ts @@ -165,7 +165,7 @@ export default function (providerContext: FtrProviderContext) { description: 'tata', space_ids: ['default', TEST_SPACE_1], }), - /400 Bad Request No enough permissions to create policies in space test1/ + /400 Bad Request Not enough permissions to create policies in space test1/ ); }); @@ -190,7 +190,7 @@ export default function (providerContext: FtrProviderContext) { description: 'tata', space_ids: ['default'], }), - /400 Bad Request No enough permissions to remove policies from space test1/ + /400 Bad Request Not enough permissions to remove policies from space test1/ ); }); }); From babb0feb8e10928b9585765fbce9ca69b5168550 Mon Sep 17 00:00:00 2001 From: Ersin Erdal <92688503+ersin-erdal@users.noreply.github.com> Date: Mon, 28 Oct 2024 17:07:35 +0100 Subject: [PATCH 085/135] Consolidate Rule schemas (#195613) Towards: #172513 This PR removes `RawRule` type from `alerting/server/type` and `RuleAttributes` schema/types. And uses the `RawRule` that is used for ModelVersions instead of them. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- oas_docs/bundle.json | 352 +++--------------- oas_docs/bundle.serverless.json | 352 +++--------------- .../output/kibana.serverless.staging.yaml | 0 oas_docs/output/kibana.serverless.yaml | 336 ++++------------- oas_docs/output/kibana.staging.yaml | 0 oas_docs/output/kibana.yaml | 336 ++++------------- packages/kbn-alerting-types/r_rule_types.ts | 2 +- packages/kbn-rrule/rrule.ts | 8 + .../check_registered_types.test.ts | 2 +- .../routes/r_rule/response/schemas/v1.ts | 130 ++++--- .../common/routes/rule/response/schemas/v1.ts | 29 +- .../transform_maintenance_window_response.ts | 1 - .../methods/schedule/schedule_backfill.ts | 8 +- .../archive/archive_maintenance_window.ts | 1 - .../finish/finish_maintenance_window.ts | 1 - .../update/update_maintenance_window.ts | 1 - .../r_rule/schemas/r_rule_schema.ts | 20 +- .../methods/bulk_delete/bulk_delete_rules.ts | 21 +- .../bulk_disable/bulk_disable_rules.ts | 30 +- .../methods/bulk_edit/bulk_edit_rules.test.ts | 4 +- .../rule/methods/bulk_edit/bulk_edit_rules.ts | 45 ++- .../methods/bulk_enable/bulk_enable_rules.ts | 24 +- .../rule/methods/clone/clone_rule.ts | 15 +- .../rule/methods/create/create_rule.ts | 8 +- .../rule/methods/delete/delete_rule.ts | 3 +- .../rule/methods/disable/disable_rule.ts | 3 +- .../rule/methods/mute_all/mute_all.ts | 3 +- .../rule/methods/unmute_all/unmute_all.ts | 3 +- .../rule/methods/update/update_rule.ts | 9 +- .../application/rule/schemas/rule_schemas.ts | 14 +- ...form_raw_actions_to_domain_actions.test.ts | 6 +- ...transform_raw_actions_to_domain_actions.ts | 13 +- ...orm_rule_attributes_to_rule_domain.test.ts | 8 +- ...ransform_rule_attributes_to_rule_domain.ts | 10 +- ...ransform_rule_domain_to_rule_attributes.ts | 12 +- .../data/r_rule/types/r_rule_attributes.ts | 18 +- .../data/rule/methods/bulk_create_rule_so.ts | 8 +- .../rule/methods/bulk_disable_rules_so.ts | 8 +- .../data/rule/methods/create_rule_so.ts | 6 +- .../server/data/rule/methods/find_rules_so.ts | 6 +- .../rule/methods/get_decrypted_rule_so.ts | 6 +- .../server/data/rule/methods/get_rule_so.ts | 6 +- .../data/rule/methods/resolve_rule_so.ts | 4 +- .../data/rule/methods/update_rule_so.ts | 10 +- .../alerting/server/data/rule/types/index.ts | 24 -- .../server/data/rule/types/rule_attributes.ts | 189 ---------- .../archive_maintenance_window_route.test.ts | 1 - .../find_maintenance_windows_route.test.ts | 1 - .../finish_maintenance_window_route.test.ts | 1 - .../get/get_maintenance_window_route.test.ts | 1 - ...t_active_maintenance_windows_route.test.ts | 1 - .../update_maintenance_window_route.test.ts | 1 - .../transform_rule_to_rule_response/v1.ts | 2 +- .../rules_client/common/inject_references.ts | 3 +- .../common/retry_if_bulk_edit_conflicts.ts | 10 +- .../retry_if_bulk_operation_conflicts.ts | 6 +- .../rules_client/common/snooze_utils.ts | 17 +- .../lib/create_rule_saved_object.ts | 16 +- .../rules_client/lib/get_rule_saved_object.ts | 4 +- .../lib/increment_revision.test.ts | 5 +- .../rules_client/lib/increment_revision.ts | 5 +- .../lib/resolve_rule_saved_object.ts | 4 +- .../rules_client/lib/untrack_rule_alerts.ts | 5 +- .../server/rules_client/lib/update_meta.ts | 9 +- .../lib/update_meta_attributes.ts | 4 +- .../model_versions/rule_model_versions.ts | 9 +- .../partially_update_rule.test.ts | 4 +- .../saved_objects/partially_update_rule.ts | 8 +- .../saved_objects/schemas/raw_rule/index.ts | 3 + .../saved_objects/schemas/raw_rule/latest.ts | 25 ++ .../saved_objects/schemas/raw_rule/v2.ts | 1 + .../saved_objects/schemas/raw_rule/v3.ts | 299 +++++++++++++++ x-pack/plugins/alerting/server/types.ts | 105 +----- 73 files changed, 900 insertions(+), 1745 deletions(-) create mode 100644 oas_docs/output/kibana.serverless.staging.yaml create mode 100644 oas_docs/output/kibana.staging.yaml delete mode 100644 x-pack/plugins/alerting/server/data/rule/types/index.ts delete mode 100644 x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts create mode 100644 x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/latest.ts create mode 100644 x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/v3.ts diff --git a/oas_docs/bundle.json b/oas_docs/bundle.json index d2550d7cca7f2..cd314d4c991bf 100644 --- a/oas_docs/bundle.json +++ b/oas_docs/bundle.json @@ -2002,80 +2002,13 @@ "type": "number" }, "outcome": { - "additionalProperties": false, - "properties": { - "alerts_count": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Number of active alerts during last run.", - "nullable": true, - "type": "number" - }, - "ignored": { - "description": "Number of ignored alerts during last run.", - "nullable": true, - "type": "number" - }, - "new": { - "description": "Number of new alerts during last run.", - "nullable": true, - "type": "number" - }, - "recovered": { - "description": "Number of recovered alerts during last run.", - "nullable": true, - "type": "number" - } - }, - "type": "object" - }, - "outcome": { - "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", - "enum": [ - "succeeded", - "warning", - "failed" - ], - "type": "string" - }, - "outcome_msg": { - "items": { - "description": "Outcome message generated during last rule run.", - "type": "string" - }, - "nullable": true, - "type": "array" - }, - "outcome_order": { - "description": "Order of the outcome.", - "type": "number" - }, - "warning": { - "description": "Warning of last rule execution.", - "enum": [ - "read", - "decrypt", - "execute", - "unknown", - "license", - "timeout", - "disabled", - "validate", - "maxExecutableActions", - "maxAlerts", - "maxQueuedActions", - "ruleExecution" - ], - "nullable": true, - "type": "string" - } - }, - "required": [ - "outcome", - "alerts_count" + "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", + "enum": [ + "succeeded", + "warning", + "failed" ], - "type": "object" + "type": "string" }, "success": { "description": "Indicates whether the rule run was successful.", @@ -2242,6 +2175,7 @@ "description": "Indicates hours of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byminute": { @@ -2249,6 +2183,7 @@ "description": "Indicates minutes of the hour to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonth": { @@ -2256,6 +2191,7 @@ "description": "Indicates months of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonthday": { @@ -2263,6 +2199,7 @@ "description": "Indicates the days of the month to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysecond": { @@ -2270,6 +2207,7 @@ "description": "Indicates seconds of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysetpos": { @@ -2277,6 +2215,7 @@ "description": "A positive or negative integer affecting the nth day of the month. For example, -2 combined with `byweekday` of FR is 2nd to last Friday of the month. It is recommended to not set this manually and just use `byweekday`.", "type": "number" }, + "nullable": true, "type": "array" }, "byweekday": { @@ -2291,6 +2230,7 @@ ], "description": "Indicates the days of the week to recur or else nth-day-of-month strings. For example, \"+2TU\" second Tuesday of month, \"-1FR\" last Friday of the month, which are internally converted to a `byweekday/bysetpos` combination." }, + "nullable": true, "type": "array" }, "byweekno": { @@ -2298,6 +2238,7 @@ "description": "Indicates number of the week hours to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byyearday": { @@ -2305,6 +2246,7 @@ "description": "Indicates the days of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "count": { @@ -3240,80 +3182,13 @@ "type": "number" }, "outcome": { - "additionalProperties": false, - "properties": { - "alerts_count": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Number of active alerts during last run.", - "nullable": true, - "type": "number" - }, - "ignored": { - "description": "Number of ignored alerts during last run.", - "nullable": true, - "type": "number" - }, - "new": { - "description": "Number of new alerts during last run.", - "nullable": true, - "type": "number" - }, - "recovered": { - "description": "Number of recovered alerts during last run.", - "nullable": true, - "type": "number" - } - }, - "type": "object" - }, - "outcome": { - "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", - "enum": [ - "succeeded", - "warning", - "failed" - ], - "type": "string" - }, - "outcome_msg": { - "items": { - "description": "Outcome message generated during last rule run.", - "type": "string" - }, - "nullable": true, - "type": "array" - }, - "outcome_order": { - "description": "Order of the outcome.", - "type": "number" - }, - "warning": { - "description": "Warning of last rule execution.", - "enum": [ - "read", - "decrypt", - "execute", - "unknown", - "license", - "timeout", - "disabled", - "validate", - "maxExecutableActions", - "maxAlerts", - "maxQueuedActions", - "ruleExecution" - ], - "nullable": true, - "type": "string" - } - }, - "required": [ - "outcome", - "alerts_count" + "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", + "enum": [ + "succeeded", + "warning", + "failed" ], - "type": "object" + "type": "string" }, "success": { "description": "Indicates whether the rule run was successful.", @@ -3480,6 +3355,7 @@ "description": "Indicates hours of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byminute": { @@ -3487,6 +3363,7 @@ "description": "Indicates minutes of the hour to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonth": { @@ -3494,6 +3371,7 @@ "description": "Indicates months of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonthday": { @@ -3501,6 +3379,7 @@ "description": "Indicates the days of the month to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysecond": { @@ -3508,6 +3387,7 @@ "description": "Indicates seconds of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysetpos": { @@ -3515,6 +3395,7 @@ "description": "A positive or negative integer affecting the nth day of the month. For example, -2 combined with `byweekday` of FR is 2nd to last Friday of the month. It is recommended to not set this manually and just use `byweekday`.", "type": "number" }, + "nullable": true, "type": "array" }, "byweekday": { @@ -3529,6 +3410,7 @@ ], "description": "Indicates the days of the week to recur or else nth-day-of-month strings. For example, \"+2TU\" second Tuesday of month, \"-1FR\" last Friday of the month, which are internally converted to a `byweekday/bysetpos` combination." }, + "nullable": true, "type": "array" }, "byweekno": { @@ -3536,6 +3418,7 @@ "description": "Indicates number of the week hours to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byyearday": { @@ -3543,6 +3426,7 @@ "description": "Indicates the days of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "count": { @@ -4461,80 +4345,13 @@ "type": "number" }, "outcome": { - "additionalProperties": false, - "properties": { - "alerts_count": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Number of active alerts during last run.", - "nullable": true, - "type": "number" - }, - "ignored": { - "description": "Number of ignored alerts during last run.", - "nullable": true, - "type": "number" - }, - "new": { - "description": "Number of new alerts during last run.", - "nullable": true, - "type": "number" - }, - "recovered": { - "description": "Number of recovered alerts during last run.", - "nullable": true, - "type": "number" - } - }, - "type": "object" - }, - "outcome": { - "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", - "enum": [ - "succeeded", - "warning", - "failed" - ], - "type": "string" - }, - "outcome_msg": { - "items": { - "description": "Outcome message generated during last rule run.", - "type": "string" - }, - "nullable": true, - "type": "array" - }, - "outcome_order": { - "description": "Order of the outcome.", - "type": "number" - }, - "warning": { - "description": "Warning of last rule execution.", - "enum": [ - "read", - "decrypt", - "execute", - "unknown", - "license", - "timeout", - "disabled", - "validate", - "maxExecutableActions", - "maxAlerts", - "maxQueuedActions", - "ruleExecution" - ], - "nullable": true, - "type": "string" - } - }, - "required": [ - "outcome", - "alerts_count" + "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", + "enum": [ + "succeeded", + "warning", + "failed" ], - "type": "object" + "type": "string" }, "success": { "description": "Indicates whether the rule run was successful.", @@ -4701,6 +4518,7 @@ "description": "Indicates hours of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byminute": { @@ -4708,6 +4526,7 @@ "description": "Indicates minutes of the hour to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonth": { @@ -4715,6 +4534,7 @@ "description": "Indicates months of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonthday": { @@ -4722,6 +4542,7 @@ "description": "Indicates the days of the month to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysecond": { @@ -4729,6 +4550,7 @@ "description": "Indicates seconds of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysetpos": { @@ -4736,6 +4558,7 @@ "description": "A positive or negative integer affecting the nth day of the month. For example, -2 combined with `byweekday` of FR is 2nd to last Friday of the month. It is recommended to not set this manually and just use `byweekday`.", "type": "number" }, + "nullable": true, "type": "array" }, "byweekday": { @@ -4750,6 +4573,7 @@ ], "description": "Indicates the days of the week to recur or else nth-day-of-month strings. For example, \"+2TU\" second Tuesday of month, \"-1FR\" last Friday of the month, which are internally converted to a `byweekday/bysetpos` combination." }, + "nullable": true, "type": "array" }, "byweekno": { @@ -4757,6 +4581,7 @@ "description": "Indicates number of the week hours to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byyearday": { @@ -4764,6 +4589,7 @@ "description": "Indicates the days of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "count": { @@ -5966,80 +5792,13 @@ "type": "number" }, "outcome": { - "additionalProperties": false, - "properties": { - "alerts_count": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Number of active alerts during last run.", - "nullable": true, - "type": "number" - }, - "ignored": { - "description": "Number of ignored alerts during last run.", - "nullable": true, - "type": "number" - }, - "new": { - "description": "Number of new alerts during last run.", - "nullable": true, - "type": "number" - }, - "recovered": { - "description": "Number of recovered alerts during last run.", - "nullable": true, - "type": "number" - } - }, - "type": "object" - }, - "outcome": { - "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", - "enum": [ - "succeeded", - "warning", - "failed" - ], - "type": "string" - }, - "outcome_msg": { - "items": { - "description": "Outcome message generated during last rule run.", - "type": "string" - }, - "nullable": true, - "type": "array" - }, - "outcome_order": { - "description": "Order of the outcome.", - "type": "number" - }, - "warning": { - "description": "Warning of last rule execution.", - "enum": [ - "read", - "decrypt", - "execute", - "unknown", - "license", - "timeout", - "disabled", - "validate", - "maxExecutableActions", - "maxAlerts", - "maxQueuedActions", - "ruleExecution" - ], - "nullable": true, - "type": "string" - } - }, - "required": [ - "outcome", - "alerts_count" + "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", + "enum": [ + "succeeded", + "warning", + "failed" ], - "type": "object" + "type": "string" }, "success": { "description": "Indicates whether the rule run was successful.", @@ -6206,6 +5965,7 @@ "description": "Indicates hours of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byminute": { @@ -6213,6 +5973,7 @@ "description": "Indicates minutes of the hour to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonth": { @@ -6220,6 +5981,7 @@ "description": "Indicates months of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonthday": { @@ -6227,6 +5989,7 @@ "description": "Indicates the days of the month to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysecond": { @@ -6234,6 +5997,7 @@ "description": "Indicates seconds of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysetpos": { @@ -6241,6 +6005,7 @@ "description": "A positive or negative integer affecting the nth day of the month. For example, -2 combined with `byweekday` of FR is 2nd to last Friday of the month. It is recommended to not set this manually and just use `byweekday`.", "type": "number" }, + "nullable": true, "type": "array" }, "byweekday": { @@ -6255,6 +6020,7 @@ ], "description": "Indicates the days of the week to recur or else nth-day-of-month strings. For example, \"+2TU\" second Tuesday of month, \"-1FR\" last Friday of the month, which are internally converted to a `byweekday/bysetpos` combination." }, + "nullable": true, "type": "array" }, "byweekno": { @@ -6262,6 +6028,7 @@ "description": "Indicates number of the week hours to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byyearday": { @@ -6269,6 +6036,7 @@ "description": "Indicates the days of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "count": { diff --git a/oas_docs/bundle.serverless.json b/oas_docs/bundle.serverless.json index d415d769c175b..3e1116bc1bcc9 100644 --- a/oas_docs/bundle.serverless.json +++ b/oas_docs/bundle.serverless.json @@ -2002,80 +2002,13 @@ "type": "number" }, "outcome": { - "additionalProperties": false, - "properties": { - "alerts_count": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Number of active alerts during last run.", - "nullable": true, - "type": "number" - }, - "ignored": { - "description": "Number of ignored alerts during last run.", - "nullable": true, - "type": "number" - }, - "new": { - "description": "Number of new alerts during last run.", - "nullable": true, - "type": "number" - }, - "recovered": { - "description": "Number of recovered alerts during last run.", - "nullable": true, - "type": "number" - } - }, - "type": "object" - }, - "outcome": { - "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", - "enum": [ - "succeeded", - "warning", - "failed" - ], - "type": "string" - }, - "outcome_msg": { - "items": { - "description": "Outcome message generated during last rule run.", - "type": "string" - }, - "nullable": true, - "type": "array" - }, - "outcome_order": { - "description": "Order of the outcome.", - "type": "number" - }, - "warning": { - "description": "Warning of last rule execution.", - "enum": [ - "read", - "decrypt", - "execute", - "unknown", - "license", - "timeout", - "disabled", - "validate", - "maxExecutableActions", - "maxAlerts", - "maxQueuedActions", - "ruleExecution" - ], - "nullable": true, - "type": "string" - } - }, - "required": [ - "outcome", - "alerts_count" + "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", + "enum": [ + "succeeded", + "warning", + "failed" ], - "type": "object" + "type": "string" }, "success": { "description": "Indicates whether the rule run was successful.", @@ -2242,6 +2175,7 @@ "description": "Indicates hours of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byminute": { @@ -2249,6 +2183,7 @@ "description": "Indicates minutes of the hour to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonth": { @@ -2256,6 +2191,7 @@ "description": "Indicates months of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonthday": { @@ -2263,6 +2199,7 @@ "description": "Indicates the days of the month to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysecond": { @@ -2270,6 +2207,7 @@ "description": "Indicates seconds of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysetpos": { @@ -2277,6 +2215,7 @@ "description": "A positive or negative integer affecting the nth day of the month. For example, -2 combined with `byweekday` of FR is 2nd to last Friday of the month. It is recommended to not set this manually and just use `byweekday`.", "type": "number" }, + "nullable": true, "type": "array" }, "byweekday": { @@ -2291,6 +2230,7 @@ ], "description": "Indicates the days of the week to recur or else nth-day-of-month strings. For example, \"+2TU\" second Tuesday of month, \"-1FR\" last Friday of the month, which are internally converted to a `byweekday/bysetpos` combination." }, + "nullable": true, "type": "array" }, "byweekno": { @@ -2298,6 +2238,7 @@ "description": "Indicates number of the week hours to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byyearday": { @@ -2305,6 +2246,7 @@ "description": "Indicates the days of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "count": { @@ -3240,80 +3182,13 @@ "type": "number" }, "outcome": { - "additionalProperties": false, - "properties": { - "alerts_count": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Number of active alerts during last run.", - "nullable": true, - "type": "number" - }, - "ignored": { - "description": "Number of ignored alerts during last run.", - "nullable": true, - "type": "number" - }, - "new": { - "description": "Number of new alerts during last run.", - "nullable": true, - "type": "number" - }, - "recovered": { - "description": "Number of recovered alerts during last run.", - "nullable": true, - "type": "number" - } - }, - "type": "object" - }, - "outcome": { - "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", - "enum": [ - "succeeded", - "warning", - "failed" - ], - "type": "string" - }, - "outcome_msg": { - "items": { - "description": "Outcome message generated during last rule run.", - "type": "string" - }, - "nullable": true, - "type": "array" - }, - "outcome_order": { - "description": "Order of the outcome.", - "type": "number" - }, - "warning": { - "description": "Warning of last rule execution.", - "enum": [ - "read", - "decrypt", - "execute", - "unknown", - "license", - "timeout", - "disabled", - "validate", - "maxExecutableActions", - "maxAlerts", - "maxQueuedActions", - "ruleExecution" - ], - "nullable": true, - "type": "string" - } - }, - "required": [ - "outcome", - "alerts_count" + "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", + "enum": [ + "succeeded", + "warning", + "failed" ], - "type": "object" + "type": "string" }, "success": { "description": "Indicates whether the rule run was successful.", @@ -3480,6 +3355,7 @@ "description": "Indicates hours of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byminute": { @@ -3487,6 +3363,7 @@ "description": "Indicates minutes of the hour to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonth": { @@ -3494,6 +3371,7 @@ "description": "Indicates months of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonthday": { @@ -3501,6 +3379,7 @@ "description": "Indicates the days of the month to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysecond": { @@ -3508,6 +3387,7 @@ "description": "Indicates seconds of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysetpos": { @@ -3515,6 +3395,7 @@ "description": "A positive or negative integer affecting the nth day of the month. For example, -2 combined with `byweekday` of FR is 2nd to last Friday of the month. It is recommended to not set this manually and just use `byweekday`.", "type": "number" }, + "nullable": true, "type": "array" }, "byweekday": { @@ -3529,6 +3410,7 @@ ], "description": "Indicates the days of the week to recur or else nth-day-of-month strings. For example, \"+2TU\" second Tuesday of month, \"-1FR\" last Friday of the month, which are internally converted to a `byweekday/bysetpos` combination." }, + "nullable": true, "type": "array" }, "byweekno": { @@ -3536,6 +3418,7 @@ "description": "Indicates number of the week hours to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byyearday": { @@ -3543,6 +3426,7 @@ "description": "Indicates the days of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "count": { @@ -4461,80 +4345,13 @@ "type": "number" }, "outcome": { - "additionalProperties": false, - "properties": { - "alerts_count": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Number of active alerts during last run.", - "nullable": true, - "type": "number" - }, - "ignored": { - "description": "Number of ignored alerts during last run.", - "nullable": true, - "type": "number" - }, - "new": { - "description": "Number of new alerts during last run.", - "nullable": true, - "type": "number" - }, - "recovered": { - "description": "Number of recovered alerts during last run.", - "nullable": true, - "type": "number" - } - }, - "type": "object" - }, - "outcome": { - "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", - "enum": [ - "succeeded", - "warning", - "failed" - ], - "type": "string" - }, - "outcome_msg": { - "items": { - "description": "Outcome message generated during last rule run.", - "type": "string" - }, - "nullable": true, - "type": "array" - }, - "outcome_order": { - "description": "Order of the outcome.", - "type": "number" - }, - "warning": { - "description": "Warning of last rule execution.", - "enum": [ - "read", - "decrypt", - "execute", - "unknown", - "license", - "timeout", - "disabled", - "validate", - "maxExecutableActions", - "maxAlerts", - "maxQueuedActions", - "ruleExecution" - ], - "nullable": true, - "type": "string" - } - }, - "required": [ - "outcome", - "alerts_count" + "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", + "enum": [ + "succeeded", + "warning", + "failed" ], - "type": "object" + "type": "string" }, "success": { "description": "Indicates whether the rule run was successful.", @@ -4701,6 +4518,7 @@ "description": "Indicates hours of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byminute": { @@ -4708,6 +4526,7 @@ "description": "Indicates minutes of the hour to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonth": { @@ -4715,6 +4534,7 @@ "description": "Indicates months of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonthday": { @@ -4722,6 +4542,7 @@ "description": "Indicates the days of the month to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysecond": { @@ -4729,6 +4550,7 @@ "description": "Indicates seconds of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysetpos": { @@ -4736,6 +4558,7 @@ "description": "A positive or negative integer affecting the nth day of the month. For example, -2 combined with `byweekday` of FR is 2nd to last Friday of the month. It is recommended to not set this manually and just use `byweekday`.", "type": "number" }, + "nullable": true, "type": "array" }, "byweekday": { @@ -4750,6 +4573,7 @@ ], "description": "Indicates the days of the week to recur or else nth-day-of-month strings. For example, \"+2TU\" second Tuesday of month, \"-1FR\" last Friday of the month, which are internally converted to a `byweekday/bysetpos` combination." }, + "nullable": true, "type": "array" }, "byweekno": { @@ -4757,6 +4581,7 @@ "description": "Indicates number of the week hours to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byyearday": { @@ -4764,6 +4589,7 @@ "description": "Indicates the days of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "count": { @@ -5966,80 +5792,13 @@ "type": "number" }, "outcome": { - "additionalProperties": false, - "properties": { - "alerts_count": { - "additionalProperties": false, - "properties": { - "active": { - "description": "Number of active alerts during last run.", - "nullable": true, - "type": "number" - }, - "ignored": { - "description": "Number of ignored alerts during last run.", - "nullable": true, - "type": "number" - }, - "new": { - "description": "Number of new alerts during last run.", - "nullable": true, - "type": "number" - }, - "recovered": { - "description": "Number of recovered alerts during last run.", - "nullable": true, - "type": "number" - } - }, - "type": "object" - }, - "outcome": { - "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", - "enum": [ - "succeeded", - "warning", - "failed" - ], - "type": "string" - }, - "outcome_msg": { - "items": { - "description": "Outcome message generated during last rule run.", - "type": "string" - }, - "nullable": true, - "type": "array" - }, - "outcome_order": { - "description": "Order of the outcome.", - "type": "number" - }, - "warning": { - "description": "Warning of last rule execution.", - "enum": [ - "read", - "decrypt", - "execute", - "unknown", - "license", - "timeout", - "disabled", - "validate", - "maxExecutableActions", - "maxAlerts", - "maxQueuedActions", - "ruleExecution" - ], - "nullable": true, - "type": "string" - } - }, - "required": [ - "outcome", - "alerts_count" + "description": "Outcome of last run of the rule. Value could be succeeded, warning or failed.", + "enum": [ + "succeeded", + "warning", + "failed" ], - "type": "object" + "type": "string" }, "success": { "description": "Indicates whether the rule run was successful.", @@ -6206,6 +5965,7 @@ "description": "Indicates hours of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byminute": { @@ -6213,6 +5973,7 @@ "description": "Indicates minutes of the hour to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonth": { @@ -6220,6 +5981,7 @@ "description": "Indicates months of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bymonthday": { @@ -6227,6 +5989,7 @@ "description": "Indicates the days of the month to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysecond": { @@ -6234,6 +5997,7 @@ "description": "Indicates seconds of the day to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "bysetpos": { @@ -6241,6 +6005,7 @@ "description": "A positive or negative integer affecting the nth day of the month. For example, -2 combined with `byweekday` of FR is 2nd to last Friday of the month. It is recommended to not set this manually and just use `byweekday`.", "type": "number" }, + "nullable": true, "type": "array" }, "byweekday": { @@ -6255,6 +6020,7 @@ ], "description": "Indicates the days of the week to recur or else nth-day-of-month strings. For example, \"+2TU\" second Tuesday of month, \"-1FR\" last Friday of the month, which are internally converted to a `byweekday/bysetpos` combination." }, + "nullable": true, "type": "array" }, "byweekno": { @@ -6262,6 +6028,7 @@ "description": "Indicates number of the week hours to recur.", "type": "number" }, + "nullable": true, "type": "array" }, "byyearday": { @@ -6269,6 +6036,7 @@ "description": "Indicates the days of the year that this rule should recur.", "type": "number" }, + "nullable": true, "type": "array" }, "count": { diff --git a/oas_docs/output/kibana.serverless.staging.yaml b/oas_docs/output/kibana.serverless.staging.yaml new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/oas_docs/output/kibana.serverless.yaml b/oas_docs/output/kibana.serverless.yaml index f8eab00f618c5..583f4dbc4482c 100644 --- a/oas_docs/output/kibana.serverless.yaml +++ b/oas_docs/output/kibana.serverless.yaml @@ -1395,73 +1395,14 @@ paths: description: Duration of the rule run. type: number outcome: - additionalProperties: false - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: >- - Number of ignored alerts during last - run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: >- - Number of recovered alerts during last - run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value - could be succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: >- - Outcome message generated during last - rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count + description: >- + Outcome of last run of the rule. Value could + be succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string success: description: >- Indicates whether the rule run was @@ -1609,11 +1550,13 @@ paths: items: description: Indicates hours of the day to recur. type: number + nullable: true type: array byminute: items: description: Indicates minutes of the hour to recur. type: number + nullable: true type: array bymonth: items: @@ -1621,16 +1564,19 @@ paths: Indicates months of the year that this rule should recur. type: number + nullable: true type: array bymonthday: items: description: Indicates the days of the month to recur. type: number + nullable: true type: array bysecond: items: description: Indicates seconds of the day to recur. type: number + nullable: true type: array bysetpos: items: @@ -1641,6 +1587,7 @@ paths: of the month. It is recommended to not set this manually and just use `byweekday`. type: number + nullable: true type: array byweekday: items: @@ -1654,11 +1601,13 @@ paths: Friday of the month, which are internally converted to a `byweekday/bysetpos` combination. + nullable: true type: array byweekno: items: description: Indicates number of the week hours to recur. type: number + nullable: true type: array byyearday: items: @@ -1666,6 +1615,7 @@ paths: Indicates the days of the year that this rule should recur. type: number + nullable: true type: array count: description: >- @@ -2568,73 +2518,14 @@ paths: description: Duration of the rule run. type: number outcome: - additionalProperties: false - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: >- - Number of ignored alerts during last - run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: >- - Number of recovered alerts during last - run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value - could be succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: >- - Outcome message generated during last - rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count + description: >- + Outcome of last run of the rule. Value could + be succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string success: description: >- Indicates whether the rule run was @@ -2782,11 +2673,13 @@ paths: items: description: Indicates hours of the day to recur. type: number + nullable: true type: array byminute: items: description: Indicates minutes of the hour to recur. type: number + nullable: true type: array bymonth: items: @@ -2794,16 +2687,19 @@ paths: Indicates months of the year that this rule should recur. type: number + nullable: true type: array bymonthday: items: description: Indicates the days of the month to recur. type: number + nullable: true type: array bysecond: items: description: Indicates seconds of the day to recur. type: number + nullable: true type: array bysetpos: items: @@ -2814,6 +2710,7 @@ paths: of the month. It is recommended to not set this manually and just use `byweekday`. type: number + nullable: true type: array byweekday: items: @@ -2827,11 +2724,13 @@ paths: Friday of the month, which are internally converted to a `byweekday/bysetpos` combination. + nullable: true type: array byweekno: items: description: Indicates number of the week hours to recur. type: number + nullable: true type: array byyearday: items: @@ -2839,6 +2738,7 @@ paths: Indicates the days of the year that this rule should recur. type: number + nullable: true type: array count: description: >- @@ -3712,73 +3612,14 @@ paths: description: Duration of the rule run. type: number outcome: - additionalProperties: false - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: >- - Number of ignored alerts during last - run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: >- - Number of recovered alerts during last - run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value - could be succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: >- - Outcome message generated during last - rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count + description: >- + Outcome of last run of the rule. Value could + be succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string success: description: >- Indicates whether the rule run was @@ -3926,11 +3767,13 @@ paths: items: description: Indicates hours of the day to recur. type: number + nullable: true type: array byminute: items: description: Indicates minutes of the hour to recur. type: number + nullable: true type: array bymonth: items: @@ -3938,16 +3781,19 @@ paths: Indicates months of the year that this rule should recur. type: number + nullable: true type: array bymonthday: items: description: Indicates the days of the month to recur. type: number + nullable: true type: array bysecond: items: description: Indicates seconds of the day to recur. type: number + nullable: true type: array bysetpos: items: @@ -3958,6 +3804,7 @@ paths: of the month. It is recommended to not set this manually and just use `byweekday`. type: number + nullable: true type: array byweekday: items: @@ -3971,11 +3818,13 @@ paths: Friday of the month, which are internally converted to a `byweekday/bysetpos` combination. + nullable: true type: array byweekno: items: description: Indicates number of the week hours to recur. type: number + nullable: true type: array byyearday: items: @@ -3983,6 +3832,7 @@ paths: Indicates the days of the year that this rule should recur. type: number + nullable: true type: array count: description: >- @@ -4950,73 +4800,14 @@ paths: description: Duration of the rule run. type: number outcome: - additionalProperties: false - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: >- - Number of ignored alerts during last - run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: >- - Number of recovered alerts during last - run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value - could be succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: >- - Outcome message generated during last - rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count + description: >- + Outcome of last run of the rule. Value could + be succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string success: description: >- Indicates whether the rule run was @@ -5164,11 +4955,13 @@ paths: items: description: Indicates hours of the day to recur. type: number + nullable: true type: array byminute: items: description: Indicates minutes of the hour to recur. type: number + nullable: true type: array bymonth: items: @@ -5176,16 +4969,19 @@ paths: Indicates months of the year that this rule should recur. type: number + nullable: true type: array bymonthday: items: description: Indicates the days of the month to recur. type: number + nullable: true type: array bysecond: items: description: Indicates seconds of the day to recur. type: number + nullable: true type: array bysetpos: items: @@ -5196,6 +4992,7 @@ paths: of the month. It is recommended to not set this manually and just use `byweekday`. type: number + nullable: true type: array byweekday: items: @@ -5209,11 +5006,13 @@ paths: Friday of the month, which are internally converted to a `byweekday/bysetpos` combination. + nullable: true type: array byweekno: items: description: Indicates number of the week hours to recur. type: number + nullable: true type: array byyearday: items: @@ -5221,6 +5020,7 @@ paths: Indicates the days of the year that this rule should recur. type: number + nullable: true type: array count: description: >- diff --git a/oas_docs/output/kibana.staging.yaml b/oas_docs/output/kibana.staging.yaml new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/oas_docs/output/kibana.yaml b/oas_docs/output/kibana.yaml index 0df87c781112a..930d70cbd27b0 100644 --- a/oas_docs/output/kibana.yaml +++ b/oas_docs/output/kibana.yaml @@ -1780,73 +1780,14 @@ paths: description: Duration of the rule run. type: number outcome: - additionalProperties: false - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: >- - Number of ignored alerts during last - run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: >- - Number of recovered alerts during last - run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value - could be succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: >- - Outcome message generated during last - rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count + description: >- + Outcome of last run of the rule. Value could + be succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string success: description: >- Indicates whether the rule run was @@ -1994,11 +1935,13 @@ paths: items: description: Indicates hours of the day to recur. type: number + nullable: true type: array byminute: items: description: Indicates minutes of the hour to recur. type: number + nullable: true type: array bymonth: items: @@ -2006,16 +1949,19 @@ paths: Indicates months of the year that this rule should recur. type: number + nullable: true type: array bymonthday: items: description: Indicates the days of the month to recur. type: number + nullable: true type: array bysecond: items: description: Indicates seconds of the day to recur. type: number + nullable: true type: array bysetpos: items: @@ -2026,6 +1972,7 @@ paths: of the month. It is recommended to not set this manually and just use `byweekday`. type: number + nullable: true type: array byweekday: items: @@ -2039,11 +1986,13 @@ paths: Friday of the month, which are internally converted to a `byweekday/bysetpos` combination. + nullable: true type: array byweekno: items: description: Indicates number of the week hours to recur. type: number + nullable: true type: array byyearday: items: @@ -2051,6 +2000,7 @@ paths: Indicates the days of the year that this rule should recur. type: number + nullable: true type: array count: description: >- @@ -2953,73 +2903,14 @@ paths: description: Duration of the rule run. type: number outcome: - additionalProperties: false - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: >- - Number of ignored alerts during last - run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: >- - Number of recovered alerts during last - run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value - could be succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: >- - Outcome message generated during last - rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count + description: >- + Outcome of last run of the rule. Value could + be succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string success: description: >- Indicates whether the rule run was @@ -3167,11 +3058,13 @@ paths: items: description: Indicates hours of the day to recur. type: number + nullable: true type: array byminute: items: description: Indicates minutes of the hour to recur. type: number + nullable: true type: array bymonth: items: @@ -3179,16 +3072,19 @@ paths: Indicates months of the year that this rule should recur. type: number + nullable: true type: array bymonthday: items: description: Indicates the days of the month to recur. type: number + nullable: true type: array bysecond: items: description: Indicates seconds of the day to recur. type: number + nullable: true type: array bysetpos: items: @@ -3199,6 +3095,7 @@ paths: of the month. It is recommended to not set this manually and just use `byweekday`. type: number + nullable: true type: array byweekday: items: @@ -3212,11 +3109,13 @@ paths: Friday of the month, which are internally converted to a `byweekday/bysetpos` combination. + nullable: true type: array byweekno: items: description: Indicates number of the week hours to recur. type: number + nullable: true type: array byyearday: items: @@ -3224,6 +3123,7 @@ paths: Indicates the days of the year that this rule should recur. type: number + nullable: true type: array count: description: >- @@ -4097,73 +3997,14 @@ paths: description: Duration of the rule run. type: number outcome: - additionalProperties: false - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: >- - Number of ignored alerts during last - run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: >- - Number of recovered alerts during last - run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value - could be succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: >- - Outcome message generated during last - rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count + description: >- + Outcome of last run of the rule. Value could + be succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string success: description: >- Indicates whether the rule run was @@ -4311,11 +4152,13 @@ paths: items: description: Indicates hours of the day to recur. type: number + nullable: true type: array byminute: items: description: Indicates minutes of the hour to recur. type: number + nullable: true type: array bymonth: items: @@ -4323,16 +4166,19 @@ paths: Indicates months of the year that this rule should recur. type: number + nullable: true type: array bymonthday: items: description: Indicates the days of the month to recur. type: number + nullable: true type: array bysecond: items: description: Indicates seconds of the day to recur. type: number + nullable: true type: array bysetpos: items: @@ -4343,6 +4189,7 @@ paths: of the month. It is recommended to not set this manually and just use `byweekday`. type: number + nullable: true type: array byweekday: items: @@ -4356,11 +4203,13 @@ paths: Friday of the month, which are internally converted to a `byweekday/bysetpos` combination. + nullable: true type: array byweekno: items: description: Indicates number of the week hours to recur. type: number + nullable: true type: array byyearday: items: @@ -4368,6 +4217,7 @@ paths: Indicates the days of the year that this rule should recur. type: number + nullable: true type: array count: description: >- @@ -5335,73 +5185,14 @@ paths: description: Duration of the rule run. type: number outcome: - additionalProperties: false - type: object - properties: - alerts_count: - additionalProperties: false - type: object - properties: - active: - description: Number of active alerts during last run. - nullable: true - type: number - ignored: - description: >- - Number of ignored alerts during last - run. - nullable: true - type: number - new: - description: Number of new alerts during last run. - nullable: true - type: number - recovered: - description: >- - Number of recovered alerts during last - run. - nullable: true - type: number - outcome: - description: >- - Outcome of last run of the rule. Value - could be succeeded, warning or failed. - enum: - - succeeded - - warning - - failed - type: string - outcome_msg: - items: - description: >- - Outcome message generated during last - rule run. - type: string - nullable: true - type: array - outcome_order: - description: Order of the outcome. - type: number - warning: - description: Warning of last rule execution. - enum: - - read - - decrypt - - execute - - unknown - - license - - timeout - - disabled - - validate - - maxExecutableActions - - maxAlerts - - maxQueuedActions - - ruleExecution - nullable: true - type: string - required: - - outcome - - alerts_count + description: >- + Outcome of last run of the rule. Value could + be succeeded, warning or failed. + enum: + - succeeded + - warning + - failed + type: string success: description: >- Indicates whether the rule run was @@ -5549,11 +5340,13 @@ paths: items: description: Indicates hours of the day to recur. type: number + nullable: true type: array byminute: items: description: Indicates minutes of the hour to recur. type: number + nullable: true type: array bymonth: items: @@ -5561,16 +5354,19 @@ paths: Indicates months of the year that this rule should recur. type: number + nullable: true type: array bymonthday: items: description: Indicates the days of the month to recur. type: number + nullable: true type: array bysecond: items: description: Indicates seconds of the day to recur. type: number + nullable: true type: array bysetpos: items: @@ -5581,6 +5377,7 @@ paths: of the month. It is recommended to not set this manually and just use `byweekday`. type: number + nullable: true type: array byweekday: items: @@ -5594,11 +5391,13 @@ paths: Friday of the month, which are internally converted to a `byweekday/bysetpos` combination. + nullable: true type: array byweekno: items: description: Indicates number of the week hours to recur. type: number + nullable: true type: array byyearday: items: @@ -5606,6 +5405,7 @@ paths: Indicates the days of the year that this rule should recur. type: number + nullable: true type: array count: description: >- diff --git a/packages/kbn-alerting-types/r_rule_types.ts b/packages/kbn-alerting-types/r_rule_types.ts index 25d1b9a5a30a7..a51b5939fe514 100644 --- a/packages/kbn-alerting-types/r_rule_types.ts +++ b/packages/kbn-alerting-types/r_rule_types.ts @@ -14,7 +14,7 @@ export type RRuleParams = Partial & Pick & { dtstart: string; - byweekday?: Array; + byweekday?: Array | null; wkst?: WeekdayStr; until?: string; }; diff --git a/packages/kbn-rrule/rrule.ts b/packages/kbn-rrule/rrule.ts index 9b5eea7d4979f..43e89ee209cb7 100644 --- a/packages/kbn-rrule/rrule.ts +++ b/packages/kbn-rrule/rrule.ts @@ -16,6 +16,7 @@ export enum Frequency { DAILY = 3, HOURLY = 4, MINUTELY = 5, + SECONDLY = 6, } export enum Weekday { @@ -270,6 +271,13 @@ export const getNextRecurrences = function ({ ...opts, }); } + case Frequency.SECONDLY: { + const nextRef = moment(refDT).add(interval, 's'); + return getMinuteOfRecurrences({ + refDT: nextRef, + ...opts, + }); + } } }; diff --git a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts index e442a0efeea05..f31ec223e3d9b 100644 --- a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts +++ b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts @@ -59,7 +59,7 @@ describe('checking migration metadata changes on all registered SO types', () => "action": "0e6fc0b74c7312a8c11ff6b14437b93a997358b8", "action_task_params": "b50cb5c8a493881474918e8d4985e61374ca4c30", "ad_hoc_run_params": "d4e3c5c794151d0a4f5c71e886b2aa638da73ad2", - "alert": "05b07040b12ff45ab642f47464e8a6c903cf7b86", + "alert": "556a03378f5ee1c31593c3a37c66b54555ee14ff", "api_key_pending_invalidation": "8f5554d1984854011b8392d9a6f7ef985bcac03c", "apm-custom-dashboards": "b67128f78160c288bd7efe25b2da6e2afd5e82fc", "apm-indices": "8a2d68d415a4b542b26b0d292034a28ffac6fed4", diff --git a/x-pack/plugins/alerting/common/routes/r_rule/response/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/r_rule/response/schemas/v1.ts index c9dec9d8cf1e6..463619a3cdb0e 100644 --- a/x-pack/plugins/alerting/common/routes/r_rule/response/schemas/v1.ts +++ b/x-pack/plugins/alerting/common/routes/r_rule/response/schemas/v1.ts @@ -78,86 +78,104 @@ export const rRuleResponseSchema = schema.object({ ) ), byweekday: schema.maybe( - schema.arrayOf( - schema.oneOf([schema.string(), schema.number()], { - meta: { - description: - 'Indicates the days of the week to recur or else nth-day-of-month strings. For example, "+2TU" second Tuesday of month, "-1FR" last Friday of the month, which are internally converted to a `byweekday/bysetpos` combination.', - }, - }) + schema.nullable( + schema.arrayOf( + schema.oneOf([schema.string(), schema.number()], { + meta: { + description: + 'Indicates the days of the week to recur or else nth-day-of-month strings. For example, "+2TU" second Tuesday of month, "-1FR" last Friday of the month, which are internally converted to a `byweekday/bysetpos` combination.', + }, + }) + ) ) ), bymonth: schema.maybe( - schema.arrayOf( - schema.number({ - meta: { - description: 'Indicates months of the year that this rule should recur.', - }, - }) + schema.nullable( + schema.arrayOf( + schema.number({ + meta: { + description: 'Indicates months of the year that this rule should recur.', + }, + }) + ) ) ), bysetpos: schema.maybe( - schema.arrayOf( - schema.number({ - meta: { - description: - 'A positive or negative integer affecting the nth day of the month. For example, -2 combined with `byweekday` of FR is 2nd to last Friday of the month. It is recommended to not set this manually and just use `byweekday`.', - }, - }) + schema.nullable( + schema.arrayOf( + schema.number({ + meta: { + description: + 'A positive or negative integer affecting the nth day of the month. For example, -2 combined with `byweekday` of FR is 2nd to last Friday of the month. It is recommended to not set this manually and just use `byweekday`.', + }, + }) + ) ) ), bymonthday: schema.maybe( - schema.arrayOf( - schema.number({ - meta: { - description: 'Indicates the days of the month to recur.', - }, - }) + schema.nullable( + schema.arrayOf( + schema.number({ + meta: { + description: 'Indicates the days of the month to recur.', + }, + }) + ) ) ), byyearday: schema.maybe( - schema.arrayOf( - schema.number({ - meta: { - description: 'Indicates the days of the year that this rule should recur.', - }, - }) + schema.nullable( + schema.arrayOf( + schema.number({ + meta: { + description: 'Indicates the days of the year that this rule should recur.', + }, + }) + ) ) ), byweekno: schema.maybe( - schema.arrayOf( - schema.number({ - meta: { - description: 'Indicates number of the week hours to recur.', - }, - }) + schema.nullable( + schema.arrayOf( + schema.number({ + meta: { + description: 'Indicates number of the week hours to recur.', + }, + }) + ) ) ), byhour: schema.maybe( - schema.arrayOf( - schema.number({ - meta: { - description: 'Indicates hours of the day to recur.', - }, - }) + schema.nullable( + schema.arrayOf( + schema.number({ + meta: { + description: 'Indicates hours of the day to recur.', + }, + }) + ) ) ), byminute: schema.maybe( - schema.arrayOf( - schema.number({ - meta: { - description: 'Indicates minutes of the hour to recur.', - }, - }) + schema.nullable( + schema.arrayOf( + schema.number({ + meta: { + description: 'Indicates minutes of the hour to recur.', + }, + }) + ) ) ), bysecond: schema.maybe( - schema.arrayOf( - schema.number({ - meta: { - description: 'Indicates seconds of the day to recur.', - }, - }) + schema.nullable( + schema.arrayOf( + schema.number({ + meta: { + description: 'Indicates seconds of the day to recur.', + }, + }) + ) ) ), }); diff --git a/x-pack/plugins/alerting/common/routes/rule/response/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/rule/response/schemas/v1.ts index 069aca001d14f..6226a17d51025 100644 --- a/x-pack/plugins/alerting/common/routes/rule/response/schemas/v1.ts +++ b/x-pack/plugins/alerting/common/routes/rule/response/schemas/v1.ts @@ -224,20 +224,21 @@ export const ruleExecutionStatusSchema = schema.object({ ), }); +export const outcome = schema.oneOf( + [ + schema.literal(ruleLastRunOutcomeValuesV1.SUCCEEDED), + schema.literal(ruleLastRunOutcomeValuesV1.WARNING), + schema.literal(ruleLastRunOutcomeValuesV1.FAILED), + ], + { + meta: { + description: 'Outcome of last run of the rule. Value could be succeeded, warning or failed.', + }, + } +); + export const ruleLastRunSchema = schema.object({ - outcome: schema.oneOf( - [ - schema.literal(ruleLastRunOutcomeValuesV1.SUCCEEDED), - schema.literal(ruleLastRunOutcomeValuesV1.WARNING), - schema.literal(ruleLastRunOutcomeValuesV1.FAILED), - ], - { - meta: { - description: - 'Outcome of last run of the rule. Value could be succeeded, warning or failed.', - }, - } - ), + outcome, outcome_order: schema.maybe( schema.number({ meta: { @@ -334,7 +335,7 @@ export const monitoringSchema = schema.object( duration: schema.maybe( schema.number({ meta: { description: 'Duration of the rule run.' } }) ), - outcome: schema.maybe(ruleLastRunSchema), + outcome: schema.maybe(outcome), }), { meta: { description: 'History of the rule run.' } } ), diff --git a/x-pack/plugins/alerting/public/services/maintenance_windows_api/transform_maintenance_window_response.ts b/x-pack/plugins/alerting/public/services/maintenance_windows_api/transform_maintenance_window_response.ts index 329c2febf3b15..a7887e684140d 100644 --- a/x-pack/plugins/alerting/public/services/maintenance_windows_api/transform_maintenance_window_response.ts +++ b/x-pack/plugins/alerting/public/services/maintenance_windows_api/transform_maintenance_window_response.ts @@ -17,7 +17,6 @@ export const transformMaintenanceWindowResponse = ( duration: response.duration, expirationDate: response.expiration_date, events: response.events, - // @ts-expect-error upgrade typescript v5.1.6 rRule: response.r_rule, ...(response.category_ids !== undefined ? { categoryIds: response.category_ids } : {}), ...(response.scoped_query !== undefined ? { scopedQuery: response.scoped_query } : {}), diff --git a/x-pack/plugins/alerting/server/application/backfill/methods/schedule/schedule_backfill.ts b/x-pack/plugins/alerting/server/application/backfill/methods/schedule/schedule_backfill.ts index d755463e9bc3e..534262aa31c31 100644 --- a/x-pack/plugins/alerting/server/application/backfill/methods/schedule/schedule_backfill.ts +++ b/x-pack/plugins/alerting/server/application/backfill/methods/schedule/schedule_backfill.ts @@ -10,7 +10,6 @@ import Boom from '@hapi/boom'; import { KueryNode, nodeBuilder } from '@kbn/es-query'; import { SavedObjectsFindResult } from '@kbn/core/server'; import { RULE_SAVED_OBJECT_TYPE } from '../../../../saved_objects'; -import { RuleAttributes } from '../../../../data/rule/types'; import { findRulesSo } from '../../../../data/rule'; import { alertingAuthorizationFilterOpts, @@ -27,6 +26,7 @@ import type { } from './types'; import { scheduleBackfillParamsSchema } from './schemas'; import { transformRuleAttributesToRuleDomain } from '../../../rule/transforms'; +import { RawRule } from '../../../../types'; export async function scheduleBackfill( context: RulesClientContext, @@ -116,7 +116,7 @@ export async function scheduleBackfill( ); const rulesFinder = - await context.encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser( + await context.encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser( { filter: kueryNodeFilterWithAuth, type: RULE_SAVED_OBJECT_TYPE, @@ -125,7 +125,7 @@ export async function scheduleBackfill( } ); - let rulesToSchedule: Array> = []; + let rulesToSchedule: Array> = []; for await (const response of rulesFinder.find()) { for (const rule of response.saved_objects) { context.auditLogger?.log( @@ -150,7 +150,7 @@ export async function scheduleBackfill( rules: rulesToSchedule.map(({ id, attributes, references }) => { const ruleType = context.ruleTypeRegistry.get(attributes.alertTypeId!); return transformRuleAttributesToRuleDomain( - attributes as RuleAttributes, + attributes, { id, logger: context.logger, diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/archive/archive_maintenance_window.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/archive/archive_maintenance_window.ts index 466167df6b8d7..461f88288ced3 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/archive/archive_maintenance_window.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/archive/archive_maintenance_window.ts @@ -69,7 +69,6 @@ async function archiveWithOCC( const events = mergeEvents({ newEvents: generateMaintenanceWindowEvents({ - // @ts-expect-error upgrade typescript v5.1.6 rRule: attributes.rRule, duration: attributes.duration, expirationDate, diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/finish/finish_maintenance_window.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/finish/finish_maintenance_window.ts index b6de6dea7cb76..e318971993542 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/finish/finish_maintenance_window.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/finish/finish_maintenance_window.ts @@ -74,7 +74,6 @@ async function finishWithOCC( // Generate new events with new expiration date const newEvents = generateMaintenanceWindowEvents({ - // @ts-expect-error upgrade typescript v5.1.6 rRule: maintenanceWindow.rRule, duration: maintenanceWindow.duration, expirationDate: expirationDate.toISOString(), diff --git a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.ts b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.ts index cb9d5ded1f7b2..6c8fd65b6988f 100644 --- a/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.ts +++ b/x-pack/plugins/alerting/server/application/maintenance_window/methods/update/update_maintenance_window.ts @@ -101,7 +101,6 @@ async function updateWithOCC( const modificationMetadata = await getModificationMetadata(); let events = generateMaintenanceWindowEvents({ - // @ts-expect-error upgrade typescript v5.1.6 rRule: rRule || maintenanceWindow.rRule, duration: typeof duration === 'number' ? duration : maintenanceWindow.duration, expirationDate, diff --git a/x-pack/plugins/alerting/server/application/r_rule/schemas/r_rule_schema.ts b/x-pack/plugins/alerting/server/application/r_rule/schemas/r_rule_schema.ts index 5325c571f5d3e..51f2b055bb822 100644 --- a/x-pack/plugins/alerting/server/application/r_rule/schemas/r_rule_schema.ts +++ b/x-pack/plugins/alerting/server/application/r_rule/schemas/r_rule_schema.ts @@ -34,13 +34,15 @@ export const rRuleSchema = schema.object({ schema.literal('SU'), ]) ), - byweekday: schema.maybe(schema.arrayOf(schema.oneOf([schema.string(), schema.number()]))), - bymonth: schema.maybe(schema.arrayOf(schema.number())), - bysetpos: schema.maybe(schema.arrayOf(schema.number())), - bymonthday: schema.maybe(schema.arrayOf(schema.number())), - byyearday: schema.maybe(schema.arrayOf(schema.number())), - byweekno: schema.maybe(schema.arrayOf(schema.number())), - byhour: schema.maybe(schema.arrayOf(schema.number())), - byminute: schema.maybe(schema.arrayOf(schema.number())), - bysecond: schema.maybe(schema.arrayOf(schema.number())), + byweekday: schema.maybe( + schema.nullable(schema.arrayOf(schema.oneOf([schema.string(), schema.number()]))) + ), + bymonth: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), + bysetpos: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), + bymonthday: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), + byyearday: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), + byweekno: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), + byhour: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), + byminute: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), + bysecond: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), }); diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.ts index d2d5b47a893f3..0c1fa9a3fe1e9 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.ts @@ -31,7 +31,6 @@ import type { BulkDeleteRulesRequestBody, } from './types'; import { validateBulkDeleteRulesBody } from './validation'; -import type { RuleAttributes } from '../../../../data/rule/types'; import { bulkDeleteRulesSo } from '../../../../data/rule'; import { transformRuleAttributesToRuleDomain, transformRuleDomainToRule } from '../../transforms'; import { ruleDomainSchema } from '../../schemas'; @@ -103,7 +102,7 @@ export const bulkDeleteRules = async ( // when we are doing the bulk delete and this should fix itself const ruleType = context.ruleTypeRegistry.get(attributes.alertTypeId!); const ruleDomain = transformRuleAttributesToRuleDomain( - attributes as RuleAttributes, + attributes as RawRule, { id, logger: context.logger, @@ -144,17 +143,15 @@ const bulkDeleteWithOCC = async ( type: 'rules', }, () => - context.encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser( - { - filter, - type: RULE_SAVED_OBJECT_TYPE, - perPage: 100, - ...(context.namespace ? { namespaces: [context.namespace] } : undefined), - } - ) + context.encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser({ + filter, + type: RULE_SAVED_OBJECT_TYPE, + perPage: 100, + ...(context.namespace ? { namespaces: [context.namespace] } : undefined), + }) ); - const rulesToDelete: Array> = []; + const rulesToDelete: Array> = []; const apiKeyToRuleIdMapping: Record = {}; const taskIdToRuleIdMapping: Record = {}; const ruleNameToRuleIdMapping: Record = {}; @@ -194,7 +191,7 @@ const bulkDeleteWithOCC = async ( ); for (const { id, attributes } of rulesToDelete) { - await untrackRuleAlerts(context, id, attributes as RuleAttributes); + await untrackRuleAlerts(context, id, attributes as RawRule); } const result = await withSpan( diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_disable/bulk_disable_rules.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_disable/bulk_disable_rules.ts index 11f1d43b02b42..1e56be531b0ca 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_disable/bulk_disable_rules.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_disable/bulk_disable_rules.ts @@ -33,7 +33,6 @@ import type { BulkDisableRulesResult, BulkDisableRulesRequestBody, } from './types'; -import type { RuleAttributes } from '../../../../data/rule/types'; import { validateBulkDisableRulesBody } from './validation'; import { ruleDomainSchema } from '../../schemas'; import type { RulesClientContext } from '../../../../rules_client/types'; @@ -96,7 +95,7 @@ export const bulkDisableRules = async ( // when we are doing the bulk disable and this should fix itself const ruleType = context.ruleTypeRegistry.get(attributes.alertTypeId!); const ruleDomain = transformRuleAttributesToRuleDomain( - attributes as RuleAttributes, + attributes as RawRule, { id, logger: context.logger, @@ -139,17 +138,15 @@ const bulkDisableRulesWithOCC = async ( type: 'rules', }, () => - context.encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser( - { - filter, - type: RULE_SAVED_OBJECT_TYPE, - perPage: 100, - ...(context.namespace ? { namespaces: [context.namespace] } : undefined), - } - ) + context.encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser({ + filter, + type: RULE_SAVED_OBJECT_TYPE, + perPage: 100, + ...(context.namespace ? { namespaces: [context.namespace] } : undefined), + }) ); - const rulesToDisable: Array> = []; + const rulesToDisable: Array> = []; const errors: BulkOperationError[] = []; const ruleNameToRuleIdMapping: Record = {}; const username = await context.getUserName(); @@ -204,7 +201,7 @@ const bulkDisableRulesWithOCC = async ( // TODO (http-versioning) Remove casts when updateMeta has been converted attributes: { ...updatedAttributes, - } as RuleAttributes, + } as RawRule, ...(migratedActions.hasLegacyActions ? { references: migratedActions.resultedReferences } : {}), @@ -252,9 +249,7 @@ const bulkDisableRulesWithOCC = async ( () => bulkDisableRulesSo({ savedObjectsClient: context.unsecuredSavedObjectsClient, - bulkDisableRuleAttributes: rulesToDisable as Array< - SavedObjectsBulkCreateObject - >, + bulkDisableRuleAttributes: rulesToDisable as Array>, savedObjectsBulkCreateOptions: { overwrite: true }, }) ); @@ -262,7 +257,7 @@ const bulkDisableRulesWithOCC = async ( const taskIdsToDisable: string[] = []; const taskIdsToDelete: string[] = []; const taskIdsToClearState: string[] = []; - const disabledRules: Array> = []; + const disabledRules: Array> = []; result.saved_objects.forEach((rule) => { if (rule.error === undefined) { @@ -294,8 +289,7 @@ const bulkDisableRulesWithOCC = async ( return { errors, - // TODO: delete the casting when we do versioning of bulk disable api - rules: disabledRules as Array>, + rules: disabledRules, accListSpecificForBulkOperation: [taskIdsToDisable, taskIdsToDelete, taskIdsToClearState], }; }; diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.test.ts index c7c795359aaee..61d38c2c37c19 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.test.ts @@ -37,11 +37,11 @@ import { migrateLegacyActions } from '../../../../rules_client/lib'; import { migrateLegacyActionsMock } from '../../../../rules_client/lib/siem_legacy_actions/retrieve_migrated_legacy_actions.mock'; import { ConnectorAdapterRegistry } from '../../../../connector_adapters/connector_adapter_registry'; import { ConnectorAdapter } from '../../../../connector_adapters/types'; -import { RuleAttributes } from '../../../../data/rule/types'; import { SavedObject } from '@kbn/core/server'; import { bulkEditOperationsSchema } from './schemas'; import { RULE_SAVED_OBJECT_TYPE } from '../../../../saved_objects'; import { backfillClientMock } from '../../../../backfill_client/backfill_client.mock'; +import { RawRule } from '../../../../types'; jest.mock('../../../../rules_client/lib/siem_legacy_actions/migrate_legacy_actions', () => { return { @@ -1175,7 +1175,7 @@ describe('bulkEdit()', () => { }); const rule = unsecuredSavedObjectsClient.bulkCreate.mock.calls[0][0] as Array< - SavedObject + SavedObject >; expect(rule[0].attributes.actions).toEqual([ diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts index a9a060b99664d..8868065fa43a5 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_edit/bulk_edit_rules.ts @@ -74,7 +74,6 @@ import { ruleNotifyWhen } from '../../constants'; import { actionRequestSchema, ruleDomainSchema, systemActionRequestSchema } from '../../schemas'; import { RuleParams, RuleDomain, RuleSnoozeSchedule } from '../../types'; import { findRulesSo, bulkCreateRulesSo } from '../../../../data/rule'; -import { RuleAttributes, RuleActionAttributes } from '../../../../data/rule/types'; import { transformRuleAttributesToRuleDomain, transformRuleDomainToRuleAttributes, @@ -98,7 +97,7 @@ type ApiKeysMap = Map< } >; -type ApiKeyAttributes = Pick; +type ApiKeyAttributes = Pick; type RuleType = ReturnType; @@ -236,7 +235,7 @@ export async function bulkEditRules( // when we are doing the bulk create and this should fix itself const ruleType = context.ruleTypeRegistry.get(attributes.alertTypeId!); const ruleDomain = transformRuleAttributesToRuleDomain( - attributes as RuleAttributes, + attributes as RawRule, { id, logger: context.logger, @@ -279,13 +278,13 @@ async function bulkEditRulesOcc( } ): Promise<{ apiKeysToInvalidate: string[]; - rules: Array>; - resultSavedObjects: Array>; + rules: Array>; + resultSavedObjects: Array>; errors: BulkOperationError[]; skipped: BulkActionSkipResult[]; }> { const rulesFinder = - await context.encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser( + await context.encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser( { filter, type: RULE_SAVED_OBJECT_TYPE, @@ -294,7 +293,7 @@ async function bulkEditRulesOcc( } ); - const rules: Array> = []; + const rules: Array> = []; const skipped: BulkActionSkipResult[] = []; const errors: BulkOperationError[] = []; const apiKeysMap: ApiKeysMap = new Map(); @@ -311,7 +310,7 @@ async function bulkEditRulesOcc( await pMap( response.saved_objects, - async (rule: SavedObjectsFindResult) => + async (rule: SavedObjectsFindResult) => updateRuleAttributesAndParamsInMemory({ context, rule, @@ -436,11 +435,11 @@ async function updateRuleAttributesAndParamsInMemory( shouldIncrementRevision = () => true, }: { context: RulesClientContext; - rule: SavedObjectsFindResult; + rule: SavedObjectsFindResult; operations: BulkEditOperation[]; paramsModifier?: ParamsModifier; apiKeysMap: ApiKeysMap; - rules: Array>; + rules: Array>; skipped: BulkActionSkipResult[]; errors: BulkOperationError[]; username: string | null; @@ -556,7 +555,7 @@ async function updateRuleAttributesAndParamsInMemory( rule: updatedRule, params: { legacyId: rule.attributes.legacyId, - paramsWithRefs: updatedParams as RuleAttributes['params'], + paramsWithRefs: updatedParams, }, }); @@ -605,7 +604,7 @@ async function updateRuleAttributesAndParamsInMemory( async function ensureAuthorizationForBulkUpdate( context: RulesClientContext, operations: BulkEditOperation[], - rule: SavedObjectsFindResult + rule: SavedObjectsFindResult ): Promise { if (rule.attributes.actions.length === 0) { return; @@ -859,10 +858,10 @@ function validateScheduleOperation( async function prepareApiKeys( context: RulesClientContext, - rule: SavedObjectsFindResult, + rule: SavedObjectsFindResult, ruleType: RuleType, apiKeysMap: ApiKeysMap, - attributes: RuleAttributes, + attributes: RawRule, hasUpdateApiKeyOperation: boolean, username: string | null ): Promise<{ apiKeyAttributes: ApiKeyAttributes }> { @@ -890,13 +889,13 @@ async function prepareApiKeys( function updateAttributes( context: RulesClientContext, - attributes: RuleAttributes, + attributes: RawRule, apiKeyAttributes: ApiKeyAttributes, updatedParams: RuleParams, - rawAlertActions: RuleActionAttributes[], + rawAlertActions: RawRuleAction[], username: string | null ): { - updatedAttributes: RuleAttributes; + updatedAttributes: RawRule; } { // get notifyWhen const notifyWhen = getRuleNotifyWhenType( @@ -905,16 +904,16 @@ function updateAttributes( ); // TODO (http-versioning) Remove casts when updateMeta has been converted - const castedAttributes = attributes as RawRule; + const castedAttributes = attributes; const updatedAttributes = updateMeta(context, { ...castedAttributes, ...apiKeyAttributes, - params: updatedParams as RawRule['params'], - actions: rawAlertActions as RawRule['actions'], + params: updatedParams, + actions: rawAlertActions, notifyWhen, updatedBy: username, updatedAt: new Date().toISOString(), - }) as RuleAttributes; + }); // add mapped_params const mappedParams = getMappedParams(updatedParams); @@ -934,7 +933,7 @@ async function saveBulkUpdatedRules({ apiKeysMap, }: { context: RulesClientContext; - rules: Array>; + rules: Array>; apiKeysMap: ApiKeysMap; }) { const apiKeysToInvalidate: string[] = []; @@ -945,7 +944,7 @@ async function saveBulkUpdatedRules({ // bulk_disable, bulk_enable, etc. to fix this cast result = await bulkCreateRulesSo({ savedObjectsClient: context.unsecuredSavedObjectsClient, - bulkCreateRuleAttributes: rules as Array>, + bulkCreateRuleAttributes: rules as Array>, savedObjectsBulkCreateOptions: { overwrite: true }, }); } catch (e) { diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_enable/bulk_enable_rules.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_enable/bulk_enable_rules.ts index ff1852d8a4d4d..ac7510c2a5a9c 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/bulk_enable/bulk_enable_rules.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_enable/bulk_enable_rules.ts @@ -18,7 +18,7 @@ import { Logger } from '@kbn/core/server'; import { TaskManagerStartContract, TaskStatus } from '@kbn/task-manager-plugin/server'; import { TaskInstanceWithDeprecatedFields } from '@kbn/task-manager-plugin/server/task'; import { bulkCreateRulesSo } from '../../../../data/rule'; -import { RawRule, RawRuleAction } from '../../../../types'; +import { RawRule } from '../../../../types'; import { RuleDomain, RuleParams } from '../../types'; import { convertRuleIdsToKueryNode } from '../../../../lib'; import { ruleAuditEvent, RuleAuditAction } from '../../../../rules_client/common/audit_events'; @@ -37,7 +37,6 @@ import { } from '../../../../rules_client/lib'; import { RulesClientContext, BulkOperationError } from '../../../../rules_client/types'; import { validateScheduleLimit } from '../get_schedule_frequency'; -import { RuleAttributes } from '../../../../data/rule/types'; import { RULE_SAVED_OBJECT_TYPE } from '../../../../saved_objects'; import { BulkEnableRulesParams, BulkEnableRulesResult } from './types'; import { bulkEnableRulesParamsSchema } from './schemas'; @@ -122,7 +121,7 @@ export const bulkEnableRules = async ( // when we are doing the bulk delete and this should fix itself const ruleType = context.ruleTypeRegistry.get(attributes.alertTypeId!); const ruleDomain: RuleDomain = transformRuleAttributesToRuleDomain( - attributes as RuleAttributes, + attributes as RawRule, { id, logger: context.logger, @@ -159,7 +158,7 @@ const bulkEnableRulesWithOCC = async ( type: 'rules', }, async () => - await context.encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser( + await context.encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser( { filter, type: RULE_SAVED_OBJECT_TYPE, @@ -169,8 +168,8 @@ const bulkEnableRulesWithOCC = async ( ) ); - const rulesFinderRules: Array> = []; - const rulesToEnable: Array> = []; + const rulesFinderRules: Array> = []; + const rulesToEnable: Array> = []; const tasksToSchedule: TaskInstanceWithDeprecatedFields[] = []; const errors: BulkOperationError[] = []; const ruleNameToRuleIdMapping: Record = {}; @@ -221,12 +220,11 @@ const bulkEnableRulesWithOCC = async ( ruleNameToRuleIdMapping[rule.id] = ruleName; } - // TODO (http-versioning) Remove RawRuleAction and RawRule casts const migratedActions = await migrateLegacyActions(context, { ruleId: rule.id, - actions: rule.attributes.actions as RawRuleAction[], + actions: rule.attributes.actions, references: rule.references, - attributes: rule.attributes as RawRule, + attributes: rule.attributes, }); const updatedAttributes = updateMetaAttributes(context, { @@ -344,16 +342,14 @@ const bulkEnableRulesWithOCC = async ( // bulk_disable, bulk_enable, etc. to fix this cast bulkCreateRulesSo({ savedObjectsClient: context.unsecuredSavedObjectsClient, - bulkCreateRuleAttributes: rulesToEnable as Array< - SavedObjectsBulkCreateObject - >, + bulkCreateRuleAttributes: rulesToEnable as Array>, savedObjectsBulkCreateOptions: { overwrite: true, }, }) ); - const rules: Array> = []; + const rules: Array> = []; const taskIdsToEnable: string[] = []; result.saved_objects.forEach((rule) => { @@ -376,7 +372,7 @@ const bulkEnableRulesWithOCC = async ( return { errors, // TODO: delete the casting when we do versioning of bulk disable api - rules: rules as Array>, + rules: rules as Array>, accListSpecificForBulkOperation: [taskIdsToEnable], }; }; diff --git a/x-pack/plugins/alerting/server/application/rule/methods/clone/clone_rule.ts b/x-pack/plugins/alerting/server/application/rule/methods/clone/clone_rule.ts index 4f83f5b8daa9c..9383a32b7c60a 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/clone/clone_rule.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/clone/clone_rule.ts @@ -21,7 +21,6 @@ import { createNewAPIKeySet, createRuleSavedObject } from '../../../../rules_cli import { RulesClientContext } from '../../../../rules_client/types'; import { RULE_SAVED_OBJECT_TYPE } from '../../../../saved_objects'; import { CloneRuleParams } from './types'; -import { RuleAttributes } from '../../../../data/rule/types'; import { RuleDomain, RuleParams } from '../../types'; import { getDecryptedRuleSo, getRuleSo } from '../../../../data/rule'; import { transformRuleAttributesToRuleDomain, transformRuleDomainToRule } from '../../transforms'; @@ -40,7 +39,7 @@ export async function cloneRule( throw Boom.badRequest(`Error validating clone data - ${error.message}`); } - let ruleSavedObject: SavedObject; + let ruleSavedObject: SavedObject; try { ruleSavedObject = await withSpan( @@ -78,8 +77,7 @@ export async function cloneRule( * functionality until we resolve our difference */ if ( - // TODO (http-versioning): Remove this cast to RawRule - isDetectionEngineAADRuleType(ruleSavedObject as SavedObject) || + isDetectionEngineAADRuleType(ruleSavedObject) || ruleSavedObject.attributes.consumer === AlertConsumers.SIEM ) { throw Boom.badRequest( @@ -126,7 +124,7 @@ export async function cloneRule( errorMessage: 'Error creating rule: could not create API key', }); - const ruleAttributes: RuleAttributes = { + const ruleAttributes: RawRule = { ...ruleSavedObject.attributes, name: ruleName, ...apiKeyAttributes, @@ -139,10 +137,7 @@ export async function cloneRule( muteAll: false, mutedInstanceIds: [], executionStatus: getRuleExecutionStatusPendingAttributes(lastRunTimestamp.toISOString()), - // TODO (http-versioning): Remove this cast to RuleAttributes - monitoring: getDefaultMonitoring( - lastRunTimestamp.toISOString() - ) as RuleAttributes['monitoring'], + monitoring: getDefaultMonitoring(lastRunTimestamp.toISOString()), revision: 0, scheduledTaskId: null, running: false, @@ -168,7 +163,7 @@ export async function cloneRule( }) ); - // Convert ES RuleAttributes back to domain rule object + // Convert ES RawRule back to domain rule object const ruleDomain: RuleDomain = transformRuleAttributesToRuleDomain( clonedRuleAttributes.attributes, { diff --git a/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.ts b/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.ts index 876fb73b0c289..34e13b65d76c5 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/create/create_rule.ts @@ -27,14 +27,13 @@ import { generateAPIKeyName, apiKeyAsRuleDomainProperties } from '../../../../ru import { ruleAuditEvent, RuleAuditAction } from '../../../../rules_client/common/audit_events'; import { RulesClientContext } from '../../../../rules_client/types'; import { RuleDomain, RuleParams } from '../../types'; -import { SanitizedRule } from '../../../../types'; +import { RawRule, SanitizedRule } from '../../../../types'; import { transformRuleAttributesToRuleDomain, transformRuleDomainToRuleAttributes, transformRuleDomainToRule, } from '../../transforms'; import { ruleDomainSchema } from '../../schemas'; -import { RuleAttributes } from '../../../../data/rule/types'; import type { CreateRuleData } from './types'; import { createRuleDataSchema } from './schemas'; import { createRuleSavedObject } from '../../../../rules_client/lib'; @@ -225,12 +224,11 @@ export async function createRule( }, params: { legacyId, - // @ts-expect-error upgrade typescript v4.9.5 paramsWithRefs: updatedParams, }, }); - const createdRuleSavedObject: SavedObject = await withSpan( + const createdRuleSavedObject: SavedObject = await withSpan( { name: 'createRuleSavedObject', type: 'rules' }, () => createRuleSavedObject(context, { @@ -243,7 +241,7 @@ export async function createRule( }) ); - // Convert ES RuleAttributes back to domain rule object + // Convert ES RawRule back to domain rule object const ruleDomain: RuleDomain = transformRuleAttributesToRuleDomain( createdRuleSavedObject.attributes, { diff --git a/x-pack/plugins/alerting/server/application/rule/methods/delete/delete_rule.ts b/x-pack/plugins/alerting/server/application/rule/methods/delete/delete_rule.ts index b738bafb3d690..dd3aaf5e82f78 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/delete/delete_rule.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/delete/delete_rule.ts @@ -14,7 +14,6 @@ import { bulkMarkApiKeysForInvalidation } from '../../../../invalidate_pending_a import { ruleAuditEvent, RuleAuditAction } from '../../../../rules_client/common/audit_events'; import { RulesClientContext } from '../../../../rules_client/types'; import { untrackRuleAlerts, migrateLegacyActions } from '../../../../rules_client/lib'; -import { RuleAttributes } from '../../../../data/rule/types'; import { RULE_SAVED_OBJECT_TYPE } from '../../../../saved_objects'; import { DeleteRuleParams } from './types'; import { deleteRuleParamsSchema } from './schemas'; @@ -40,7 +39,7 @@ async function deleteRuleWithOCC(context: RulesClientContext, { id }: { id: stri let taskIdToRemove: string | undefined | null; let apiKeyToInvalidate: string | null = null; let apiKeyCreatedByUser: boolean | undefined | null = false; - let attributes: RuleAttributes; + let attributes: RawRule; try { const decryptedRule = await getDecryptedRuleSo({ diff --git a/x-pack/plugins/alerting/server/application/rule/methods/disable/disable_rule.ts b/x-pack/plugins/alerting/server/application/rule/methods/disable/disable_rule.ts index 3e0d3aa3c67f5..f1865f123484b 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/disable/disable_rule.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/disable/disable_rule.ts @@ -13,7 +13,6 @@ import { retryIfConflicts } from '../../../../lib/retry_if_conflicts'; import { ruleAuditEvent, RuleAuditAction } from '../../../../rules_client/common/audit_events'; import { RulesClientContext } from '../../../../rules_client/types'; import { untrackRuleAlerts, updateMeta, migrateLegacyActions } from '../../../../rules_client/lib'; -import { RuleAttributes } from '../../../../data/rule/types'; import { RULE_SAVED_OBJECT_TYPE } from '../../../../saved_objects'; import { DisableRuleParams } from './types'; import { disableRuleParamsSchema } from './schemas'; @@ -86,7 +85,7 @@ async function disableWithOCC( } if (untrack) { - await untrackRuleAlerts(context, id, attributes as RuleAttributes); + await untrackRuleAlerts(context, id, attributes); } context.auditLogger?.log( diff --git a/x-pack/plugins/alerting/server/application/rule/methods/mute_all/mute_all.ts b/x-pack/plugins/alerting/server/application/rule/methods/mute_all/mute_all.ts index 73cfe6e26fdce..d0d2c186ba126 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/mute_all/mute_all.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/mute_all/mute_all.ts @@ -14,7 +14,6 @@ import { ruleAuditEvent, RuleAuditAction } from '../../../../rules_client/common import { RulesClientContext } from '../../../../rules_client/types'; import { updateMetaAttributes } from '../../../../rules_client/lib'; import { clearUnscheduledSnoozeAttributes } from '../../../../rules_client/common'; -import { RuleAttributes } from '../../../../data/rule/types'; import { MuteAllRuleParams } from './types'; import { muteAllRuleParamsSchema } from './schemas'; @@ -77,7 +76,7 @@ async function muteAllWithOCC(context: RulesClientContext, params: MuteAllRulePa const updateAttributes = updateMetaAttributes(context, { muteAll: true, mutedInstanceIds: [], - snoozeSchedule: clearUnscheduledSnoozeAttributes(attributes as RuleAttributes), + snoozeSchedule: clearUnscheduledSnoozeAttributes(attributes), updatedBy: await context.getUserName(), updatedAt: new Date().toISOString(), }); diff --git a/x-pack/plugins/alerting/server/application/rule/methods/unmute_all/unmute_all.ts b/x-pack/plugins/alerting/server/application/rule/methods/unmute_all/unmute_all.ts index 722cfed3700d0..bc70f7206fbb4 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/unmute_all/unmute_all.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/unmute_all/unmute_all.ts @@ -14,7 +14,6 @@ import { ruleAuditEvent, RuleAuditAction } from '../../../../rules_client/common import { RulesClientContext } from '../../../../rules_client/types'; import { updateMetaAttributes } from '../../../../rules_client/lib'; import { clearUnscheduledSnoozeAttributes } from '../../../../rules_client/common'; -import { RuleAttributes } from '../../../../data/rule/types'; import { UnmuteAllRuleParams } from './types'; import { unmuteAllRuleParamsSchema } from './schemas'; @@ -77,7 +76,7 @@ async function unmuteAllWithOCC(context: RulesClientContext, params: UnmuteAllRu const updateAttributes = updateMetaAttributes(context, { muteAll: false, mutedInstanceIds: [], - snoozeSchedule: clearUnscheduledSnoozeAttributes(attributes as RuleAttributes), + snoozeSchedule: clearUnscheduledSnoozeAttributes(attributes), updatedBy: await context.getUserName(), updatedAt: new Date().toISOString(), }); diff --git a/x-pack/plugins/alerting/server/application/rule/methods/update/update_rule.ts b/x-pack/plugins/alerting/server/application/rule/methods/update/update_rule.ts index 7f0663c879056..25759e8e06c70 100644 --- a/x-pack/plugins/alerting/server/application/rule/methods/update/update_rule.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/update/update_rule.ts @@ -37,13 +37,12 @@ import { createRuleSo, getDecryptedRuleSo, getRuleSo } from '../../../../data/ru import { validateScheduleLimit, ValidateScheduleLimitResult } from '../get_schedule_frequency'; import { RULE_SAVED_OBJECT_TYPE } from '../../../../saved_objects'; import { updateRuleDataSchema } from './schemas'; -import { RuleAttributes } from '../../../../data/rule/types'; import { transformRuleAttributesToRuleDomain, transformRuleDomainToRule } from '../../transforms'; import { ruleDomainSchema } from '../../schemas'; const validateCanUpdateFlapping = ( isFlappingEnabled: boolean, - originalFlapping: RuleAttributes['flapping'], + originalFlapping: RawRule['flapping'], updateFlapping: UpdateRuleParams['data']['flapping'] ) => { // If flapping is enabled, allow rule flapping to be updated and do nothing @@ -112,7 +111,7 @@ async function updateWithOCC( throw Boom.badRequest(`Error validating update data - ${error.message}`); } - let originalRuleSavedObject: SavedObject; + let originalRuleSavedObject: SavedObject; try { originalRuleSavedObject = await getDecryptedRuleSo({ @@ -296,7 +295,7 @@ async function updateRuleAttributes({ }: { context: RulesClientContext; updateRuleData: UpdateRuleData; - originalRuleSavedObject: SavedObject; + originalRuleSavedObject: SavedObject; validatedRuleTypeParams: Params; shouldIncrementRevision: (params?: Params) => boolean; isSystemAction: (connectorId: string) => boolean; @@ -376,7 +375,7 @@ async function updateRuleAttributes({ updatedRuleAttributes.mapped_params = mappedParams; } - let updatedRuleSavedObject: SavedObject; + let updatedRuleSavedObject: SavedObject; const { id, version } = originalRuleSavedObject; try { diff --git a/x-pack/plugins/alerting/server/application/rule/schemas/rule_schemas.ts b/x-pack/plugins/alerting/server/application/rule/schemas/rule_schemas.ts index da91ceb727d2c..978e11f0183cf 100644 --- a/x-pack/plugins/alerting/server/application/rule/schemas/rule_schemas.ts +++ b/x-pack/plugins/alerting/server/application/rule/schemas/rule_schemas.ts @@ -64,12 +64,14 @@ export const ruleExecutionStatusSchema = schema.object({ ), }); +const outcome = schema.oneOf([ + schema.literal(ruleLastRunOutcomeValues.SUCCEEDED), + schema.literal(ruleLastRunOutcomeValues.WARNING), + schema.literal(ruleLastRunOutcomeValues.FAILED), +]); + export const ruleLastRunSchema = schema.object({ - outcome: schema.oneOf([ - schema.literal(ruleLastRunOutcomeValues.SUCCEEDED), - schema.literal(ruleLastRunOutcomeValues.WARNING), - schema.literal(ruleLastRunOutcomeValues.FAILED), - ]), + outcome, outcomeOrder: schema.maybe(schema.number()), warning: schema.maybe( schema.nullable( @@ -105,7 +107,7 @@ export const monitoringSchema = schema.object({ success: schema.boolean(), timestamp: schema.number(), duration: schema.maybe(schema.number()), - outcome: schema.maybe(ruleLastRunSchema), + outcome: schema.maybe(outcome), }) ), calculated_metrics: schema.object({ diff --git a/x-pack/plugins/alerting/server/application/rule/transforms/transform_raw_actions_to_domain_actions.test.ts b/x-pack/plugins/alerting/server/application/rule/transforms/transform_raw_actions_to_domain_actions.test.ts index 591518e9b13ee..7b25ebf45ce8d 100644 --- a/x-pack/plugins/alerting/server/application/rule/transforms/transform_raw_actions_to_domain_actions.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/transforms/transform_raw_actions_to_domain_actions.test.ts @@ -5,13 +5,13 @@ * 2.0. */ -import { RuleActionAttributes } from '../../../data/rule/types'; +import { RawRuleAction } from '../../../types'; import { transformRawActionsToDomainActions, transformRawActionsToDomainSystemActions, } from './transform_raw_actions_to_domain_actions'; -const defaultAction: RuleActionAttributes = { +const defaultAction: RawRuleAction = { group: 'default', uuid: '1', actionRef: 'default-action-ref', @@ -25,7 +25,7 @@ const defaultAction: RuleActionAttributes = { alertsFilter: { query: { kql: 'test:1', dsl: '{}', filters: [] } }, }; -const systemAction: RuleActionAttributes = { +const systemAction: RawRuleAction = { actionRef: 'system_action:my-system-action-id', uuid: '123', actionTypeId: '.test-system-action', diff --git a/x-pack/plugins/alerting/server/application/rule/transforms/transform_raw_actions_to_domain_actions.ts b/x-pack/plugins/alerting/server/application/rule/transforms/transform_raw_actions_to_domain_actions.ts index 14f376c7d8176..7242f4bb1c716 100644 --- a/x-pack/plugins/alerting/server/application/rule/transforms/transform_raw_actions_to_domain_actions.ts +++ b/x-pack/plugins/alerting/server/application/rule/transforms/transform_raw_actions_to_domain_actions.ts @@ -8,13 +8,12 @@ import { omit } from 'lodash'; import { SavedObjectReference } from '@kbn/core/server'; import { injectReferencesIntoActions } from '../../../rules_client/common'; -import { RuleAttributes } from '../../../data/rule/types'; import { RawRule } from '../../../types'; import { RuleDomain } from '../types'; interface Args { ruleId: string; - actions: RuleAttributes['actions'] | RawRule['actions']; + actions: RawRule['actions']; isSystemAction: (connectorId: string) => boolean; omitGeneratedValues?: boolean; references?: SavedObjectReference[]; @@ -42,8 +41,8 @@ export const transformRawActionsToDomainActions = ({ uuid: action.uuid, ...(action.frequency ? { frequency: action.frequency } : {}), ...(action.alertsFilter ? { alertsFilter: action.alertsFilter } : {}), - ...(action.useAlertDataAsTemplate - ? { useAlertDataAsTemplate: action.useAlertDataAsTemplate } + ...(action.useAlertDataForTemplate + ? { useAlertDataForTemplate: action.useAlertDataForTemplate } : {}), }; @@ -54,7 +53,7 @@ export const transformRawActionsToDomainActions = ({ return defaultAction; }); - return ruleDomainActions; + return ruleDomainActions as RuleDomain['actions']; }; export const transformRawActionsToDomainSystemActions = ({ @@ -76,8 +75,8 @@ export const transformRawActionsToDomainSystemActions = ({ params: action.params, actionTypeId: action.actionTypeId, uuid: action.uuid, - ...(action.useAlertDataAsTemplate - ? { useAlertDataAsTemplate: action.useAlertDataAsTemplate } + ...(action.useAlertDataForTemplate + ? { useAlertDataForTemplate: action.useAlertDataForTemplate } : {}), }; }); diff --git a/x-pack/plugins/alerting/server/application/rule/transforms/transform_rule_attributes_to_rule_domain.test.ts b/x-pack/plugins/alerting/server/application/rule/transforms/transform_rule_attributes_to_rule_domain.test.ts index 6a4e1824172ca..a96fbcceaffba 100644 --- a/x-pack/plugins/alerting/server/application/rule/transforms/transform_rule_attributes_to_rule_domain.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/transforms/transform_rule_attributes_to_rule_domain.test.ts @@ -9,7 +9,7 @@ import { RecoveredActionGroup } from '../../../../common'; import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; import { transformRuleAttributesToRuleDomain } from './transform_rule_attributes_to_rule_domain'; import { UntypedNormalizedRuleType } from '../../../rule_type_registry'; -import { RuleActionAttributes } from '../../../data/rule/types'; +import { RawRuleAction } from '../../../types'; const ruleType: jest.Mocked = { id: 'test.rule-type', @@ -37,7 +37,7 @@ const ruleType: jest.Mocked = { validLegacyConsumers: [], }; -const defaultAction: RuleActionAttributes = { +const defaultAction: RawRuleAction = { group: 'default', uuid: '1', actionRef: 'default-action-ref', @@ -51,7 +51,7 @@ const defaultAction: RuleActionAttributes = { alertsFilter: { query: { kql: 'test:1', dsl: '{}', filters: [] } }, }; -const systemAction: RuleActionAttributes = { +const systemAction: RawRuleAction = { actionRef: 'system_action:my-system-action-id', uuid: '123', actionTypeId: '.test-system-action', @@ -82,6 +82,8 @@ describe('transformRuleAttributesToRuleDomain', () => { executionStatus: { lastExecutionDate: '2019-02-12T21:01:22.479Z', status: 'pending' as const, + error: null, + warning: null, }, params: {}, throttle: null, diff --git a/x-pack/plugins/alerting/server/application/rule/transforms/transform_rule_attributes_to_rule_domain.ts b/x-pack/plugins/alerting/server/application/rule/transforms/transform_rule_attributes_to_rule_domain.ts index 6b4917c96010f..8d71e43130647 100644 --- a/x-pack/plugins/alerting/server/application/rule/transforms/transform_rule_attributes_to_rule_domain.ts +++ b/x-pack/plugins/alerting/server/application/rule/transforms/transform_rule_attributes_to_rule_domain.ts @@ -10,8 +10,7 @@ import { SavedObjectReference } from '@kbn/core/server'; import { ruleExecutionStatusValues } from '../constants'; import { getRuleSnoozeEndTime } from '../../../lib'; import { RuleDomain, Monitoring, RuleParams } from '../types'; -import { PartialRule, SanitizedRule } from '../../../types'; -import { RuleAttributes, RuleExecutionStatusAttributes } from '../../../data/rule/types'; +import { PartialRule, RawRule, RawRuleExecutionStatus, SanitizedRule } from '../../../types'; import { UntypedNormalizedRuleType } from '../../../rule_type_registry'; import { injectReferencesIntoParams } from '../../../rules_client/common'; import { getActiveScheduledSnoozes } from '../../../lib/is_rule_snoozed'; @@ -32,7 +31,7 @@ const INITIAL_LAST_RUN_METRICS = { const transformEsExecutionStatus = ( logger: Logger, ruleId: string, - esRuleExecutionStatus: RuleExecutionStatusAttributes + esRuleExecutionStatus: RawRuleExecutionStatus ): RuleDomain['executionStatus'] => { const { lastExecutionDate, @@ -89,7 +88,7 @@ export const updateMonitoring = ({ const transformEsMonitoring = ( logger: Logger, ruleId: string, - monitoring?: RuleAttributes['monitoring'] + monitoring?: RawRule['monitoring'] ): Monitoring | undefined => { if (!monitoring) { return undefined; @@ -120,7 +119,7 @@ interface TransformEsToRuleParams { } export const transformRuleAttributesToRuleDomain = ( - esRule: RuleAttributes, + esRule: RawRule, transformParams: TransformEsToRuleParams, isSystemAction: (connectorId: string) => boolean ): RuleDomain => { @@ -251,5 +250,6 @@ export const transformRuleAttributesToRuleDomain = ; params: TransformRuleToEsParams; -}): RuleAttributes => { +}): RawRule => { const { legacyId, paramsWithRefs, meta } = params; const mappedParams = getMappedParams(paramsWithRefs); @@ -81,5 +81,5 @@ export const transformRuleDomainToRuleAttributes = ({ ...(rule.running !== undefined ? { running: rule.running } : {}), ...(rule.alertDelay !== undefined ? { alertDelay: rule.alertDelay } : {}), ...(rule.flapping !== undefined ? { flapping: rule.flapping } : {}), - }; + } as RawRule; }; diff --git a/x-pack/plugins/alerting/server/data/r_rule/types/r_rule_attributes.ts b/x-pack/plugins/alerting/server/data/r_rule/types/r_rule_attributes.ts index 54b2547a71b00..c97f593dd0a7b 100644 --- a/x-pack/plugins/alerting/server/data/r_rule/types/r_rule_attributes.ts +++ b/x-pack/plugins/alerting/server/data/r_rule/types/r_rule_attributes.ts @@ -17,13 +17,13 @@ export interface RRuleAttributes { count?: number; interval?: number; wkst?: WeekdayStr; - byweekday?: Array; - bymonth?: number[]; - bysetpos?: number[]; - bymonthday?: number[]; - byyearday?: number[]; - byweekno?: number[]; - byhour?: number[]; - byminute?: number[]; - bysecond?: number[]; + byweekday?: Array | null; + bymonth?: number[] | null; + bysetpos?: number[] | null; + bymonthday?: number[] | null; + byyearday?: number[] | null; + byweekno?: number[] | null; + byhour?: number[] | null; + byminute?: number[] | null; + bysecond?: number[] | null; } diff --git a/x-pack/plugins/alerting/server/data/rule/methods/bulk_create_rule_so.ts b/x-pack/plugins/alerting/server/data/rule/methods/bulk_create_rule_so.ts index 6bc0ee04b394d..057e44446030f 100644 --- a/x-pack/plugins/alerting/server/data/rule/methods/bulk_create_rule_so.ts +++ b/x-pack/plugins/alerting/server/data/rule/methods/bulk_create_rule_so.ts @@ -11,20 +11,20 @@ import { SavedObjectsBulkCreateObject, SavedObjectsBulkResponse, } from '@kbn/core/server'; -import { RuleAttributes } from '../types'; +import { RawRule } from '../../../types'; export interface BulkCreateRulesSoParams { savedObjectsClient: SavedObjectsClientContract; - bulkCreateRuleAttributes: Array>; + bulkCreateRuleAttributes: Array>; savedObjectsBulkCreateOptions?: SavedObjectsCreateOptions; } export const bulkCreateRulesSo = ( params: BulkCreateRulesSoParams -): Promise> => { +): Promise> => { const { savedObjectsClient, bulkCreateRuleAttributes, savedObjectsBulkCreateOptions } = params; - return savedObjectsClient.bulkCreate( + return savedObjectsClient.bulkCreate( bulkCreateRuleAttributes, savedObjectsBulkCreateOptions ); diff --git a/x-pack/plugins/alerting/server/data/rule/methods/bulk_disable_rules_so.ts b/x-pack/plugins/alerting/server/data/rule/methods/bulk_disable_rules_so.ts index 59c22765081ad..a32e38f255c3e 100644 --- a/x-pack/plugins/alerting/server/data/rule/methods/bulk_disable_rules_so.ts +++ b/x-pack/plugins/alerting/server/data/rule/methods/bulk_disable_rules_so.ts @@ -11,20 +11,20 @@ import { SavedObjectsBulkCreateObject, SavedObjectsBulkResponse, } from '@kbn/core/server'; -import { RuleAttributes } from '../types'; +import { RawRule } from '../../../types'; export interface BulkDisableRulesSoParams { savedObjectsClient: SavedObjectsClientContract; - bulkDisableRuleAttributes: Array>; + bulkDisableRuleAttributes: Array>; savedObjectsBulkCreateOptions?: SavedObjectsCreateOptions; } export const bulkDisableRulesSo = ( params: BulkDisableRulesSoParams -): Promise> => { +): Promise> => { const { savedObjectsClient, bulkDisableRuleAttributes, savedObjectsBulkCreateOptions } = params; - return savedObjectsClient.bulkCreate( + return savedObjectsClient.bulkCreate( bulkDisableRuleAttributes, savedObjectsBulkCreateOptions ); diff --git a/x-pack/plugins/alerting/server/data/rule/methods/create_rule_so.ts b/x-pack/plugins/alerting/server/data/rule/methods/create_rule_so.ts index b276bb0e2e10d..e5a45ee9f386e 100644 --- a/x-pack/plugins/alerting/server/data/rule/methods/create_rule_so.ts +++ b/x-pack/plugins/alerting/server/data/rule/methods/create_rule_so.ts @@ -10,16 +10,16 @@ import { SavedObjectsCreateOptions, SavedObject, } from '@kbn/core/server'; +import { RawRule } from '../../../types'; import { RULE_SAVED_OBJECT_TYPE } from '../../../saved_objects'; -import { RuleAttributes } from '../types'; export interface CreateRuleSoParams { savedObjectsClient: SavedObjectsClientContract; - ruleAttributes: RuleAttributes; + ruleAttributes: RawRule; savedObjectsCreateOptions?: SavedObjectsCreateOptions; } -export const createRuleSo = (params: CreateRuleSoParams): Promise> => { +export const createRuleSo = (params: CreateRuleSoParams): Promise> => { const { savedObjectsClient, ruleAttributes, savedObjectsCreateOptions } = params; return savedObjectsClient.create( diff --git a/x-pack/plugins/alerting/server/data/rule/methods/find_rules_so.ts b/x-pack/plugins/alerting/server/data/rule/methods/find_rules_so.ts index e929ccf019205..1e73d52aba955 100644 --- a/x-pack/plugins/alerting/server/data/rule/methods/find_rules_so.ts +++ b/x-pack/plugins/alerting/server/data/rule/methods/find_rules_so.ts @@ -11,7 +11,7 @@ import { SavedObjectsFindResponse, } from '@kbn/core/server'; import { RULE_SAVED_OBJECT_TYPE } from '../../../saved_objects'; -import { RuleAttributes } from '../types'; +import { RawRule } from '../../../types'; export interface FindRulesSoParams { savedObjectsClient: SavedObjectsClientContract; @@ -20,10 +20,10 @@ export interface FindRulesSoParams { export const findRulesSo = >( params: FindRulesSoParams -): Promise> => { +): Promise> => { const { savedObjectsClient, savedObjectsFindOptions } = params; - return savedObjectsClient.find({ + return savedObjectsClient.find({ ...savedObjectsFindOptions, type: RULE_SAVED_OBJECT_TYPE, }); diff --git a/x-pack/plugins/alerting/server/data/rule/methods/get_decrypted_rule_so.ts b/x-pack/plugins/alerting/server/data/rule/methods/get_decrypted_rule_so.ts index f7a4ab0baab9b..1171e53abda6f 100644 --- a/x-pack/plugins/alerting/server/data/rule/methods/get_decrypted_rule_so.ts +++ b/x-pack/plugins/alerting/server/data/rule/methods/get_decrypted_rule_so.ts @@ -8,8 +8,8 @@ import { SavedObject } from '@kbn/core/server'; import { EncryptedSavedObjectsClient } from '@kbn/encrypted-saved-objects-plugin/server'; import { SavedObjectsGetOptions } from '@kbn/core-saved-objects-api-server'; +import { RawRule } from '../../../types'; import { RULE_SAVED_OBJECT_TYPE } from '../../../saved_objects'; -import { RuleAttributes } from '../types'; export interface GetDecryptedRuleSoParams { encryptedSavedObjectsClient: EncryptedSavedObjectsClient; @@ -19,10 +19,10 @@ export interface GetDecryptedRuleSoParams { export const getDecryptedRuleSo = ( params: GetDecryptedRuleSoParams -): Promise> => { +): Promise> => { const { id, encryptedSavedObjectsClient, savedObjectsGetOptions } = params; - return encryptedSavedObjectsClient.getDecryptedAsInternalUser( + return encryptedSavedObjectsClient.getDecryptedAsInternalUser( RULE_SAVED_OBJECT_TYPE, id, savedObjectsGetOptions diff --git a/x-pack/plugins/alerting/server/data/rule/methods/get_rule_so.ts b/x-pack/plugins/alerting/server/data/rule/methods/get_rule_so.ts index 051644bab56f2..e02813d855ce9 100644 --- a/x-pack/plugins/alerting/server/data/rule/methods/get_rule_so.ts +++ b/x-pack/plugins/alerting/server/data/rule/methods/get_rule_so.ts @@ -7,8 +7,8 @@ import { SavedObjectsClientContract, SavedObject } from '@kbn/core/server'; import { SavedObjectsGetOptions } from '@kbn/core-saved-objects-api-server'; +import { RawRule } from '../../../types'; import { RULE_SAVED_OBJECT_TYPE } from '../../../saved_objects'; -import { RuleAttributes } from '../types'; export interface GetRuleSoParams { savedObjectsClient: SavedObjectsClientContract; @@ -16,8 +16,8 @@ export interface GetRuleSoParams { savedObjectsGetOptions?: SavedObjectsGetOptions; } -export const getRuleSo = (params: GetRuleSoParams): Promise> => { +export const getRuleSo = (params: GetRuleSoParams): Promise> => { const { savedObjectsClient, id, savedObjectsGetOptions } = params; - return savedObjectsClient.get(RULE_SAVED_OBJECT_TYPE, id, savedObjectsGetOptions); + return savedObjectsClient.get(RULE_SAVED_OBJECT_TYPE, id, savedObjectsGetOptions); }; diff --git a/x-pack/plugins/alerting/server/data/rule/methods/resolve_rule_so.ts b/x-pack/plugins/alerting/server/data/rule/methods/resolve_rule_so.ts index d0429b4166d8e..0c8e876dac540 100644 --- a/x-pack/plugins/alerting/server/data/rule/methods/resolve_rule_so.ts +++ b/x-pack/plugins/alerting/server/data/rule/methods/resolve_rule_so.ts @@ -8,7 +8,7 @@ import { SavedObjectsClientContract, SavedObjectsResolveResponse } from '@kbn/core/server'; import { SavedObjectsResolveOptions } from '@kbn/core-saved-objects-api-server'; import { RULE_SAVED_OBJECT_TYPE } from '../../../saved_objects'; -import { RuleAttributes } from '../types'; +import { RawRule } from '../../../types'; export interface ResolveRuleSoParams { savedObjectsClient: SavedObjectsClientContract; @@ -18,7 +18,7 @@ export interface ResolveRuleSoParams { export const resolveRuleSo = ( params: ResolveRuleSoParams -): Promise> => { +): Promise> => { const { savedObjectsClient, id, savedObjectsResolveOptions } = params; return savedObjectsClient.resolve(RULE_SAVED_OBJECT_TYPE, id, savedObjectsResolveOptions); diff --git a/x-pack/plugins/alerting/server/data/rule/methods/update_rule_so.ts b/x-pack/plugins/alerting/server/data/rule/methods/update_rule_so.ts index dfb8b6b5c1e7e..7358cf609d3c3 100644 --- a/x-pack/plugins/alerting/server/data/rule/methods/update_rule_so.ts +++ b/x-pack/plugins/alerting/server/data/rule/methods/update_rule_so.ts @@ -11,21 +11,21 @@ import { SavedObjectsUpdateResponse, } from '@kbn/core/server'; import { RULE_SAVED_OBJECT_TYPE } from '../../../saved_objects'; -import { RuleAttributes } from '../types'; +import { RawRule } from '../../../types'; export interface UpdateRuleSoParams { savedObjectsClient: SavedObjectsClientContract; id: string; - updateRuleAttributes: Partial; - savedObjectsUpdateOptions?: SavedObjectsUpdateOptions; + updateRuleAttributes: Partial; + savedObjectsUpdateOptions?: SavedObjectsUpdateOptions; } export const updateRuleSo = ( params: UpdateRuleSoParams -): Promise> => { +): Promise> => { const { savedObjectsClient, id, updateRuleAttributes, savedObjectsUpdateOptions } = params; - return savedObjectsClient.update( + return savedObjectsClient.update( RULE_SAVED_OBJECT_TYPE, id, updateRuleAttributes, diff --git a/x-pack/plugins/alerting/server/data/rule/types/index.ts b/x-pack/plugins/alerting/server/data/rule/types/index.ts deleted file mode 100644 index a742c1b28224b..0000000000000 --- a/x-pack/plugins/alerting/server/data/rule/types/index.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. - */ - -export type { - RuleNotifyWhenAttributes, - RuleLastRunOutcomeValuesAttributes, - RuleActionAttributes, - RuleExecutionStatusValuesAttributes, - RuleExecutionStatusErrorReasonAttributes, - RuleExecutionStatusWarningReasonAttributes, - RuleSnoozeScheduleAttributes, - RuleExecutionStatusAttributes, - RuleLastRunAttributes, - RuleMonitoringHistoryAttributes, - RuleMonitoringCalculatedMetricsAttributes, - RuleMonitoringLastRunMetricsAttributes, - RuleMonitoringLastRunAttributes, - RuleMonitoringAttributes, - RuleAttributes, -} from './rule_attributes'; diff --git a/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts b/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts deleted file mode 100644 index e057662adbdf5..0000000000000 --- a/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts +++ /dev/null @@ -1,189 +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 { SavedObjectAttributes } from '@kbn/core/server'; -import { IsoWeekday } from '../../../../common'; -import { - ruleNotifyWhenAttributes, - ruleLastRunOutcomeValuesAttributes, - ruleExecutionStatusValuesAttributes, - ruleExecutionStatusErrorReasonAttributes, - ruleExecutionStatusWarningReasonAttributes, -} from '../constants'; -import { RRuleAttributes } from '../../r_rule/types'; -import { AlertsFilterQueryAttributes } from '../../alerts_filter_query/types'; - -export type RuleNotifyWhenAttributes = - (typeof ruleNotifyWhenAttributes)[keyof typeof ruleNotifyWhenAttributes]; -export type RuleLastRunOutcomeValuesAttributes = - (typeof ruleLastRunOutcomeValuesAttributes)[keyof typeof ruleLastRunOutcomeValuesAttributes]; -export type RuleExecutionStatusValuesAttributes = - (typeof ruleExecutionStatusValuesAttributes)[keyof typeof ruleExecutionStatusValuesAttributes]; -export type RuleExecutionStatusErrorReasonAttributes = - (typeof ruleExecutionStatusErrorReasonAttributes)[keyof typeof ruleExecutionStatusErrorReasonAttributes]; -export type RuleExecutionStatusWarningReasonAttributes = - (typeof ruleExecutionStatusWarningReasonAttributes)[keyof typeof ruleExecutionStatusWarningReasonAttributes]; - -export interface RuleSnoozeScheduleAttributes { - duration: number; - rRule: RRuleAttributes; - id?: string; - skipRecurrences?: string[]; -} - -export interface RuleExecutionStatusAttributes { - status: RuleExecutionStatusValuesAttributes; - lastExecutionDate: string; - lastDuration?: number; - error?: { - reason: RuleExecutionStatusErrorReasonAttributes; - message: string; - } | null; - warning?: { - reason: RuleExecutionStatusWarningReasonAttributes; - message: string; - } | null; -} - -export interface RuleLastRunAttributes { - outcome: RuleLastRunOutcomeValuesAttributes; - outcomeOrder?: number; - warning?: - | RuleExecutionStatusErrorReasonAttributes - | RuleExecutionStatusWarningReasonAttributes - | null; - outcomeMsg?: string[] | null; - alertsCount: { - active?: number | null; - new?: number | null; - recovered?: number | null; - ignored?: number | null; - }; -} - -export interface RuleMonitoringHistoryAttributes { - success: boolean; - timestamp: number; - duration?: number; - outcome?: RuleLastRunAttributes; -} - -export interface RuleMonitoringCalculatedMetricsAttributes { - p50?: number; - p95?: number; - p99?: number; - success_ratio: number; -} - -export interface RuleMonitoringLastRunMetricsAttributes { - duration?: number; - total_search_duration_ms?: number | null; - total_indexing_duration_ms?: number | null; - total_alerts_detected?: number | null; - total_alerts_created?: number | null; - gap_duration_s?: number | null; -} - -export interface RuleMonitoringLastRunAttributes { - timestamp: string; - metrics: RuleMonitoringLastRunMetricsAttributes; -} - -export interface RuleMonitoringAttributes { - run: { - history: RuleMonitoringHistoryAttributes[]; - calculated_metrics: RuleMonitoringCalculatedMetricsAttributes; - last_run: RuleMonitoringLastRunAttributes; - }; -} - -interface IntervaleScheduleAttributes extends SavedObjectAttributes { - interval: string; -} - -interface AlertsFilterTimeFrameAttributes { - days: IsoWeekday[]; - timezone: string; - hours: { - start: string; - end: string; - }; -} - -export interface AlertsFilterAttributes { - query?: AlertsFilterQueryAttributes; - timeframe?: AlertsFilterTimeFrameAttributes; -} - -export interface RuleActionAttributes { - uuid: string; - group?: string; - actionRef: string; - actionTypeId: string; - params: SavedObjectAttributes; - frequency?: { - summary: boolean; - notifyWhen: RuleNotifyWhenAttributes; - throttle: string | null; - }; - alertsFilter?: AlertsFilterAttributes; - useAlertDataAsTemplate?: boolean; -} - -type MappedParamsAttributes = SavedObjectAttributes & { - risk_score?: number; - severity?: string; -}; - -interface RuleMetaAttributes { - versionApiKeyLastmodified?: string; -} - -interface AlertDelayAttributes { - active: number; -} - -interface FlappingAttributes { - lookBackWindow: number; - statusChangeThreshold: number; -} - -export interface RuleAttributes { - name: string; - tags: string[]; - enabled: boolean; - alertTypeId: string; - consumer: string; - legacyId: string | null; - schedule: IntervaleScheduleAttributes; - actions: RuleActionAttributes[]; - params: SavedObjectAttributes; - mapped_params?: MappedParamsAttributes; - scheduledTaskId?: string | null; - createdBy: string | null; - updatedBy: string | null; - createdAt: string; - updatedAt: string; - apiKey: string | null; - apiKeyOwner: string | null; - apiKeyCreatedByUser?: boolean | null; - throttle?: string | null; - notifyWhen?: RuleNotifyWhenAttributes | null; - muteAll: boolean; - mutedInstanceIds: string[]; - meta?: RuleMetaAttributes; - executionStatus?: RuleExecutionStatusAttributes; - monitoring?: RuleMonitoringAttributes; - snoozeSchedule?: RuleSnoozeScheduleAttributes[]; - isSnoozedUntil?: string | null; - lastRun?: RuleLastRunAttributes | null; - nextRun?: string | null; - revision: number; - running?: boolean | null; - alertDelay?: AlertDelayAttributes; - flapping?: FlappingAttributes | null; -} diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/archive/archive_maintenance_window_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/archive/archive_maintenance_window_route.test.ts index a1f06715eb4ce..1e8d159c17860 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/archive/archive_maintenance_window_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/archive/archive_maintenance_window_route.test.ts @@ -71,7 +71,6 @@ describe('archiveMaintenanceWindowRoute', () => { archive: true, }); expect(res.ok).toHaveBeenLastCalledWith({ - // @ts-expect-error upgrade typescript v5.1.6 body: rewritePartialMaintenanceBodyRes(mockMaintenanceWindow), }); }); diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/find/find_maintenance_windows_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/find/find_maintenance_windows_route.test.ts index bb1ff6b0e6ae6..0a51513f4a08a 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/find/find_maintenance_windows_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/find/find_maintenance_windows_route.test.ts @@ -70,7 +70,6 @@ describe('findMaintenanceWindowsRoute', () => { expect(maintenanceWindowClient.find).toHaveBeenCalled(); expect(res.ok).toHaveBeenLastCalledWith({ body: { - // @ts-expect-error upgrade typescript v5.1.6 data: mockMaintenanceWindows.data.map((data) => rewriteMaintenanceWindowRes(data)), total: 2, }, diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/finish/finish_maintenance_window_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/finish/finish_maintenance_window_route.test.ts index cfab8e5ede692..aa659a30c9b6c 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/finish/finish_maintenance_window_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/finish/finish_maintenance_window_route.test.ts @@ -61,7 +61,6 @@ describe('finishMaintenanceWindowRoute', () => { expect(maintenanceWindowClient.finish).toHaveBeenLastCalledWith({ id: 'test-id' }); expect(res.ok).toHaveBeenLastCalledWith({ - // @ts-expect-error upgrade typescript v5.1.6 body: rewritePartialMaintenanceBodyRes(mockMaintenanceWindow), }); }); diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get/get_maintenance_window_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get/get_maintenance_window_route.test.ts index f0dd021078314..e6d2eb585a3da 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get/get_maintenance_window_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get/get_maintenance_window_route.test.ts @@ -61,7 +61,6 @@ describe('getMaintenanceWindowRoute', () => { expect(maintenanceWindowClient.get).toHaveBeenLastCalledWith({ id: 'test-id' }); expect(res.ok).toHaveBeenLastCalledWith({ - // @ts-expect-error upgrade typescript v5.1.6 body: rewritePartialMaintenanceBodyRes(mockMaintenanceWindow), }); }); diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get_active/get_active_maintenance_windows_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get_active/get_active_maintenance_windows_route.test.ts index f9b83997d75a6..3ec493ec85136 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get_active/get_active_maintenance_windows_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/get_active/get_active_maintenance_windows_route.test.ts @@ -69,7 +69,6 @@ describe('getActiveMaintenanceWindowsRoute', () => { expect(maintenanceWindowClient.getActiveMaintenanceWindows).toHaveBeenCalled(); expect(res.ok).toHaveBeenLastCalledWith({ - // @ts-expect-error upgrade typescript v5.1.6 body: mockMaintenanceWindows.map((data) => rewriteMaintenanceWindowRes(data)), }); }); diff --git a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/update_maintenance_window_route.test.ts b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/update_maintenance_window_route.test.ts index 37c912b69afcb..194366c8b76d0 100644 --- a/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/update_maintenance_window_route.test.ts +++ b/x-pack/plugins/alerting/server/routes/maintenance_window/apis/update/update_maintenance_window_route.test.ts @@ -82,7 +82,6 @@ describe('updateMaintenanceWindowRoute', () => { }); expect(res.ok).toHaveBeenLastCalledWith({ - // @ts-expect-error upgrade typescript v5.1.6 body: rewritePartialMaintenanceBodyRes(mockMaintenanceWindow), }); }); diff --git a/x-pack/plugins/alerting/server/routes/rule/transforms/transform_rule_to_rule_response/v1.ts b/x-pack/plugins/alerting/server/routes/rule/transforms/transform_rule_to_rule_response/v1.ts index 43e8a4b2b9ea6..c1ef6af4f36b0 100644 --- a/x-pack/plugins/alerting/server/routes/rule/transforms/transform_rule_to_rule_response/v1.ts +++ b/x-pack/plugins/alerting/server/routes/rule/transforms/transform_rule_to_rule_response/v1.ts @@ -30,7 +30,7 @@ export const transformMonitoring = (monitoring: Monitoring): MonitoringV1 => { success: history.success, timestamp: history.timestamp, ...(history.duration !== undefined ? { duration: history.duration } : {}), - ...(history.outcome ? { outcome: transformRuleLastRun(history.outcome) } : {}), + ...(history.outcome !== undefined ? { outcome: history.outcome } : {}), })), calculated_metrics: monitoring.run.calculated_metrics, last_run: monitoring.run.last_run, diff --git a/x-pack/plugins/alerting/server/rules_client/common/inject_references.ts b/x-pack/plugins/alerting/server/rules_client/common/inject_references.ts index 2938c91372325..867a6d7044c39 100644 --- a/x-pack/plugins/alerting/server/rules_client/common/inject_references.ts +++ b/x-pack/plugins/alerting/server/rules_client/common/inject_references.ts @@ -10,7 +10,6 @@ import { omit } from 'lodash'; import { SavedObjectReference, SavedObjectAttributes } from '@kbn/core/server'; import { UntypedNormalizedRuleType } from '../../rule_type_registry'; import { RawRule, RuleTypeParams } from '../../types'; -import { RuleActionAttributes } from '../../data/rule/types'; import { preconfiguredConnectorActionRefPrefix, extractedSavedObjectParamReferenceNamePrefix, @@ -19,7 +18,7 @@ import { export function injectReferencesIntoActions( alertId: string, - actions: RawRule['actions'] | RuleActionAttributes[], + actions: RawRule['actions'], references: SavedObjectReference[] ) { return actions.map((action) => { diff --git a/x-pack/plugins/alerting/server/rules_client/common/retry_if_bulk_edit_conflicts.ts b/x-pack/plugins/alerting/server/rules_client/common/retry_if_bulk_edit_conflicts.ts index 86e3897183849..20f32e483890d 100644 --- a/x-pack/plugins/alerting/server/rules_client/common/retry_if_bulk_edit_conflicts.ts +++ b/x-pack/plugins/alerting/server/rules_client/common/retry_if_bulk_edit_conflicts.ts @@ -12,24 +12,24 @@ import { Logger, SavedObjectsBulkUpdateObject, SavedObjectsUpdateResponse } from import { BulkActionSkipResult } from '../../../common/bulk_edit'; import { convertRuleIdsToKueryNode } from '../../lib'; import { BulkOperationError } from '../types'; -import { RuleAttributes } from '../../data/rule/types'; import { waitBeforeNextRetry, RETRY_IF_CONFLICTS_ATTEMPTS } from './wait_before_next_retry'; import { RULE_SAVED_OBJECT_TYPE } from '../../saved_objects'; +import { RawRule } from '../../types'; // max number of failed SO ids in one retry filter const MaxIdsNumberInRetryFilter = 1000; type BulkEditOperation = (filter: KueryNode | null) => Promise<{ apiKeysToInvalidate: string[]; - rules: Array>; - resultSavedObjects: Array>; + rules: Array>; + resultSavedObjects: Array>; errors: BulkOperationError[]; skipped: BulkActionSkipResult[]; }>; interface ReturnRetry { apiKeysToInvalidate: string[]; - results: Array>; + results: Array>; errors: BulkOperationError[]; skipped: BulkActionSkipResult[]; } @@ -55,7 +55,7 @@ export const retryIfBulkEditConflicts = async ( filter: KueryNode | null, retries: number = RETRY_IF_CONFLICTS_ATTEMPTS, accApiKeysToInvalidate: string[] = [], - accResults: Array> = [], + accResults: Array> = [], accErrors: BulkOperationError[] = [], accSkipped: BulkActionSkipResult[] = [] ): Promise => { diff --git a/x-pack/plugins/alerting/server/rules_client/common/retry_if_bulk_operation_conflicts.ts b/x-pack/plugins/alerting/server/rules_client/common/retry_if_bulk_operation_conflicts.ts index 7a652c5230f47..428f43a0dcfa6 100644 --- a/x-pack/plugins/alerting/server/rules_client/common/retry_if_bulk_operation_conflicts.ts +++ b/x-pack/plugins/alerting/server/rules_client/common/retry_if_bulk_operation_conflicts.ts @@ -13,13 +13,13 @@ import { withSpan } from '@kbn/apm-utils'; import { convertRuleIdsToKueryNode } from '../../lib'; import { BulkOperationError } from '../types'; import { waitBeforeNextRetry, RETRY_IF_CONFLICTS_ATTEMPTS } from './wait_before_next_retry'; -import { RuleAttributes } from '../../data/rule/types'; +import { RawRule } from '../../types'; const MAX_RULES_IDS_IN_RETRY = 1000; interface BulkOperationResult { errors: BulkOperationError[]; - rules: Array>; + rules: Array>; accListSpecificForBulkOperation: string[][]; } @@ -63,7 +63,7 @@ const handler = async ({ filter: KueryNode | null; accListSpecificForBulkOperation?: string[][]; accErrors?: BulkOperationError[]; - accRules?: Array>; + accRules?: Array>; retries?: number; }): Promise => { try { diff --git a/x-pack/plugins/alerting/server/rules_client/common/snooze_utils.ts b/x-pack/plugins/alerting/server/rules_client/common/snooze_utils.ts index dc6ecec0342ab..6e8e08bb3827f 100644 --- a/x-pack/plugins/alerting/server/rules_client/common/snooze_utils.ts +++ b/x-pack/plugins/alerting/server/rules_client/common/snooze_utils.ts @@ -12,13 +12,10 @@ import { RuleParams, RuleSnoozeSchedule as RuleDomainSnoozeSchedule, } from '../../application/rule/types'; -import { RuleAttributes } from '../../data/rule/types'; import { getActiveScheduledSnoozes } from '../../lib/is_rule_snoozed'; +import { RawRule } from '../../types'; -export function getSnoozeAttributes( - attributes: RuleAttributes, - snoozeSchedule: RuleDomainSnoozeSchedule -) { +export function getSnoozeAttributes(attributes: RawRule, snoozeSchedule: RuleDomainSnoozeSchedule) { // If duration is -1, instead mute all const { id: snoozeId, duration } = snoozeSchedule; @@ -70,7 +67,7 @@ export function getBulkSnooze( }; } -export function getUnsnoozeAttributes(attributes: RuleAttributes, scheduleIds?: string[]) { +export function getUnsnoozeAttributes(attributes: RawRule, scheduleIds?: string[]) { const snoozeSchedule = scheduleIds ? clearScheduledSnoozesAttributesById(attributes, scheduleIds) : clearCurrentActiveSnoozeAttributes(attributes); @@ -104,7 +101,7 @@ export function getBulkUnsnooze( }; } -export function clearUnscheduledSnoozeAttributes(attributes: RuleAttributes) { +export function clearUnscheduledSnoozeAttributes(attributes: RawRule) { // Clear any snoozes that have no ID property. These are "simple" snoozes created with the quick UI, e.g. snooze for 3 days starting now return attributes.snoozeSchedule ? attributes.snoozeSchedule.filter((s) => typeof s.id !== 'undefined') @@ -115,7 +112,7 @@ export function clearUnscheduledSnooze(rule: RuleDoma return rule.snoozeSchedule ? rule.snoozeSchedule.filter((s) => typeof s.id !== 'undefined') : []; } -export function clearScheduledSnoozesAttributesById(attributes: RuleAttributes, ids: string[]) { +export function clearScheduledSnoozesAttributesById(attributes: RawRule, ids: string[]) { return attributes.snoozeSchedule ? attributes.snoozeSchedule.filter((s) => !(s.id && ids.includes(s.id))) : []; @@ -128,11 +125,10 @@ export function clearScheduledSnoozesById( return rule.snoozeSchedule ? rule.snoozeSchedule.filter((s) => s.id && !ids.includes(s.id)) : []; } -export function clearCurrentActiveSnoozeAttributes(attributes: RuleAttributes) { +export function clearCurrentActiveSnoozeAttributes(attributes: RawRule) { // First attempt to cancel a simple (unscheduled) snooze const clearedUnscheduledSnoozes = clearUnscheduledSnoozeAttributes(attributes); // Now clear any scheduled snoozes that are currently active and never recur - // @ts-expect-error upgrade typescript v5.1.6 const activeSnoozes = getActiveScheduledSnoozes(attributes); const activeSnoozeIds = activeSnoozes?.map((s) => s.id) ?? []; const recurringSnoozesToSkip: string[] = []; @@ -160,7 +156,6 @@ export function clearCurrentActiveSnooze(rule: RuleDo // First attempt to cancel a simple (unscheduled) snooze const clearedUnscheduledSnoozes = clearUnscheduledSnooze(rule); // Now clear any scheduled snoozes that are currently active and never recur - // @ts-expect-error upgrade typescript v5.1.6 const activeSnoozes = getActiveScheduledSnoozes(rule); const activeSnoozeIds = activeSnoozes?.map((s) => s.id) ?? []; const recurringSnoozesToSkip: string[] = []; diff --git a/x-pack/plugins/alerting/server/rules_client/lib/create_rule_saved_object.ts b/x-pack/plugins/alerting/server/rules_client/lib/create_rule_saved_object.ts index 644ad0626de6a..12a81c742f242 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/create_rule_saved_object.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/create_rule_saved_object.ts @@ -8,7 +8,6 @@ import { SavedObjectReference, SavedObject } from '@kbn/core/server'; import { withSpan } from '@kbn/apm-utils'; import { Rule, RuleWithLegacyId, RawRule, RuleTypeParams } from '../../types'; -import { RuleAttributes } from '../../data/rule/types'; import { bulkMarkApiKeysForInvalidation } from '../../invalidate_pending_api_keys/bulk_mark_api_keys_for_invalidation'; import { ruleAuditEvent, RuleAuditAction } from '../common/audit_events'; import { SavedObjectOptions } from '../types'; @@ -30,7 +29,7 @@ interface CreateRuleSavedObjectParams { interface CreateRuleSavedObjectAttributeParams { intervalInMs: number; - rawRule: RuleAttributes; + rawRule: RawRule; references: SavedObjectReference[]; ruleId: string; options?: SavedObjectOptions; @@ -46,11 +45,11 @@ export async function createRuleSavedObject( context: RulesClientContext, params: CreateRuleSavedObjectAttributeParams -): Promise>; +): Promise>; export async function createRuleSavedObject( context: RulesClientContext, params: CreateRuleSavedObjectParams | CreateRuleSavedObjectAttributeParams -): Promise | RuleWithLegacyId | SavedObject> { +): Promise | RuleWithLegacyId | SavedObject> { const { intervalInMs, rawRule, references, ruleId, options, returnRuleAttributes } = params; context.auditLogger?.log( @@ -61,14 +60,13 @@ export async function createRuleSavedObject; try { - createdAlert = (await withSpan( + createdAlert = await withSpan( { name: 'unsecuredSavedObjectsClient.create', type: 'rules' }, () => createRuleSo({ - ruleAttributes: updateMeta(context, rawRule as RawRule) as RuleAttributes, + ruleAttributes: updateMeta(context, rawRule), savedObjectsClient: context.unsecuredSavedObjectsClient, savedObjectsCreateOptions: { ...options, @@ -76,7 +74,7 @@ export async function createRuleSavedObject; + ); } catch (e) { // Avoid unused API key await bulkMarkApiKeysForInvalidation( @@ -138,7 +136,7 @@ export async function createRuleSavedObject; + return createdAlert as SavedObject; } return getAlertFromRaw({ diff --git a/x-pack/plugins/alerting/server/rules_client/lib/get_rule_saved_object.ts b/x-pack/plugins/alerting/server/rules_client/lib/get_rule_saved_object.ts index 18af10e677f3a..81952cfc938e1 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/get_rule_saved_object.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/get_rule_saved_object.ts @@ -10,8 +10,8 @@ import { withSpan } from '@kbn/apm-utils'; import { ruleAuditEvent, RuleAuditAction } from '../common/audit_events'; import { RulesClientContext } from '../types'; import { getRuleSo } from '../../data/rule'; -import { RuleAttributes } from '../../data/rule/types'; import { RULE_SAVED_OBJECT_TYPE } from '../../saved_objects'; +import { RawRule } from '../../types'; interface GetRuleSavedObjectParams { ruleId: string; @@ -20,7 +20,7 @@ interface GetRuleSavedObjectParams { export async function getRuleSavedObject( context: RulesClientContext, params: GetRuleSavedObjectParams -): Promise> { +): Promise> { const { ruleId } = params; context.auditLogger?.log( diff --git a/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.test.ts b/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.test.ts index 7c650160100bd..766bbdf267652 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.test.ts @@ -8,13 +8,12 @@ import { mockedDateString } from '../tests/lib'; import { incrementRevision } from './increment_revision'; import { SavedObject } from '@kbn/core/server'; -import { RuleTypeParams } from '../../types'; +import { RawRule, RuleTypeParams } from '../../types'; import { RULE_SAVED_OBJECT_TYPE } from '../../saved_objects'; import { UpdateRuleData } from '../../application/rule/methods/update'; -import { RuleAttributes } from '../../data/rule/types'; describe('incrementRevision', () => { - const currentRule: SavedObject = { + const currentRule: SavedObject = { id: '1', type: RULE_SAVED_OBJECT_TYPE, attributes: { diff --git a/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.ts b/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.ts index dd6defdb3625b..e26d719d59127 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/increment_revision.ts @@ -6,17 +6,16 @@ */ import { get, isEqual } from 'lodash'; -import { RuleTypeParams } from '../../types'; +import { RuleTypeParams, RawRule } from '../../types'; import { fieldsToExcludeFromRevisionUpdates } from '..'; import { UpdateRuleData } from '../../application/rule/methods/update'; -import { RuleAttributes } from '../../data/rule/types'; export function incrementRevision({ originalRule, updateRuleData, updatedParams, }: { - originalRule: RuleAttributes; + originalRule: RawRule; updateRuleData: UpdateRuleData; updatedParams: RuleTypeParams; }): number { diff --git a/x-pack/plugins/alerting/server/rules_client/lib/resolve_rule_saved_object.ts b/x-pack/plugins/alerting/server/rules_client/lib/resolve_rule_saved_object.ts index f133aea9035a0..a32f86926c400 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/resolve_rule_saved_object.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/resolve_rule_saved_object.ts @@ -10,8 +10,8 @@ import { withSpan } from '@kbn/apm-utils'; import { ruleAuditEvent, RuleAuditAction } from '../common/audit_events'; import { RulesClientContext } from '../types'; import { resolveRuleSo } from '../../data/rule'; -import { RuleAttributes } from '../../data/rule/types'; import { RULE_SAVED_OBJECT_TYPE } from '../../saved_objects'; +import { RawRule } from '../../types'; interface ResolveRuleSavedObjectParams { ruleId: string; @@ -20,7 +20,7 @@ interface ResolveRuleSavedObjectParams { export async function resolveRuleSavedObject( context: RulesClientContext, params: ResolveRuleSavedObjectParams -): Promise> { +): Promise> { const { ruleId } = params; context.auditLogger?.log( diff --git a/x-pack/plugins/alerting/server/rules_client/lib/untrack_rule_alerts.ts b/x-pack/plugins/alerting/server/rules_client/lib/untrack_rule_alerts.ts index be168b6d9f02e..0e2063a3738ad 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/untrack_rule_alerts.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/untrack_rule_alerts.ts @@ -8,19 +8,18 @@ import { mapValues } from 'lodash'; import { SAVED_OBJECT_REL_PRIMARY } from '@kbn/event-log-plugin/server'; import { withSpan } from '@kbn/apm-utils'; -import { SanitizedRule, RawAlertInstance as RawAlert } from '../../types'; +import { SanitizedRule, RawAlertInstance as RawAlert, RawRule } from '../../types'; import { taskInstanceToAlertTaskInstance } from '../../task_runner/alert_task_instance'; import { Alert } from '../../alert'; import { EVENT_LOG_ACTIONS } from '../../plugin'; import { createAlertEventLogRecordObject } from '../../lib/create_alert_event_log_record_object'; import { RulesClientContext } from '../types'; -import { RuleAttributes } from '../../data/rule/types'; import { RULE_SAVED_OBJECT_TYPE } from '../../saved_objects'; export const untrackRuleAlerts = async ( context: RulesClientContext, id: string, - attributes: RuleAttributes + attributes: RawRule ) => { return withSpan({ name: 'untrackRuleAlerts', type: 'rules' }, async () => { if (!context.eventLogger || !attributes.scheduledTaskId) return; diff --git a/x-pack/plugins/alerting/server/rules_client/lib/update_meta.ts b/x-pack/plugins/alerting/server/rules_client/lib/update_meta.ts index 635778b5a5a1a..1f87dd0e2d6ee 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/update_meta.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/update_meta.ts @@ -16,8 +16,13 @@ export function updateMeta>( alertAttributes: T ): T { if (Object.hasOwn(alertAttributes, 'apiKey') || Object.hasOwn(alertAttributes, 'apiKeyOwner')) { - alertAttributes.meta = alertAttributes.meta ?? {}; - alertAttributes.meta.versionApiKeyLastmodified = context.kibanaVersion; + return { + ...alertAttributes, + meta: { + ...(alertAttributes.meta ?? {}), + versionApiKeyLastmodified: context.kibanaVersion, + }, + }; } return alertAttributes; } diff --git a/x-pack/plugins/alerting/server/rules_client/lib/update_meta_attributes.ts b/x-pack/plugins/alerting/server/rules_client/lib/update_meta_attributes.ts index 9570539b24046..f3c5ed48839ce 100644 --- a/x-pack/plugins/alerting/server/rules_client/lib/update_meta_attributes.ts +++ b/x-pack/plugins/alerting/server/rules_client/lib/update_meta_attributes.ts @@ -5,10 +5,10 @@ * 2.0. */ -import { RuleAttributes } from '../../data/rule/types'; +import { RawRule } from '../../types'; import { RulesClientContext } from '../types'; -export function updateMetaAttributes>( +export function updateMetaAttributes>( context: RulesClientContext, alertAttributes: T ): T { diff --git a/x-pack/plugins/alerting/server/saved_objects/model_versions/rule_model_versions.ts b/x-pack/plugins/alerting/server/saved_objects/model_versions/rule_model_versions.ts index 43f477f1530d2..33b1bfd315769 100644 --- a/x-pack/plugins/alerting/server/saved_objects/model_versions/rule_model_versions.ts +++ b/x-pack/plugins/alerting/server/saved_objects/model_versions/rule_model_versions.ts @@ -6,7 +6,7 @@ */ import { SavedObjectsModelVersionMap } from '@kbn/core-saved-objects-server'; -import { rawRuleSchemaV1, rawRuleSchemaV2 } from '../schemas/raw_rule'; +import { rawRuleSchemaV1, rawRuleSchemaV2, rawRuleSchemaV3 } from '../schemas/raw_rule'; export const ruleModelVersions: SavedObjectsModelVersionMap = { '1': { @@ -23,4 +23,11 @@ export const ruleModelVersions: SavedObjectsModelVersionMap = { create: rawRuleSchemaV2, }, }, + '3': { + changes: [], + schemas: { + forwardCompatibility: rawRuleSchemaV3.extends({}, { unknowns: 'ignore' }), + create: rawRuleSchemaV3, + }, + }, }; diff --git a/x-pack/plugins/alerting/server/saved_objects/partially_update_rule.test.ts b/x-pack/plugins/alerting/server/saved_objects/partially_update_rule.test.ts index 5e53834bf73d8..1bbf7aa448fd4 100644 --- a/x-pack/plugins/alerting/server/saved_objects/partially_update_rule.test.ts +++ b/x-pack/plugins/alerting/server/saved_objects/partially_update_rule.test.ts @@ -228,7 +228,7 @@ const DefaultAttributes = { const ExtraneousAttributes = { ...DefaultAttributes, foo: 'bar' }; -const DefaultAttributesForEsUpdate = { +const DefaultAttributesForEsUpdate: PartiallyUpdateableRuleAttributes = { running: false, executionStatus: { status: 'active' as RuleExecutionStatuses, @@ -247,7 +247,7 @@ const DefaultAttributesForEsUpdate = { success: true, timestamp: 1640991880000, duration: 12, - outcome: 'success', + outcome: 'succeeded', }, ], last_run: { diff --git a/x-pack/plugins/alerting/server/saved_objects/partially_update_rule.ts b/x-pack/plugins/alerting/server/saved_objects/partially_update_rule.ts index 24af1da5af62b..4ef0779707536 100644 --- a/x-pack/plugins/alerting/server/saved_objects/partially_update_rule.ts +++ b/x-pack/plugins/alerting/server/saved_objects/partially_update_rule.ts @@ -22,13 +22,9 @@ import { RuleAttributesNotPartiallyUpdatable, RULE_SAVED_OBJECT_TYPE, } from '.'; -import { RuleAttributes } from '../data/rule/types'; -// We have calling code that references both RawRule and RuleAttributes, -// so we need to support both of these types (they are effectively the same) export type PartiallyUpdateableRuleAttributes = Partial< - | Omit - | Omit + Omit >; interface PartiallyUpdateRuleSavedObjectOptions { @@ -54,7 +50,7 @@ export async function partiallyUpdateRule( ...RuleAttributesToEncrypt, ...RuleAttributesIncludedInAAD, ]); - const updateOptions: SavedObjectsUpdateOptions = pick( + const updateOptions: SavedObjectsUpdateOptions = pick( options, 'namespace', 'version', diff --git a/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/index.ts b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/index.ts index f770a5418cde7..c38a80601dc48 100644 --- a/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/index.ts +++ b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/index.ts @@ -5,5 +5,8 @@ * 2.0. */ +export * from './latest'; + export { rawRuleSchema as rawRuleSchemaV1 } from './v1'; export { rawRuleSchema as rawRuleSchemaV2 } from './v2'; +export { rawRuleSchema as rawRuleSchemaV3 } from './v3'; diff --git a/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/latest.ts b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/latest.ts new file mode 100644 index 0000000000000..dded0a98f6d53 --- /dev/null +++ b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/latest.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. + */ +import { TypeOf } from '@kbn/config-schema'; + +import { + rawRuleExecutionStatusSchema, + rawRuleActionSchema, + rawRuleAlertsFilterSchema, + rawRuleLastRunSchema, + rawRuleMonitoringSchema, + rawRuleSchema, +} from './v3'; + +type Mutable = { -readonly [P in keyof T]: T[P] extends object ? Mutable : T[P] }; + +export type RawRuleAction = Mutable>; +export type RawRuleExecutionStatus = Mutable>; +export type RawRuleAlertsFilter = Mutable>; +export type RawRuleLastRun = Mutable>; +export type RawRuleMonitoring = Mutable>; +export type RawRule = Mutable>; diff --git a/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/v2.ts b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/v2.ts index 4474c47e9e770..51a4701caaf4a 100644 --- a/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/v2.ts +++ b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/v2.ts @@ -7,6 +7,7 @@ import { schema } from '@kbn/config-schema'; import { rawRuleSchema as rawRuleSchemaV1 } from './v1'; +export * from './v1'; export const flappingSchema = schema.object({ lookBackWindow: schema.number(), diff --git a/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/v3.ts b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/v3.ts new file mode 100644 index 0000000000000..2e07c73e1537a --- /dev/null +++ b/x-pack/plugins/alerting/server/saved_objects/schemas/raw_rule/v3.ts @@ -0,0 +1,299 @@ +/* + * 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 { schema } from '@kbn/config-schema'; +import { FilterStateStore } from '@kbn/es-query'; +import { + RuleExecutionStatusErrorReasons, + RuleExecutionStatusWarningReasons, +} from '@kbn/alerting-types'; +import { ruleLastRunOutcomeValues } from '../../../application/rule/constants'; + +export * from './v2'; + +export const executionStatusWarningReason = schema.oneOf([ + schema.literal(RuleExecutionStatusWarningReasons.MAX_EXECUTABLE_ACTIONS), // change + schema.literal(RuleExecutionStatusWarningReasons.MAX_ALERTS), // change + schema.literal(RuleExecutionStatusWarningReasons.MAX_QUEUED_ACTIONS), // change + schema.literal(RuleExecutionStatusWarningReasons.EXECUTION), // change +]); + +export const executionStatusErrorReason = schema.oneOf([ + schema.literal(RuleExecutionStatusErrorReasons.Read), // change + schema.literal(RuleExecutionStatusErrorReasons.Decrypt), // change + schema.literal(RuleExecutionStatusErrorReasons.Execute), // change + schema.literal(RuleExecutionStatusErrorReasons.Unknown), // change + schema.literal(RuleExecutionStatusErrorReasons.License), // change + schema.literal(RuleExecutionStatusErrorReasons.Timeout), // change + schema.literal(RuleExecutionStatusErrorReasons.Disabled), // change + schema.literal(RuleExecutionStatusErrorReasons.Validate), // change +]); + +export const rawRuleExecutionStatusSchema = schema.object({ + status: schema.oneOf([ + schema.literal('ok'), + schema.literal('active'), + schema.literal('error'), + schema.literal('pending'), + schema.literal('unknown'), + schema.literal('warning'), + ]), + lastExecutionDate: schema.string(), + lastDuration: schema.maybe(schema.number()), + error: schema.nullable( + schema.object({ + reason: executionStatusErrorReason, + message: schema.string(), + }) + ), + warning: schema.nullable( + schema.object({ + reason: executionStatusWarningReason, + message: schema.string(), + }) + ), +}); + +export const ISOWeekdaysSchema = schema.oneOf([ + schema.literal(1), + schema.literal(2), + schema.literal(3), + schema.literal(4), + schema.literal(5), + schema.literal(6), + schema.literal(7), +]); + +export const rRuleSchema = schema.object({ + dtstart: schema.string(), + tzid: schema.string(), + freq: schema.maybe( + schema.oneOf([ + schema.literal(0), + schema.literal(1), + schema.literal(2), + schema.literal(3), + schema.literal(4), + schema.literal(5), + schema.literal(6), + ]) + ), + until: schema.maybe(schema.string()), + count: schema.maybe(schema.number()), + interval: schema.maybe(schema.number()), + wkst: schema.maybe( + schema.oneOf([ + schema.literal('MO'), + schema.literal('TU'), + schema.literal('WE'), + schema.literal('TH'), + schema.literal('FR'), + schema.literal('SA'), + schema.literal('SU'), + ]) + ), + byweekday: schema.maybe( + schema.nullable(schema.arrayOf(schema.oneOf([schema.string(), schema.number()]))) // change + ), + bymonth: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), // change + bysetpos: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), // change + bymonthday: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), // change + byyearday: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), // change + byweekno: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), // change + byhour: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), // change + byminute: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), // change + bysecond: schema.maybe(schema.nullable(schema.arrayOf(schema.number()))), // change +}); + +export const outcome = schema.oneOf([ + schema.literal(ruleLastRunOutcomeValues.SUCCEEDED), // change + schema.literal(ruleLastRunOutcomeValues.WARNING), // change + schema.literal(ruleLastRunOutcomeValues.FAILED), // change +]); + +export const rawRuleLastRunSchema = schema.object({ + outcome, + outcomeOrder: schema.maybe(schema.number()), + alertsCount: schema.object({ + new: schema.maybe(schema.nullable(schema.number())), + active: schema.maybe(schema.nullable(schema.number())), + recovered: schema.maybe(schema.nullable(schema.number())), + ignored: schema.maybe(schema.nullable(schema.number())), + }), + outcomeMsg: schema.maybe(schema.nullable(schema.arrayOf(schema.string()))), + warning: schema.maybe( + schema.nullable(schema.oneOf([executionStatusErrorReason, executionStatusWarningReason])) + ), +}); + +export const rawRuleMonitoringSchema = schema.object({ + run: schema.object({ + history: schema.arrayOf( + schema.object({ + success: schema.boolean(), + timestamp: schema.number(), + duration: schema.maybe(schema.number()), + outcome: schema.maybe(outcome), + }) + ), + calculated_metrics: schema.object({ + p50: schema.maybe(schema.number()), + p95: schema.maybe(schema.number()), + p99: schema.maybe(schema.number()), + success_ratio: schema.number(), + }), + last_run: schema.object({ + timestamp: schema.string(), + metrics: schema.object({ + duration: schema.maybe(schema.number()), + total_search_duration_ms: schema.maybe(schema.nullable(schema.number())), + total_indexing_duration_ms: schema.maybe(schema.nullable(schema.number())), + total_alerts_detected: schema.maybe(schema.nullable(schema.number())), + total_alerts_created: schema.maybe(schema.nullable(schema.number())), + gap_duration_s: schema.maybe(schema.nullable(schema.number())), + }), + }), + }), +}); + +export const rawRuleAlertsFilterSchema = schema.object({ + query: schema.maybe( + schema.object({ + kql: schema.string(), + filters: schema.arrayOf( + schema.object({ + query: schema.maybe(schema.recordOf(schema.string(), schema.any())), + meta: schema.object({ + alias: schema.maybe(schema.nullable(schema.string())), + disabled: schema.maybe(schema.boolean()), + negate: schema.maybe(schema.boolean()), + controlledBy: schema.maybe(schema.string()), + group: schema.maybe(schema.string()), + index: schema.maybe(schema.string()), + isMultiIndex: schema.maybe(schema.boolean()), + type: schema.maybe(schema.string()), + key: schema.maybe(schema.string()), + params: schema.maybe(schema.any()), + value: schema.maybe(schema.string()), + field: schema.maybe(schema.string()), + relation: schema.maybe(schema.oneOf([schema.literal('OR'), schema.literal('AND')])), + }), + $state: schema.maybe( + schema.object({ + store: schema.oneOf([ + schema.literal(FilterStateStore.APP_STATE), // change + schema.literal(FilterStateStore.GLOBAL_STATE), // change + ]), + }) + ), + }) + ), + dsl: schema.string(), // change + }) + ), + timeframe: schema.maybe( + schema.object({ + days: schema.arrayOf(ISOWeekdaysSchema), + hours: schema.object({ + start: schema.string(), + end: schema.string(), + }), + timezone: schema.string(), + }) + ), +}); + +export const rawRuleActionSchema = schema.object({ + uuid: schema.string(), // change + group: schema.maybe(schema.string()), + actionRef: schema.string(), + actionTypeId: schema.string(), + params: schema.recordOf(schema.string(), schema.any()), + frequency: schema.maybe( + schema.object({ + summary: schema.boolean(), + notifyWhen: schema.oneOf([ + schema.literal('onActionGroupChange'), + schema.literal('onActiveAlert'), + schema.literal('onThrottleInterval'), + ]), + throttle: schema.nullable(schema.string()), + }) + ), + alertsFilter: schema.maybe(rawRuleAlertsFilterSchema), + useAlertDataForTemplate: schema.maybe(schema.boolean()), +}); + +export const alertDelaySchema = schema.object({ + active: schema.number(), +}); + +export const flappingSchema = schema.object({ + lookBackWindow: schema.number(), + statusChangeThreshold: schema.number(), +}); + +export const rawRuleSchema = schema.object({ + name: schema.string(), + enabled: schema.boolean(), + consumer: schema.string(), + tags: schema.arrayOf(schema.string()), + alertTypeId: schema.string(), + apiKeyOwner: schema.nullable(schema.string()), + apiKey: schema.nullable(schema.string()), + apiKeyCreatedByUser: schema.maybe(schema.nullable(schema.boolean())), + createdBy: schema.nullable(schema.string()), + updatedBy: schema.nullable(schema.string()), + updatedAt: schema.string(), + createdAt: schema.string(), + muteAll: schema.boolean(), + mutedInstanceIds: schema.arrayOf(schema.string()), + throttle: schema.maybe(schema.nullable(schema.string())), + revision: schema.number(), + running: schema.maybe(schema.nullable(schema.boolean())), + schedule: schema.object({ + interval: schema.string(), + }), + legacyId: schema.nullable(schema.string()), + scheduledTaskId: schema.maybe(schema.nullable(schema.string())), + isSnoozedUntil: schema.maybe(schema.nullable(schema.string())), + snoozeSchedule: schema.maybe( + schema.arrayOf( + schema.object({ + duration: schema.number(), + rRule: rRuleSchema, + id: schema.maybe(schema.string()), + skipRecurrences: schema.maybe(schema.arrayOf(schema.string())), + }) + ) + ), + meta: schema.maybe(schema.object({ versionApiKeyLastmodified: schema.maybe(schema.string()) })), + actions: schema.arrayOf(rawRuleActionSchema), + executionStatus: rawRuleExecutionStatusSchema, + notifyWhen: schema.maybe( + schema.nullable( + schema.oneOf([ + schema.literal('onActionGroupChange'), + schema.literal('onActiveAlert'), + schema.literal('onThrottleInterval'), + ]) + ) + ), + monitoring: schema.maybe(rawRuleMonitoringSchema), + lastRun: schema.maybe(schema.nullable(rawRuleLastRunSchema)), + nextRun: schema.maybe(schema.nullable(schema.string())), + mapped_params: schema.maybe( + schema.object({ + risk_score: schema.maybe(schema.number()), + severity: schema.maybe(schema.string()), + }) + ), + params: schema.recordOf(schema.string(), schema.maybe(schema.any())), + typeVersion: schema.maybe(schema.number()), + alertDelay: schema.maybe(alertDelaySchema), + flapping: schema.maybe(schema.nullable(flappingSchema)), // carry over from v2 +}); diff --git a/x-pack/plugins/alerting/server/types.ts b/x-pack/plugins/alerting/server/types.ts index 656f567219c1d..b660d348b9e06 100644 --- a/x-pack/plugins/alerting/server/types.ts +++ b/x-pack/plugins/alerting/server/types.ts @@ -26,7 +26,6 @@ import type { PublicMethodsOf } from '@kbn/utility-types'; import { SharePluginStart } from '@kbn/share-plugin/server'; import type { DefaultAlert, FieldMap } from '@kbn/alerts-as-data-utils'; import { Alert } from '@kbn/alerts-as-data-utils'; -import { Filter } from '@kbn/es-query'; import { ActionsApiRequestHandlerContext } from '@kbn/actions-plugin/server'; import { AlertsHealth } from '@kbn/alerting-types'; import { RuleTypeRegistry as OrigruleTypeRegistry } from './rule_type_registry'; @@ -43,28 +42,14 @@ import { Rule, RuleTypeParams, RuleTypeState, - RuleActionParams, - RuleExecutionStatuses, - RuleExecutionStatusErrorReasons, - RuleExecutionStatusWarningReasons, - RuleNotifyWhenType, ActionGroup, AlertInstanceContext, AlertInstanceState, WithoutReservedActionGroups, ActionVariable, SanitizedRuleConfig, - RuleMonitoring, - MappedParams, - RuleSnooze, - IntervalSchedule, - RuleLastRun, SanitizedRule, - AlertsFilter, - AlertsFilterTimeframe, RuleAlertData, - AlertDelay, - Flapping, } from '../common'; import { PublicAlertFactory } from './alert/create_alert_factory'; import { RulesSettingsFlappingProperties } from '../common/rules_settings'; @@ -426,87 +411,13 @@ export type PublicRuleMonitoringService = PublicMetricsSetters; export type PublicRuleResultService = PublicLastRunSetters; -export interface RawRuleLastRun extends SavedObjectAttributes, RuleLastRun {} -export interface RawRuleMonitoring extends SavedObjectAttributes, RuleMonitoring {} - -export interface RawRuleAlertsFilter extends AlertsFilter { - query?: { - kql: string; - filters: Filter[]; - dsl: string; - }; - timeframe?: AlertsFilterTimeframe; -} - -export interface RawRuleAction extends SavedObjectAttributes { - uuid: string; - group?: string; - actionRef: string; - actionTypeId: string; - params: RuleActionParams; - frequency?: { - summary: boolean; - notifyWhen: RuleNotifyWhenType; - throttle: string | null; - }; - alertsFilter?: RawRuleAlertsFilter; - useAlertDataAsTemplate?: boolean; -} - -// note that the `error` property is "null-able", as we're doing a partial -// update on the rule when we update this data, but need to ensure we -// delete any previous error if the current status has no error -export interface RawRuleExecutionStatus extends SavedObjectAttributes { - status: RuleExecutionStatuses; - lastExecutionDate: string; - lastDuration?: number; - error: null | { - reason: RuleExecutionStatusErrorReasons; - message: string; - }; - warning: null | { - reason: RuleExecutionStatusWarningReasons; - message: string; - }; -} - -/** - * @deprecated in favor of Rule - */ -export interface RawRule extends SavedObjectAttributes { - enabled: boolean; - name: string; - tags: string[]; - alertTypeId: string; // this cannot be renamed since it is in the saved object - consumer: string; - legacyId: string | null; - schedule: IntervalSchedule; - actions: RawRuleAction[]; - params: SavedObjectAttributes; - mapped_params?: MappedParams; - scheduledTaskId?: string | null; - createdBy: string | null; - updatedBy: string | null; - createdAt: string; - updatedAt: string; - apiKey: string | null; - apiKeyOwner: string | null; - apiKeyCreatedByUser?: boolean | null; - throttle?: string | null; - notifyWhen?: RuleNotifyWhenType | null; - muteAll: boolean; - mutedInstanceIds: string[]; - meta?: RuleMeta; - executionStatus: RawRuleExecutionStatus; - monitoring?: RawRuleMonitoring; - snoozeSchedule?: RuleSnooze; // Remove ? when this parameter is made available in the public API - isSnoozedUntil?: string | null; - lastRun?: RawRuleLastRun | null; - nextRun?: string | null; - revision: number; - running?: boolean | null; - alertDelay?: AlertDelay; - flapping?: Flapping | null; -} +export type { + RawRule, + RawRuleAction, + RawRuleExecutionStatus, + RawRuleAlertsFilter, + RawRuleLastRun, + RawRuleMonitoring, +} from './saved_objects/schemas/raw_rule'; export type { DataStreamAdapter } from './alerts_service/lib/data_stream_adapter'; From 1066064c9869a2513eed965cc0d2859e51568b6f Mon Sep 17 00:00:00 2001 From: Ryan Keairns Date: Mon, 28 Oct 2024 09:24:23 -0700 Subject: [PATCH 086/135] Improve header button spacing (#197896) Closes #197873 ## Summary - Fix spacing between 'Give feedback' and AI button. - While in the neighborhood, I noticed the search button had some extra padding, so I fixed that quick too. - Lastly, I pushed the project switcher to the far right. This is only used for local development of Serverless and was otherwise appearing between production buttons. ### Before ### After ## QA To test, you'll need to run this in serverless mode where the 'Give feedback' button appears. You can force it on by setting the following line equal to `true`. https://github.com/elastic/kibana/blob/ae9c0d385015f3068a04af46678e18e2f00b519a/src/plugins/guided_onboarding/public/plugin.tsx#L50 Co-authored-by: Elastic Machine --- .../core-chrome-browser-internal/src/ui/project/header.tsx | 6 +++++- .../global_search_bar/public/components/search_bar.tsx | 5 +++-- x-pack/plugins/serverless/public/plugin.tsx | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx index 1f282db34a0f5..e63a27c1d44ed 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx @@ -306,7 +306,11 @@ export const ProjectHeader = ({ /> - + diff --git a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx index de9bb85f7a8a3..c8ac154b34c9f 100644 --- a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx +++ b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx @@ -325,11 +325,12 @@ export const SearchBar: FC = (opts) => { buttonRef={visibilityButtonRef} color="text" data-test-subj="nav-search-reveal" - iconType="search" onClick={() => { setIsVisible(true); }} - /> + > + + ); } diff --git a/x-pack/plugins/serverless/public/plugin.tsx b/x-pack/plugins/serverless/public/plugin.tsx index 82578123452e7..dbb75788c105b 100644 --- a/x-pack/plugins/serverless/public/plugin.tsx +++ b/x-pack/plugins/serverless/public/plugin.tsx @@ -61,7 +61,7 @@ export class ServerlessPlugin const { currentType } = developer.projectSwitcher; core.chrome.navControls.registerRight({ - order: 500, + order: 5000, mount: (target) => this.mountProjectSwitcher(target, core, currentType), }); } From 6a6d1f3b6e41f8e1740d3bba4f5537feddbbbb24 Mon Sep 17 00:00:00 2001 From: Vitalii Dmyterko <92328789+vitaliidm@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:35:36 +0000 Subject: [PATCH 087/135] [Security Solution][Detection Engine] fixes preview logs issue when switching between rules (#197098) ## Summary - addresses https://github.com/elastic/kibana/issues/196616 --- .../rule_creation_ui/components/rule_preview/index.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/rule_preview/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/rule_preview/index.tsx index f941cad91d3a4..7d51009dccda3 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/rule_preview/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui/components/rule_preview/index.tsx @@ -108,6 +108,8 @@ const RulePreviewComponent: React.FC = ({ const [isDateRangeInvalid, setIsDateRangeInvalid] = useState(false); + const isLoggedRequestsSupported = RULE_TYPES_SUPPORTING_LOGGED_REQUESTS.includes(ruleType); + useEffect(() => { const { start, end } = refreshedTimeframe(startDate, endDate); setTimeframeStart(start); @@ -194,7 +196,7 @@ const RulePreviewComponent: React.FC = ({ interval: scheduleRuleData.interval, lookback: scheduleRuleData.from, }, - enableLoggedRequests: showElasticsearchRequests, + enableLoggedRequests: showElasticsearchRequests && isLoggedRequestsSupported, }); setIsRefreshing(true); }, [ @@ -205,6 +207,7 @@ const RulePreviewComponent: React.FC = ({ startDate, startTransaction, showElasticsearchRequests, + isLoggedRequestsSupported, ]); const isDirty = useMemo( @@ -279,7 +282,7 @@ const RulePreviewComponent: React.FC = ({ - {RULE_TYPES_SUPPORTING_LOGGED_REQUESTS.includes(ruleType) ? ( + {isLoggedRequestsSupported ? ( @@ -312,7 +315,7 @@ const RulePreviewComponent: React.FC = ({ logs={logs} hasNoiseWarning={hasNoiseWarning} isAborted={isAborted} - showElasticsearchRequests={showElasticsearchRequests} + showElasticsearchRequests={showElasticsearchRequests && isLoggedRequestsSupported} />

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 z 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

) : null} + {fullScreenMode && ( + + + + )} {panelCount === 0 && }
{
); }; - -// This fullscreen button HOC separates fullscreen button and dashboard content to reduce rerenders -// because ExitFullScreenButton sets isFullscreenMode to false on unmount while rerendering. -// This specifically fixed maximizing/minimizing panels without exiting fullscreen mode. -const WithFullScreenButton = ({ children }: { children: JSX.Element }) => { - const dashboardApi = useDashboardApi(); - - const isFullScreenMode = useStateFromPublishingSubject(dashboardApi.fullScreenMode$); - - return ( - <> - {children} - {isFullScreenMode && ( - - dashboardApi.setFullScreenMode(false)} - toggleChrome={!dashboardApi.isEmbeddedExternally} - /> - - )} - - ); -}; - -export const DashboardViewport = () => ( - - - -); From 23b8bef0731083840e68a9893a2e0574824d51a3 Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 28 Oct 2024 12:24:00 -0500 Subject: [PATCH 093/135] [ci] Run linting before tests (#197310) Linting is a frequent source of build failures. By increasing the cpu count we can run this check before starting our highly-parallel tests without impacting total build time. --- .buildkite/pipelines/on_merge.yml | 102 ++++++++++++------ .../pipelines/pull_request/apm_cypress.yml | 2 + .buildkite/pipelines/pull_request/base.yml | 48 ++++----- .../pipelines/pull_request/deploy_cloud.yml | 2 + .../pull_request/exploratory_view_plugin.yml | 2 + .buildkite/pipelines/pull_request/fips.yml | 2 + .../pipelines/pull_request/fleet_cypress.yml | 2 + .../pull_request/inventory_cypress.yml | 2 + .../pipelines/pull_request/kbn_handlebars.yml | 2 + .../observability_onboarding_cypress.yml | 2 + .../pull_request/profiling_cypress.yml | 2 + .../pipelines/pull_request/response_ops.yml | 2 + .../pull_request/response_ops_cases.yml | 2 + .../security_solution/ai_assistant.yml | 4 + .../cloud_security_posture.yml | 4 + .../security_solution/cypress_burn.yml | 8 ++ .../security_solution/defend_workflows.yml | 4 + .../security_solution/detection_engine.yml | 8 ++ .../security_solution/entity_analytics.yml | 4 + .../security_solution/explore.yml | 4 + .../security_solution/investigations.yml | 4 + .../security_solution/osquery_cypress.yml | 4 + .../security_solution/playwright.yml | 4 + .../security_solution/rule_management.yml | 8 ++ .../pipelines/pull_request/slo_plugin_e2e.yml | 2 + .../pull_request/synthetics_plugin.yml | 2 + .../pipelines/pull_request/uptime_plugin.yml | 2 + .../pipelines/pull_request/ux_plugin_e2e.yml | 2 + .../scripts/steps/checks/quick_checks.txt | 1 - .buildkite/scripts/steps/lint.sh | 4 +- 30 files changed, 184 insertions(+), 57 deletions(-) diff --git a/.buildkite/pipelines/on_merge.yml b/.buildkite/pipelines/on_merge.yml index 64067ec52a4d3..c6900ccfe9c41 100644 --- a/.buildkite/pipelines/on_merge.yml +++ b/.buildkite/pipelines/on_merge.yml @@ -46,6 +46,36 @@ steps: - exit_status: '-1' limit: 3 + - command: .buildkite/scripts/steps/lint.sh + label: 'Linting' + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-16 + preemptible: true + key: linting + timeout_in_minutes: 60 + retry: + automatic: + - exit_status: '-1' + limit: 3 + + - command: .buildkite/scripts/steps/lint_with_types.sh + label: 'Linting (with types)' + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-32 + preemptible: true + key: linting_with_types + timeout_in_minutes: 90 + retry: + automatic: + - exit_status: '-1' + limit: 3 + - wait - command: .buildkite/scripts/steps/on_merge_api_docs.sh @@ -109,6 +139,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 3 retry: @@ -127,6 +159,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 2 retry: @@ -145,6 +179,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 8 retry: @@ -163,6 +199,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 5 retry: @@ -181,6 +219,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 1 retry: @@ -199,6 +239,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 4 retry: @@ -217,6 +259,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 6 retry: @@ -235,6 +279,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 5 retry: @@ -253,6 +299,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 6 retry: @@ -271,6 +319,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 5 retry: @@ -289,6 +339,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 6 retry: @@ -307,6 +359,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 1 retry: @@ -325,6 +379,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 1 retry: @@ -343,6 +399,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 2 retry: @@ -361,6 +419,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 2 retry: @@ -379,6 +439,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 6 retry: @@ -397,6 +459,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 8 retry: @@ -415,6 +479,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 8 retry: @@ -435,6 +501,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 20 retry: @@ -455,6 +523,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 14 retry: @@ -468,42 +538,14 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types agents: image: family/kibana-ubuntu-2004 imageProject: elastic-images-prod provider: gcp machineType: n2-standard-2 - - command: .buildkite/scripts/steps/lint.sh - label: 'Linting' - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-8 - preemptible: true - key: linting - timeout_in_minutes: 60 - retry: - automatic: - - exit_status: '-1' - limit: 3 - - - command: .buildkite/scripts/steps/lint_with_types.sh - label: 'Linting (with types)' - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-16 - preemptible: true - key: linting_with_types - timeout_in_minutes: 90 - retry: - automatic: - - exit_status: '-1' - limit: 3 - - command: .buildkite/scripts/steps/checks.sh label: 'Checks' agents: diff --git a/.buildkite/pipelines/pull_request/apm_cypress.yml b/.buildkite/pipelines/pull_request/apm_cypress.yml index 05194bae83e79..9d2cca6d9d452 100644 --- a/.buildkite/pipelines/pull_request/apm_cypress.yml +++ b/.buildkite/pipelines/pull_request/apm_cypress.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 120 parallelism: 1 # TODO: Set parallelism when apm_cypress handles it retry: diff --git a/.buildkite/pipelines/pull_request/base.yml b/.buildkite/pipelines/pull_request/base.yml index c60d68bd2e88b..fdc80e6cb8595 100644 --- a/.buildkite/pipelines/pull_request/base.yml +++ b/.buildkite/pipelines/pull_request/base.yml @@ -32,6 +32,30 @@ steps: - exit_status: '-1' limit: 3 + - command: .buildkite/scripts/steps/lint.sh + label: 'Linting' + agents: + machineType: n2-standard-16 + preemptible: true + key: linting + timeout_in_minutes: 60 + retry: + automatic: + - exit_status: '-1' + limit: 3 + + - command: .buildkite/scripts/steps/lint_with_types.sh + label: 'Linting (with types)' + agents: + machineType: n2-standard-32 + preemptible: true + key: linting_with_types + timeout_in_minutes: 90 + retry: + automatic: + - exit_status: '-1' + limit: 3 + - wait - command: .buildkite/scripts/steps/ci_stats_ready.sh @@ -61,18 +85,6 @@ steps: - exit_status: '*' limit: 1 - - command: .buildkite/scripts/steps/lint.sh - label: 'Linting' - agents: - machineType: n2-standard-8 - preemptible: true - key: linting - timeout_in_minutes: 60 - retry: - automatic: - - exit_status: '-1' - limit: 3 - - command: .buildkite/scripts/steps/check_types.sh label: 'Check Types' agents: @@ -85,18 +97,6 @@ steps: - exit_status: '-1' limit: 3 - - command: .buildkite/scripts/steps/lint_with_types.sh - label: 'Linting (with types)' - agents: - machineType: n2-standard-16 - preemptible: true - key: linting_with_types - timeout_in_minutes: 90 - retry: - automatic: - - exit_status: '-1' - limit: 3 - - command: .buildkite/scripts/steps/checks.sh label: 'Checks' key: checks diff --git a/.buildkite/pipelines/pull_request/deploy_cloud.yml b/.buildkite/pipelines/pull_request/deploy_cloud.yml index d520822e54f7b..e82d1ef2e494c 100644 --- a/.buildkite/pipelines/pull_request/deploy_cloud.yml +++ b/.buildkite/pipelines/pull_request/deploy_cloud.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 30 soft_fail: true retry: diff --git a/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml b/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml index 72a2ae8ab785b..42aaf59b1c1f2 100644 --- a/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml +++ b/.buildkite/pipelines/pull_request/exploratory_view_plugin.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 artifact_paths: - 'x-pack/plugins/observability_solution/exploratory_view/e2e/.journeys/**/*' diff --git a/.buildkite/pipelines/pull_request/fips.yml b/.buildkite/pipelines/pull_request/fips.yml index a136b4f91a2c5..3fa0ed9bd2062 100644 --- a/.buildkite/pipelines/pull_request/fips.yml +++ b/.buildkite/pipelines/pull_request/fips.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 soft_fail: true retry: diff --git a/.buildkite/pipelines/pull_request/fleet_cypress.yml b/.buildkite/pipelines/pull_request/fleet_cypress.yml index 2e0365793afc0..071106209caaa 100644 --- a/.buildkite/pipelines/pull_request/fleet_cypress.yml +++ b/.buildkite/pipelines/pull_request/fleet_cypress.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 50 parallelism: 6 retry: diff --git a/.buildkite/pipelines/pull_request/inventory_cypress.yml b/.buildkite/pipelines/pull_request/inventory_cypress.yml index 371cd80b02cdf..b1a8b999f09f2 100644 --- a/.buildkite/pipelines/pull_request/inventory_cypress.yml +++ b/.buildkite/pipelines/pull_request/inventory_cypress.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 120 parallelism: 1 retry: diff --git a/.buildkite/pipelines/pull_request/kbn_handlebars.yml b/.buildkite/pipelines/pull_request/kbn_handlebars.yml index 5da18ce31919c..ad338ec425a04 100644 --- a/.buildkite/pipelines/pull_request/kbn_handlebars.yml +++ b/.buildkite/pipelines/pull_request/kbn_handlebars.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 5 retry: automatic: diff --git a/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml b/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml index b5831e7bb471d..d0afe1cd138da 100644 --- a/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml +++ b/.buildkite/pipelines/pull_request/observability_onboarding_cypress.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 120 retry: automatic: diff --git a/.buildkite/pipelines/pull_request/profiling_cypress.yml b/.buildkite/pipelines/pull_request/profiling_cypress.yml index d86fc5a167db6..2b86cffe75fa6 100644 --- a/.buildkite/pipelines/pull_request/profiling_cypress.yml +++ b/.buildkite/pipelines/pull_request/profiling_cypress.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 120 parallelism: 2 retry: diff --git a/.buildkite/pipelines/pull_request/response_ops.yml b/.buildkite/pipelines/pull_request/response_ops.yml index 60e2dc32476d5..a5c9b27ee7ecf 100644 --- a/.buildkite/pipelines/pull_request/response_ops.yml +++ b/.buildkite/pipelines/pull_request/response_ops.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 120 parallelism: 9 retry: diff --git a/.buildkite/pipelines/pull_request/response_ops_cases.yml b/.buildkite/pipelines/pull_request/response_ops_cases.yml index 1e1510260436d..994fbb6c4963a 100644 --- a/.buildkite/pipelines/pull_request/response_ops_cases.yml +++ b/.buildkite/pipelines/pull_request/response_ops_cases.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 120 retry: automatic: diff --git a/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml b/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml index 252365ee7e4da..7f9a8d9da06e6 100644 --- a/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml +++ b/.buildkite/pipelines/pull_request/security_solution/ai_assistant.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 1 retry: @@ -22,6 +24,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 1 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/cloud_security_posture.yml b/.buildkite/pipelines/pull_request/security_solution/cloud_security_posture.yml index 7f5131b77f204..93fad6eecf167 100644 --- a/.buildkite/pipelines/pull_request/security_solution/cloud_security_posture.yml +++ b/.buildkite/pipelines/pull_request/security_solution/cloud_security_posture.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 1 retry: @@ -22,6 +24,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 1 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml b/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml index 6d69748c6d447..767f9d2c4745a 100644 --- a/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml +++ b/.buildkite/pipelines/pull_request/security_solution/cypress_burn.yml @@ -9,6 +9,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 soft_fail: true parallelism: 1 @@ -25,6 +27,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 soft_fail: true parallelism: 1 @@ -39,6 +43,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 1 retry: @@ -53,6 +59,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 50 soft_fail: true retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml b/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml index fc5e601adad61..9c3bb0e90a83a 100644 --- a/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml +++ b/.buildkite/pipelines/pull_request/security_solution/defend_workflows.yml @@ -9,6 +9,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 20 retry: @@ -26,6 +28,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 14 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml b/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml index 65a9dc832e1e6..34437d4136222 100644 --- a/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml +++ b/.buildkite/pipelines/pull_request/security_solution/detection_engine.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 5 retry: @@ -22,6 +24,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 2 retry: @@ -37,6 +41,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 5 retry: @@ -52,6 +58,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 2 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml b/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml index 8883f1ab9c038..bea72bf851345 100644 --- a/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml +++ b/.buildkite/pipelines/pull_request/security_solution/entity_analytics.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 3 retry: @@ -22,6 +24,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 2 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/explore.yml b/.buildkite/pipelines/pull_request/security_solution/explore.yml index 239021affcf99..a3578c911c1cf 100644 --- a/.buildkite/pipelines/pull_request/security_solution/explore.yml +++ b/.buildkite/pipelines/pull_request/security_solution/explore.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 2 retry: @@ -22,6 +24,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 2 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/investigations.yml b/.buildkite/pipelines/pull_request/security_solution/investigations.yml index ccd469aedbdbe..3b7fc869b4703 100644 --- a/.buildkite/pipelines/pull_request/security_solution/investigations.yml +++ b/.buildkite/pipelines/pull_request/security_solution/investigations.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 7 retry: @@ -22,6 +24,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 8 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml b/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml index 5fa8fe359ada6..e0b0278e3d969 100644 --- a/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml +++ b/.buildkite/pipelines/pull_request/security_solution/osquery_cypress.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 8 retry: @@ -22,6 +24,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 8 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/playwright.yml b/.buildkite/pipelines/pull_request/security_solution/playwright.yml index 694a7ed588089..2efa342a5ce37 100644 --- a/.buildkite/pipelines/pull_request/security_solution/playwright.yml +++ b/.buildkite/pipelines/pull_request/security_solution/playwright.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 1 retry: @@ -22,6 +24,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 1 retry: diff --git a/.buildkite/pipelines/pull_request/security_solution/rule_management.yml b/.buildkite/pipelines/pull_request/security_solution/rule_management.yml index 30bd1bd1ff649..aee037704d332 100644 --- a/.buildkite/pipelines/pull_request/security_solution/rule_management.yml +++ b/.buildkite/pipelines/pull_request/security_solution/rule_management.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 5 retry: @@ -22,6 +24,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 1 retry: @@ -37,6 +41,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 4 retry: @@ -52,6 +58,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 parallelism: 2 retry: diff --git a/.buildkite/pipelines/pull_request/slo_plugin_e2e.yml b/.buildkite/pipelines/pull_request/slo_plugin_e2e.yml index 852ec2f9a0b16..025c80809ab35 100644 --- a/.buildkite/pipelines/pull_request/slo_plugin_e2e.yml +++ b/.buildkite/pipelines/pull_request/slo_plugin_e2e.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 30 artifact_paths: - 'x-pack/plugins/observability_solution/slo/e2e/.journeys/**/*' diff --git a/.buildkite/pipelines/pull_request/synthetics_plugin.yml b/.buildkite/pipelines/pull_request/synthetics_plugin.yml index 77f330b991ba8..0707650aa7c01 100644 --- a/.buildkite/pipelines/pull_request/synthetics_plugin.yml +++ b/.buildkite/pipelines/pull_request/synthetics_plugin.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 artifact_paths: - 'x-pack/plugins/observability_solution/synthetics/e2e/.journeys/**/*' diff --git a/.buildkite/pipelines/pull_request/uptime_plugin.yml b/.buildkite/pipelines/pull_request/uptime_plugin.yml index 286c760336132..33a529739ae6f 100644 --- a/.buildkite/pipelines/pull_request/uptime_plugin.yml +++ b/.buildkite/pipelines/pull_request/uptime_plugin.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 artifact_paths: - 'x-pack/plugins/observability_solution/synthetics/e2e/.journeys/**/*' diff --git a/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml b/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml index a11309cffb2c2..977701cc99485 100644 --- a/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml +++ b/.buildkite/pipelines/pull_request/ux_plugin_e2e.yml @@ -7,6 +7,8 @@ steps: depends_on: - build - quick_checks + - linting + - linting_with_types timeout_in_minutes: 60 artifact_paths: - 'x-pack/plugins/observability_solution/ux/e2e/.journeys/**/*' diff --git a/.buildkite/scripts/steps/checks/quick_checks.txt b/.buildkite/scripts/steps/checks/quick_checks.txt index e0196950b4a75..9bd9224673905 100644 --- a/.buildkite/scripts/steps/checks/quick_checks.txt +++ b/.buildkite/scripts/steps/checks/quick_checks.txt @@ -1,4 +1,3 @@ -.buildkite/scripts/steps/checks/precommit_hook.sh .buildkite/scripts/steps/checks/ts_projects.sh .buildkite/scripts/steps/checks/packages.sh .buildkite/scripts/steps/checks/bazel_packages.sh diff --git a/.buildkite/scripts/steps/lint.sh b/.buildkite/scripts/steps/lint.sh index 05eb3bb602d84..70ab323c9f731 100755 --- a/.buildkite/scripts/steps/lint.sh +++ b/.buildkite/scripts/steps/lint.sh @@ -15,9 +15,9 @@ echo '--- Lint: eslint' # after possibly commiting fixed files to the repo set +e; if is_pr && ! is_auto_commit_disabled; then - git ls-files | grep -E '\.(js|mjs|ts|tsx)$' | xargs -n 250 -P 4 node scripts/eslint --no-cache --fix + git ls-files | grep -E '\.(js|mjs|ts|tsx)$' | xargs -n 250 -P 8 node scripts/eslint --no-cache --fix else - git ls-files | grep -E '\.(js|mjs|ts|tsx)$' | xargs -n 250 -P 4 node scripts/eslint --no-cache + git ls-files | grep -E '\.(js|mjs|ts|tsx)$' | xargs -n 250 -P 8 node scripts/eslint --no-cache fi eslint_exit=$? From 7ab51231e38a6d074d08cd92606988c591c24017 Mon Sep 17 00:00:00 2001 From: Larry Gregory Date: Mon, 28 Oct 2024 14:01:56 -0400 Subject: [PATCH 094/135] Fix documentation for session lifespan default (#198065) This pull request includes an update to the `docs/settings/security-settings.asciidoc` file to clarify the default session lifespan settings for different installation environments. Documentation update: * [`docs/settings/security-settings.asciidoc`](diffhunk://#diff-97a4c4e3696b33b246f55ddd794608530b693f0a7a66ae1361a32b67c7461523L204-R204): Clarified that the default session lifespan is 30 days for on-prem installations and 24 hours for Elastic Cloud installations. --- docs/settings/security-settings.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/settings/security-settings.asciidoc b/docs/settings/security-settings.asciidoc index 94c21486fe9cb..ad413ecbb7ce6 100644 --- a/docs/settings/security-settings.asciidoc +++ b/docs/settings/security-settings.asciidoc @@ -201,7 +201,7 @@ NOTE: Use a string of `[ms\|s\|m\|h\|d\|w\|M\|Y]` (e.g. '20m', '24h', '7d [[xpack-session-lifespan]] xpack.security.session.lifespan {ess-icon}:: Ensures that user sessions will expire after the defined time period. This behavior is also known as an "absolute timeout". If this is set to `0`, user sessions could stay active indefinitely. This and <> are both highly -recommended. You can also specify this setting for <>. By default, this value is 30 days. +recommended. You can also specify this setting for <>. By default, this value is 30 days for on-prem installations, and 24 hours for Elastic Cloud installations. + TIP: Use a string of `[ms\|s\|m\|h\|d\|w\|M\|Y]` (e.g. '20m', '24h', '7d', '1w'). From 084d89ecb4c4532fdf434a81072ed2e1635448db Mon Sep 17 00:00:00 2001 From: Tre Date: Mon, 28 Oct 2024 18:50:33 +0000 Subject: [PATCH 095/135] [FTR][Ownership] Assign aiops, custom branding, etc (#197468) ## Summary Assign test files to small number of reviewers ### Assignment Reasons Assigned custom_branding due to https://github.com/elastic/kibana/blob/main/x-pack/plugins/custom_branding/kibana.jsonc#L4 Assigned response_ops_docs due to the name Assigned monitoring due to https://github.com/elastic/kibana/blob/main/x-pack/plugins/monitoring/kibana.jsonc#L4 Assigned so managment due to https://github.com/elastic/kibana/blob/main/src/plugins/saved_objects_management/kibana.jsonc#L4 Assigned aiops due to https://github.com/elastic/kibana/blob/main/x-pack/plugins/aiops/kibana.jsonc#L4 Assigned banners_functional due to Pierre being all over the git blame. :lol: Assigned x-pack/test/screenshot_creation due to https://github.com/elastic/kibana/pull/197468#discussion_r1817460031 Contributes to: https://github.com/elastic/kibana/issues/194817 --- .github/CODEOWNERS | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index db98dc411bc22..1451c647f658e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1090,6 +1090,7 @@ src/plugins/discover/public/context_awareness/profile_providers/security @elasti # Platform Docs /x-pack/test_serverless/functional/test_suites/security/screenshot_creation/index.ts @elastic/platform-docs /x-pack/test_serverless/functional/test_suites/security/config.screenshots.ts @elastic/platform-docs +/x-pack/test/screenshot_creation @elastic/platform-docs # Visualizations /x-pack/test/accessibility/apps/group3/graph.ts @elastic/kibana-visualizations @@ -1225,6 +1226,7 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test_serverless/**/test_suites/observability/infra/ @elastic/obs-ux-infra_services-team # Elastic Stack Monitoring +/x-pack/test/functional/services/monitoring @elastic/stack-monitoring /x-pack/test/functional/apps/monitoring @elastic/stack-monitoring /x-pack/test/api_integration/apis/monitoring @elastic/stack-monitoring /x-pack/test/api_integration/apis/monitoring_collection @elastic/stack-monitoring @@ -1315,12 +1317,17 @@ x-pack/test_serverless/**/test_suites/observability/ai_assistant @elastic/obs-ai /x-pack/test/screenshot_creation/services/ml_screenshots.ts @elastic/ml-ui /x-pack/test_serverless/**/test_suites/**/ml/ @elastic/ml-ui /x-pack/test_serverless/**/test_suites/common/management/transforms/ @elastic/ml-ui +/x-pack/test/api_integration/services/ml.ts @elastic/ml-ui # Additional plugins and packages maintained by the ML team. /x-pack/test/accessibility/apps/group2/transform.ts @elastic/ml-ui /x-pack/test/api_integration/apis/aiops/ @elastic/ml-ui /x-pack/test/api_integration/apis/transform/ @elastic/ml-ui +/x-pack/test/api_integration_basic/apis/aiops @elastic/ml-ui /x-pack/test/api_integration_basic/apis/transform/ @elastic/ml-ui +/x-pack/test/api_integration/services/aiops.ts @elastic/ml-ui +/x-pack/test/api_integration/services/transform.ts @elastic/ml-ui +/x-pack/test/functional/apps/aiops @elastic/ml-ui /x-pack/test/functional/apps/transform/ @elastic/ml-ui /x-pack/test/functional/services/transform/ @elastic/ml-ui /x-pack/test/functional_basic/apps/transform/ @elastic/ml-ui @@ -1402,6 +1409,7 @@ x-pack/test/api_integration/deployment_agnostic/services/ @elastic/appex-qa x-pack/test/**/deployment_agnostic/ @elastic/appex-qa #temporarily to monitor tests migration # Core +/x-pack/test/functional/apps/saved_objects_management @elastic/kibana-core /x-pack/test/usage_collection @elastic/kibana-core /x-pack/test/licensing_plugin @elastic/kibana-core /x-pack/test/functional_execution_context @elastic/kibana-core @@ -1491,6 +1499,7 @@ x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kib #CC# /x-pack/plugins/security/ @elastic/kibana-security # Response Ops team +/x-pack/test/screenshot_creation/apps/response_ops_docs @elastic/response-ops /x-pack/test/rule_registry @elastic/response-ops @elastic/obs-ux-management-team /x-pack/test/accessibility/apps/group3/rules_connectors.ts @elastic/response-ops /x-pack/test/functional/es_archives/cases/default @elastic/response-ops @@ -1988,6 +1997,8 @@ x-pack/test/profiling_api_integration @elastic/obs-ux-infra_services-team x-pack/plugins/observability_solution/observability_shared/public/components/profiling @elastic/obs-ux-infra_services-team # Shared UX +/x-pack/test/banners_functional @elastic/appex-sharedux +/x-pack/test/custom_branding @elastic/appex-sharedux /x-pack/test/api_integration/apis/content_management @elastic/appex-sharedux /x-pack/test/accessibility/apps/group3/tags.ts @elastic/appex-sharedux /x-pack/test/accessibility/apps/group3/snapshot_and_restore.ts @elastic/appex-sharedux From af2bff4ca455168a691e17bd26a84b24f2ff8e99 Mon Sep 17 00:00:00 2001 From: Ievgen Sorokopud Date: Mon, 28 Oct 2024 20:12:38 +0100 Subject: [PATCH 096/135] [Security GenAI][BUG] KB index entry created via pdf upload does not give the right response (#198020) ## Summary These changes fix the issue with the wrong response of the AI Assistant using knowledge base tool and index entry generated from a PDF file. The issue happens because we are using the first chunk of uploaded PDF document as a context that we pass to LLM instead of using inner hits chunks which are actual parts of the document relevant to the questions. Here is [the blog post](https://www.elastic.co/search-labs/blog/semantic-text-with-amazon-bedrock) that talks about the strategy of using inner hits to get the most relevant documents. (see `Strategy 1: API Calls` section) ### Upload + index PDF 1. Navigate to Integrations page 2. Select "Upload a file" 3. Select and upload a PDF file 4. Press Import button 5. Switch to Advanced tab 6. Fill in "Index name" 7. Add additional field > Add semantic text field > Fill in form * Field: `attachment.content` * Copy to field: `content` * Inference endpoint: `elser_model_2` 8. Press Add button 9. Press Import button ### Add KB index entry (with uploaded PDF data) 1. Navigate to AI Assistant's Knowledge Base page 2. New > Index 3. Fill in "New index entry" form (below are main fields) * Name: `[add entry name]` * Index: `[select index name created during uploading a PDF file]` * Field: `content` 4. Press Save button ### Testing notes Enable knowledge base feature via ``` xpack.securitySolution.enableExperimental: - 'assistantKnowledgeBaseByDefault' ``` ### Example PDF for testing **PDF document**: [Elastic Global Threat Report 2024](https://github.com/user-attachments/files/17544720/elastic-global-threat-report-2024.pdf) **KB Index entry**: Data Description: "Use this tool to answer questions about the Elastic Global Threat Report (GTR) 2024" Query Instruction: "Key terms to return data relevant to the Elastic Global Threat Report (GTR) 2024" **Questions**: 1. Who are the authors of the GTR 2024? 2. What is the forecast for the coming year in GTR 2024? 3. What are top 10 Process Injection by rules in Windows endpoints in GTR 2024? 4. What is the most widely adopted cloud service provider this year according to GTR 2024? 6. Give a brief conclusion of the GTR 2024 **Current behaviour**: Screenshot 2024-10-28 at 16 43 48 **Fixed behaviour**: Screenshot 2024-10-28 at 16 44 47 --- .../knowledge_base/helpers.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/helpers.ts b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/helpers.ts index de76a38135f0b..59816b0b0c264 100644 --- a/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/helpers.ts +++ b/x-pack/plugins/elastic_assistant/server/ai_assistant_data_clients/knowledge_base/helpers.ts @@ -220,6 +220,17 @@ export const getStructuredToolForIndexEntry = ({ return { ...prev, [field]: hit._source[field] }; }, {}); } + + // We want to send relevant inner hits (chunks) to the LLM as a context + const innerHitPath = `${indexEntry.name}.${indexEntry.field}`; + if (hit.inner_hits?.[innerHitPath]) { + return { + text: hit.inner_hits[innerHitPath].hits.hits + .map((innerHit) => innerHit._source.text) + .join('\n --- \n'), + }; + } + return { text: get(hit._source, `${indexEntry.field}.inference.chunks[0].text`), }; From 943b273c4b2d5c7b018054d02e63c3c466c43d52 Mon Sep 17 00:00:00 2001 From: "Christiane (Tina) Heiligers" Date: Mon, 28 Oct 2024 12:30:02 -0700 Subject: [PATCH 097/135] Improves pattern matching for data telemetry (#197876) ## Summary Addresses concerns with Regex matching. Co-authored-by: Elastic Machine --- .../get_data_telemetry/get_data_telemetry.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/telemetry/server/telemetry_collection/get_data_telemetry/get_data_telemetry.ts b/src/plugins/telemetry/server/telemetry_collection/get_data_telemetry/get_data_telemetry.ts index e817ee652bc75..57e28c819dcc9 100644 --- a/src/plugins/telemetry/server/telemetry_collection/get_data_telemetry/get_data_telemetry.ts +++ b/src/plugins/telemetry/server/telemetry_collection/get_data_telemetry/get_data_telemetry.ts @@ -115,7 +115,8 @@ function findMatchingDescriptors({ // avoid system indices caught by very fuzzy index patterns (i.e.: *log* would catch `.kibana-log-...`) return false; } - return new RegExp(`^${pattern.replace(/\./g, '\\.').replace(/\*/g, '.*')}$`).test(name); + const escapedPattern = pattern.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + return new RegExp(`^${escapedPattern.replace(/\\\*/g, '.*')}$`).test(name); }); } From 72888f651a1033ef566ac1600edc509913006db6 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Mon, 28 Oct 2024 20:38:53 +0100 Subject: [PATCH 098/135] [Synthetics] Refactor delete route !! (#195387) ## Summary Fixes https://github.com/elastic/kibana/issues/193790 !! Refactor delete route !! Make sure to send delete response in bulk to synthetics service !! --- .../add_monitor/add_monitor_api.ts | 8 +- .../monitor_cruds/add_monitor_project.ts | 5 +- .../bulk_cruds/add_monitor_bulk.ts | 22 +- .../bulk_cruds/delete_monitor_bulk.ts | 24 +- .../routes/monitor_cruds/delete_monitor.ts | 207 ++---------------- .../monitor_cruds/delete_monitor_project.ts | 10 +- .../services/delete_monitor_api.ts | 122 +++++++++++ .../services/validate_space_id.ts | 21 ++ 8 files changed, 184 insertions(+), 235 deletions(-) create mode 100644 x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/services/delete_monitor_api.ts create mode 100644 x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/services/validate_space_id.ts diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/add_monitor/add_monitor_api.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/add_monitor/add_monitor_api.ts index b80a4f5be6825..f8c7fa9ed9b23 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/add_monitor/add_monitor_api.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/add_monitor/add_monitor_api.ts @@ -10,10 +10,10 @@ import { SavedObject } from '@kbn/core-saved-objects-common/src/server_types'; import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; import { isValidNamespace } from '@kbn/fleet-plugin/common'; import { i18n } from '@kbn/i18n'; +import { DeleteMonitorAPI } from '../services/delete_monitor_api'; import { parseMonitorLocations } from './utils'; import { MonitorValidationError } from '../monitor_validation'; import { getSavedObjectKqlFilter } from '../../common'; -import { deleteMonitor } from '../delete_monitor'; import { monitorAttributes, syntheticsMonitorType } from '../../../../common/types/saved_objects'; import { PrivateLocationAttributes } from '../../../runtime_types/private_locations'; import { ConfigKey } from '../../../../common/constants/monitor_management'; @@ -339,9 +339,9 @@ export class AddEditMonitorAPI { if (encryptedMonitor) { await savedObjectsClient.delete(syntheticsMonitorType, newMonitorId); - await deleteMonitor({ - routeContext: this.routeContext, - monitorId: newMonitorId, + const deleteMonitorAPI = new DeleteMonitorAPI(this.routeContext); + await deleteMonitorAPI.execute({ + monitorIds: [newMonitorId], }); } } catch (e) { diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/add_monitor_project.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/add_monitor_project.ts index 75427a22aced2..8311a6407bf6a 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/add_monitor_project.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/add_monitor_project.ts @@ -7,6 +7,7 @@ import { schema } from '@kbn/config-schema'; import { i18n } from '@kbn/i18n'; import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; +import { validateSpaceId } from './services/validate_space_id'; import { RouteContext, SyntheticsRestApiRouteFactory } from '../types'; import { ProjectMonitor } from '../../../common/runtime_types'; @@ -46,9 +47,7 @@ export const addSyntheticsProjectMonitorRoute: SyntheticsRestApiRouteFactory = ( } try { - const { id: spaceId } = (await server.spaces?.spacesService.getActiveSpace(request)) ?? { - id: DEFAULT_SPACE_ID, - }; + const spaceId = await validateSpaceId(routeContext); const permissionError = await validatePermissions(routeContext, monitors); diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/bulk_cruds/add_monitor_bulk.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/bulk_cruds/add_monitor_bulk.ts index b6a090165382b..2ecbbf83d471c 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/bulk_cruds/add_monitor_bulk.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/bulk_cruds/add_monitor_bulk.ts @@ -10,10 +10,10 @@ import { SavedObjectsBulkResponse } from '@kbn/core-saved-objects-api-server'; import { v4 as uuidV4 } from 'uuid'; import { NewPackagePolicy } from '@kbn/fleet-plugin/common'; import { SavedObjectError } from '@kbn/core-saved-objects-common'; +import { deleteMonitorBulk } from './delete_monitor_bulk'; import { SyntheticsServerSetup } from '../../../types'; import { RouteContext } from '../../types'; import { formatTelemetryEvent, sendTelemetryEvents } from '../../telemetry/monitor_upgrade_sender'; -import { deleteMonitor } from '../delete_monitor'; import { formatSecrets } from '../../../synthetics_service/utils'; import { syntheticsMonitorType } from '../../../../common/types/saved_objects'; import { @@ -24,6 +24,7 @@ import { SyntheticsMonitor, type SyntheticsPrivateLocations, } from '../../../../common/runtime_types'; +import { DeleteMonitorAPI } from '../services/delete_monitor_api'; export const createNewSavedObjectMonitorBulk = async ({ soClient, @@ -146,15 +147,10 @@ const rollBackNewMonitorBulk = async ( ) => { const { server } = routeContext; try { - await pMap( - monitorsToCreate, - async (monitor) => - deleteMonitor({ - routeContext, - monitorId: monitor.id, - }), - { concurrency: 100, stopOnError: false } - ); + const deleteMonitorAPI = new DeleteMonitorAPI(routeContext); + await deleteMonitorAPI.execute({ + monitorIds: monitorsToCreate.map(({ id }) => id), + }); } catch (e) { // ignore errors here server.logger.error(e); @@ -194,11 +190,9 @@ export const deleteMonitorIfCreated = async ({ newMonitorId ); if (encryptedMonitor) { - await savedObjectsClient.delete(syntheticsMonitorType, newMonitorId); - - await deleteMonitor({ + await deleteMonitorBulk({ + monitors: [encryptedMonitor], routeContext, - monitorId: newMonitorId, }); } } catch (e) { diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/bulk_cruds/delete_monitor_bulk.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/bulk_cruds/delete_monitor_bulk.ts index 7df12b17b6092..9a031b3e7111a 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/bulk_cruds/delete_monitor_bulk.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/bulk_cruds/delete_monitor_bulk.ts @@ -4,10 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { SavedObjectsClientContract, KibanaRequest } from '@kbn/core/server'; import { SavedObject } from '@kbn/core-saved-objects-server'; -import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; -import { SyntheticsServerSetup } from '../../../types'; import { formatTelemetryDeleteEvent, sendTelemetryEvents, @@ -19,29 +16,20 @@ import { EncryptedSyntheticsMonitorAttributes, SyntheticsMonitorWithId, } from '../../../../common/runtime_types'; -import { SyntheticsMonitorClient } from '../../../synthetics_service/synthetics_monitor/synthetics_monitor_client'; import { syntheticsMonitorType } from '../../../../common/types/saved_objects'; +import { RouteContext } from '../../types'; export const deleteMonitorBulk = async ({ - savedObjectsClient, - server, monitors, - syntheticsMonitorClient, - request, + routeContext, }: { - savedObjectsClient: SavedObjectsClientContract; - server: SyntheticsServerSetup; monitors: Array>; - syntheticsMonitorClient: SyntheticsMonitorClient; - request: KibanaRequest; + routeContext: RouteContext; }) => { + const { savedObjectsClient, server, spaceId, syntheticsMonitorClient } = routeContext; const { logger, telemetry, stackVersion } = server; try { - const { id: spaceId } = (await server.spaces?.spacesService.getActiveSpace(request)) ?? { - id: DEFAULT_SPACE_ID, - }; - const deleteSyncPromise = syntheticsMonitorClient.deleteMonitors( monitors.map((normalizedMonitor) => ({ ...normalizedMonitor.attributes, @@ -55,7 +43,7 @@ export const deleteMonitorBulk = async ({ monitors.map((monitor) => ({ type: syntheticsMonitorType, id: monitor.id })) ); - const [errors] = await Promise.all([deleteSyncPromise, deletePromises]); + const [errors, result] = await Promise.all([deleteSyncPromise, deletePromises]); monitors.forEach((monitor) => { sendTelemetryEvents( @@ -71,7 +59,7 @@ export const deleteMonitorBulk = async ({ ); }); - return errors; + return { errors, result }; } catch (e) { throw e; } diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/delete_monitor.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/delete_monitor.ts index b7a1d0b2d48d8..f40f06f66b1ff 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/delete_monitor.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/delete_monitor.ts @@ -5,27 +5,10 @@ * 2.0. */ import { schema } from '@kbn/config-schema'; -import { SavedObjectsClientContract, SavedObjectsErrorHelpers } from '@kbn/core/server'; -import pMap from 'p-map'; -import { validatePermissions } from './edit_monitor'; -import { SyntheticsServerSetup } from '../../types'; -import { RouteContext, SyntheticsRestApiRouteFactory } from '../types'; -import { syntheticsMonitorType } from '../../../common/types/saved_objects'; -import { - ConfigKey, - DeleteParamsResponse, - EncryptedSyntheticsMonitorAttributes, - MonitorFields, - SyntheticsMonitorWithId, - SyntheticsMonitorWithSecretsAttributes, -} from '../../../common/runtime_types'; +import { DeleteMonitorAPI } from './services/delete_monitor_api'; +import { SyntheticsRestApiRouteFactory } from '../types'; +import { DeleteParamsResponse } from '../../../common/runtime_types'; import { SYNTHETICS_API_URLS } from '../../../common/constants'; -import { - formatTelemetryDeleteEvent, - sendErrorTelemetryEvents, - sendTelemetryEvents, -} from '../telemetry/monitor_upgrade_sender'; -import { formatSecrets, normalizeSecrets } from '../../synthetics_service/utils/secrets'; export const deleteSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory< DeleteParamsResponse[], @@ -62,7 +45,6 @@ export const deleteSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory< }); } - const result: Array<{ id: string; deleted: boolean; error?: string }> = []; const idsToDelete = [...(ids ?? []), ...(queryId ? [queryId] : [])]; if (idsToDelete.length === 0) { return response.badRequest({ @@ -70,178 +52,21 @@ export const deleteSyntheticsMonitorRoute: SyntheticsRestApiRouteFactory< }); } - await pMap(idsToDelete, async (id) => { - try { - const { errors, res } = await deleteMonitor({ - routeContext, - monitorId: id, - }); - if (res) { - return res; - } - - if (errors && errors.length > 0) { - return response.ok({ - body: { message: 'error pushing monitor to the service', attributes: { errors } }, - }); - } + const deleteMonitorAPI = new DeleteMonitorAPI(routeContext); + try { + const { errors } = await deleteMonitorAPI.execute({ + monitorIds: idsToDelete, + }); - result.push({ id, deleted: true }); - } catch (getErr) { - if (SavedObjectsErrorHelpers.isNotFoundError(getErr)) { - result.push({ id, deleted: false, error: `Monitor id ${id} not found!` }); - } else { - throw getErr; - } + if (errors && errors.length > 0) { + return response.ok({ + body: { message: 'error pushing monitor to the service', attributes: { errors } }, + }); } - }); + } catch (getErr) { + throw getErr; + } - return result; + return deleteMonitorAPI.result; }, }); - -export const deleteMonitor = async ({ - routeContext, - monitorId, -}: { - routeContext: RouteContext; - monitorId: string; -}) => { - const { response, spaceId, savedObjectsClient, server, syntheticsMonitorClient } = routeContext; - const { logger, telemetry, stackVersion } = server; - - const { monitor, monitorWithSecret } = await getMonitorToDelete( - monitorId, - savedObjectsClient, - server, - spaceId - ); - - const err = await validatePermissions(routeContext, monitor.attributes.locations); - if (err) { - return { - res: response.forbidden({ - body: { - message: err, - }, - }), - }; - } - - let deletePromise; - - try { - deletePromise = savedObjectsClient.delete(syntheticsMonitorType, monitorId); - - const deleteSyncPromise = syntheticsMonitorClient.deleteMonitors( - [ - { - ...monitor.attributes, - id: (monitor.attributes as MonitorFields)[ConfigKey.MONITOR_QUERY_ID], - }, - /* Type cast encrypted saved objects to decrypted saved objects for delete flow only. - * Deletion does not require all monitor fields */ - ] as SyntheticsMonitorWithId[], - savedObjectsClient, - spaceId - ); - - const [errors] = await Promise.all([deleteSyncPromise, deletePromise]).catch((e) => { - server.logger.error(e); - throw e; - }); - - sendTelemetryEvents( - logger, - telemetry, - formatTelemetryDeleteEvent( - monitor, - stackVersion, - new Date().toISOString(), - Boolean((monitor.attributes as MonitorFields)[ConfigKey.SOURCE_INLINE]), - errors - ) - ); - - return { errors }; - } catch (e) { - if (deletePromise) { - await deletePromise; - } - server.logger.error( - `Unable to delete Synthetics monitor ${monitor.attributes[ConfigKey.NAME]}` - ); - - if (monitorWithSecret) { - await restoreDeletedMonitor({ - monitorId, - normalizedMonitor: formatSecrets({ - ...monitorWithSecret.attributes, - }), - savedObjectsClient, - }); - } - throw e; - } -}; - -const getMonitorToDelete = async ( - monitorId: string, - soClient: SavedObjectsClientContract, - server: SyntheticsServerSetup, - spaceId: string -) => { - const encryptedSOClient = server.encryptedSavedObjects.getClient(); - - try { - const monitor = - await encryptedSOClient.getDecryptedAsInternalUser( - syntheticsMonitorType, - monitorId, - { - namespace: spaceId, - } - ); - return { monitor: normalizeSecrets(monitor), monitorWithSecret: normalizeSecrets(monitor) }; - } catch (e) { - server.logger.error(`Failed to decrypt monitor to delete ${monitorId}${e}`); - sendErrorTelemetryEvents(server.logger, server.telemetry, { - reason: `Failed to decrypt monitor to delete ${monitorId}`, - message: e?.message, - type: 'deletionError', - code: e?.code, - status: e.status, - stackVersion: server.stackVersion, - }); - } - - const monitor = await soClient.get( - syntheticsMonitorType, - monitorId - ); - return { monitor, withSecrets: false }; -}; - -const restoreDeletedMonitor = async ({ - monitorId, - savedObjectsClient, - normalizedMonitor, -}: { - monitorId: string; - normalizedMonitor: SyntheticsMonitorWithSecretsAttributes; - savedObjectsClient: SavedObjectsClientContract; -}) => { - try { - await savedObjectsClient.get( - syntheticsMonitorType, - monitorId - ); - } catch (e) { - if (SavedObjectsErrorHelpers.isNotFoundError(e)) { - await savedObjectsClient.create(syntheticsMonitorType, normalizedMonitor, { - id: monitorId, - overwrite: true, - }); - } - } -}; diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/delete_monitor_project.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/delete_monitor_project.ts index 2136634be7ef7..7b36780937694 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/delete_monitor_project.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/delete_monitor_project.ts @@ -12,6 +12,7 @@ import { ConfigKey } from '../../../common/runtime_types'; import { SYNTHETICS_API_URLS } from '../../../common/constants'; import { getMonitors, getSavedObjectKqlFilter } from '../common'; import { deleteMonitorBulk } from './bulk_cruds/delete_monitor_bulk'; +import { validateSpaceId } from './services/validate_space_id'; export const deleteSyntheticsMonitorProjectRoute: SyntheticsRestApiRouteFactory = () => ({ method: 'DELETE', @@ -25,7 +26,7 @@ export const deleteSyntheticsMonitorProjectRoute: SyntheticsRestApiRouteFactory }), }, handler: async (routeContext): Promise => { - const { request, response, savedObjectsClient, server, syntheticsMonitorClient } = routeContext; + const { request, response } = routeContext; const { projectName } = request.params; const { monitors: monitorsToDelete } = request.body; const decodedProjectName = decodeURI(projectName); @@ -37,6 +38,8 @@ export const deleteSyntheticsMonitorProjectRoute: SyntheticsRestApiRouteFactory }); } + await validateSpaceId(routeContext); + const deleteFilter = `${syntheticsMonitorType}.attributes.${ ConfigKey.PROJECT_ID }: "${decodedProjectName}" AND ${getSavedObjectKqlFilter({ @@ -57,10 +60,7 @@ export const deleteSyntheticsMonitorProjectRoute: SyntheticsRestApiRouteFactory await deleteMonitorBulk({ monitors, - server, - savedObjectsClient, - syntheticsMonitorClient, - request, + routeContext, }); return { diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/services/delete_monitor_api.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/services/delete_monitor_api.ts new file mode 100644 index 0000000000000..bd162fc043592 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/services/delete_monitor_api.ts @@ -0,0 +1,122 @@ +/* + * 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 pMap from 'p-map'; +import { SavedObject, SavedObjectsErrorHelpers } from '@kbn/core-saved-objects-server'; +import { deleteMonitorBulk } from '../bulk_cruds/delete_monitor_bulk'; +import { validatePermissions } from '../edit_monitor'; +import { + EncryptedSyntheticsMonitorAttributes, + SyntheticsMonitor, + SyntheticsMonitorWithSecretsAttributes, +} from '../../../../common/runtime_types'; +import { syntheticsMonitorType } from '../../../../common/types/saved_objects'; +import { normalizeSecrets } from '../../../synthetics_service/utils'; +import { sendErrorTelemetryEvents } from '../../telemetry/monitor_upgrade_sender'; +import { RouteContext } from '../../types'; + +export class DeleteMonitorAPI { + routeContext: RouteContext; + result: Array<{ id: string; deleted: boolean; error?: string }> = []; + constructor(routeContext: RouteContext) { + this.routeContext = routeContext; + } + + async getMonitorsToDelete(monitorIds: string[]) { + const result: Array> = []; + await pMap( + monitorIds, + async (monitorId) => { + const monitor = await this.getMonitorToDelete(monitorId); + if (monitor) { + result.push(monitor); + } + }, + { + stopOnError: false, + } + ); + return result; + } + + async getMonitorToDelete(monitorId: string) { + const { spaceId, savedObjectsClient, server } = this.routeContext; + try { + const encryptedSOClient = server.encryptedSavedObjects.getClient(); + + const monitor = + await encryptedSOClient.getDecryptedAsInternalUser( + syntheticsMonitorType, + monitorId, + { + namespace: spaceId, + } + ); + return normalizeSecrets(monitor); + } catch (e) { + if (SavedObjectsErrorHelpers.isNotFoundError(e)) { + this.result.push({ + id: monitorId, + deleted: false, + error: `Monitor id ${monitorId} not found!`, + }); + } else { + server.logger.error(`Failed to decrypt monitor to delete ${monitorId}${e}`); + sendErrorTelemetryEvents(server.logger, server.telemetry, { + reason: `Failed to decrypt monitor to delete ${monitorId}`, + message: e?.message, + type: 'deletionError', + code: e?.code, + status: e.status, + stackVersion: server.stackVersion, + }); + return await savedObjectsClient.get( + syntheticsMonitorType, + monitorId + ); + } + } + } + + async execute({ monitorIds }: { monitorIds: string[] }) { + const { response, server } = this.routeContext; + + const monitors = await this.getMonitorsToDelete(monitorIds); + for (const monitor of monitors) { + const err = await validatePermissions(this.routeContext, monitor.attributes.locations); + if (err) { + return { + res: response.forbidden({ + body: { + message: err, + }, + }), + }; + } + } + + try { + const { errors, result } = await deleteMonitorBulk({ + monitors, + routeContext: this.routeContext, + }); + + result.statuses?.forEach((res) => { + this.result.push({ + id: res.id, + deleted: res.success, + }); + }); + + return { errors }; + } catch (e) { + server.logger.error(`Unable to delete Synthetics monitor with error ${e.message}`); + server.logger.error(e); + throw e; + } + } +} diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/services/validate_space_id.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/services/validate_space_id.ts new file mode 100644 index 0000000000000..9f456efc3f5b1 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/monitor_cruds/services/validate_space_id.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 { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; +import { RouteContext } from '../../types'; + +export const validateSpaceId = async (routeContext: RouteContext) => { + const { server, request, spaceId } = routeContext; + // If the spaceId is the default space, return it, it always exists + if (spaceId === DEFAULT_SPACE_ID) { + return spaceId; + } + const { id } = (await server.spaces?.spacesService.getActiveSpace(request)) ?? { + id: DEFAULT_SPACE_ID, + }; + return id; +}; From e827873c51a15c64c3a7cbdd6f2ee325e09c747e Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Mon, 28 Oct 2024 15:54:22 -0400 Subject: [PATCH 099/135] [Fleet] Prevent hosted policies space change (#198043) --- .../agent_policy_advanced_fields/index.tsx | 2 +- .../server/routes/agent_policy/handlers.ts | 2 ++ .../server/services/spaces/agent_policy.test.ts | 17 +++++++++++++++++ .../server/services/spaces/agent_policy.ts | 14 +++++++++++++- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/index.tsx index 6b0a7c512d197..0277184acabf2 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_advanced_fields/index.tsx @@ -328,7 +328,7 @@ export const AgentPolicyAdvancedOptionsContent: React.FunctionComponent = } > { ); }); + it('throw when trying to change a managed policies space', async () => { + jest.mocked(agentPolicyService.get).mockResolvedValue({ + id: 'policy1', + space_ids: ['default'], + is_managed: true, + } as any); + jest.mocked(packagePolicyService.findAllForAgentPolicy).mockResolvedValue([] as any); + await expect( + updateAgentPolicySpaces({ + agentPolicyId: 'policy1', + currentSpaceId: 'default', + newSpaceIds: ['test'], + authorizedSpaces: ['test', 'default'], + }) + ).rejects.toThrowError(/Cannot update hosted agent policy policy1 space/); + }); + it('throw when trying to add a space with missing permissions', async () => { await expect( updateAgentPolicySpaces({ diff --git a/x-pack/plugins/fleet/server/services/spaces/agent_policy.ts b/x-pack/plugins/fleet/server/services/spaces/agent_policy.ts index 905f7980af994..14d7f45f2c47c 100644 --- a/x-pack/plugins/fleet/server/services/spaces/agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/spaces/agent_policy.ts @@ -19,7 +19,7 @@ import { appContextService } from '../app_context'; import { agentPolicyService } from '../agent_policy'; import { ENROLLMENT_API_KEYS_INDEX } from '../../constants'; import { packagePolicyService } from '../package_policy'; -import { FleetError } from '../../errors'; +import { FleetError, HostedAgentPolicyRestrictionRelatedError } from '../../errors'; import { isSpaceAwarenessEnabled } from './helpers'; @@ -28,11 +28,13 @@ export async function updateAgentPolicySpaces({ currentSpaceId, newSpaceIds, authorizedSpaces, + options, }: { agentPolicyId: string; currentSpaceId: string; newSpaceIds: string[]; authorizedSpaces: string[]; + options?: { force?: boolean }; }) { const useSpaceAwareness = await isSpaceAwarenessEnabled(); if (!useSpaceAwareness || !newSpaceIds || newSpaceIds.length === 0) { @@ -50,6 +52,16 @@ export async function updateAgentPolicySpaces({ agentPolicyId ); + if (!existingPolicy) { + return; + } + + if (existingPolicy.is_managed && !options?.force) { + throw new HostedAgentPolicyRestrictionRelatedError( + `Cannot update hosted agent policy ${existingPolicy.id} space ` + ); + } + if (deepEqual(existingPolicy?.space_ids?.sort() ?? [DEFAULT_SPACE_ID], newSpaceIds.sort())) { return; } From cfe182c8c9d690b552edfa5b306834c3ee1dfc3f Mon Sep 17 00:00:00 2001 From: Rachel Shen Date: Mon, 28 Oct 2024 13:59:40 -0600 Subject: [PATCH 100/135] Revert "[Canvas] Update kbn/flot to remove table.replace() issue" (#198067) Fixes #197998 Reverts elastic/kibana#195643 --- packages/kbn-flot-charts/lib/jquery_flot.js | 2415 ++++++++----------- 1 file changed, 1070 insertions(+), 1345 deletions(-) diff --git a/packages/kbn-flot-charts/lib/jquery_flot.js b/packages/kbn-flot-charts/lib/jquery_flot.js index 50524fd8f4926..3b13b317c616c 100644 --- a/packages/kbn-flot-charts/lib/jquery_flot.js +++ b/packages/kbn-flot-charts/lib/jquery_flot.js @@ -1,6 +1,8 @@ /* JavaScript plotting library for jQuery, version 0.8.3. + Copyright (c) 2007-2014 IOLA and Ole Laursen. Licensed under the MIT license. + */ // first an inline dependency, jquery.colorhelpers.js, we inline it here @@ -27,602 +29,482 @@ Licensed under the MIT license. * V. 1.1: Fix error handling so e.g. parsing an empty string does * produce a color rather than just crashing. */ - (function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return valuemax?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery); // the actual Flot code -/* Javascript plotting library for jQuery, version 0.9.0-alpha. - -Copyright (c) 2007-2013 IOLA and Ole Laursen. -Licensed under the MIT license. - -*/ - (function($) { - // A jquery-esque isNumeric method since we currently support 1.4.4 - // and $.isNumeric was introduced on in 1.7 - var isNumeric = $.isNumeric || function(obj) { - return obj - parseFloat( obj ) >= 0; - }; - - /** - * The Canvas object is a wrapper around an HTML5 tag. - * - * @constructor - * @param {string} cls List of classes to apply to the canvas. - * @param {element} container Element onto which to append the canvas. - * - * Requiring a container is a little iffy, but unfortunately canvas - * operations don't work unless the canvas is attached to the DOM. - */ - function Canvas(cls, container) { - - var element = container.children("." + cls)[0]; + // Cache the prototype hasOwnProperty for faster access - if (element == null) { + var hasOwnProperty = Object.prototype.hasOwnProperty; - element = document.createElement("canvas"); - element.className = cls; + // A shim to provide 'detach' to jQuery versions prior to 1.4. Using a DOM + // operation produces the same effect as detach, i.e. removing the element + // without touching its jQuery data. - $(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 }) - .appendTo(container); + // Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+. - // If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas - - if (!element.getContext) { - if (window.G_vmlCanvasManager) { - element = window.G_vmlCanvasManager.initElement(element); - } else { - throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode."); + if (!$.fn.detach) { + $.fn.detach = function() { + return this.each(function() { + if (this.parentNode) { + this.parentNode.removeChild( this ); } - } - } - - this.element = element; - - var context = this.context = element.getContext("2d"); - - // Determine the screen's ratio of physical to device-independent - // pixels. This is the ratio between the canvas width that the browser - // advertises and the number of pixels actually present in that space. - - // The iPhone 4, for example, has a device-independent width of 320px, - // but its screen is actually 640px wide. It therefore has a pixel - // ratio of 2, while most normal devices have a ratio of 1. - - var devicePixelRatio = window.devicePixelRatio || 1, - backingStoreRatio = - context.webkitBackingStorePixelRatio || - context.mozBackingStorePixelRatio || - context.msBackingStorePixelRatio || - context.oBackingStorePixelRatio || - context.backingStorePixelRatio || 1; - - this.pixelRatio = devicePixelRatio / backingStoreRatio; - - // Size the canvas to match the internal dimensions of its container - - this.resize(container.width(), container.height()); - - // Collection of HTML div layers for text overlaid onto the canvas - - this.textContainer = null; - this.text = {}; - - // Cache of text fragments and metrics, so we can avoid expensively - // re-calculating them when the plot is re-rendered in a loop. - - this._textCache = {}; + }); + }; } - /** - * Resizes the canvas to the given dimensions. - * - * @param {number} width New width of the canvas, in pixels. - * @param {number} width New height of the canvas, in pixels. - */ - Canvas.prototype.resize = function(width, height) { - - if (width <= 0 || height <= 0) { - throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height); - } - - var element = this.element, - context = this.context, - pixelRatio = this.pixelRatio; - - // Resize the canvas, increasing its density based on the display's - // pixel ratio; basically giving it more pixels without increasing the - // size of its element, to take advantage of the fact that retina - // displays have that many more pixels in the same advertised space. - - // Resizing should reset the state (excanvas seems to be buggy though) - - if (this.width !== width) { - element.width = width * pixelRatio; - element.style.width = width + "px"; - this.width = width; - } - - if (this.height !== height) { - element.height = height * pixelRatio; - element.style.height = height + "px"; - this.height = height; - } - - // Save the context, so we can reset in case we get replotted. The - // restore ensure that we're really back at the initial state, and - // should be safe even if we haven't saved the initial state yet. - - context.restore(); - context.save(); - - // Scale the coordinate space to match the display density; so even though we - // may have twice as many pixels, we still want lines and other drawing to - // appear at the same size; the extra pixels will just make them crisper. - - context.scale(pixelRatio, pixelRatio); - }; - - /** - * Clears the entire canvas area, not including any overlaid HTML text - */ - Canvas.prototype.clear = function() { - this.context.clearRect(0, 0, this.width, this.height); - }; - - /** - * Finishes rendering the canvas, including managing the text overlay. - */ - Canvas.prototype.render = function() { - - var cache = this._textCache; - - // For each text layer, add elements marked as active that haven't - // already been rendered, and remove those that are no longer active. - - for (var layerKey in cache) { - if (Object.prototype.hasOwnProperty.call(cache, layerKey)) { - - var layer = this.getTextLayer(layerKey), - layerCache = cache[layerKey]; - - layer.hide(); - - for (var styleKey in layerCache) { - if (Object.prototype.hasOwnProperty.call(layerCache, styleKey)) { - var styleCache = layerCache[styleKey]; - for (var angleKey in styleCache) { - if (Object.prototype.hasOwnProperty.call(styleCache, angleKey)) { - var angleCache = styleCache[angleKey]; - for (var key in angleCache) { - if (Object.prototype.hasOwnProperty.call(angleCache, key)) { - - var positions = angleCache[key].positions; - - for (var i = 0, position; position = positions[i]; i++) { - if (position.active) { - if (!position.rendered) { - layer.append(position.element); - position.rendered = true; - } - } else { - positions.splice(i--, 1); - if (position.rendered) { - position.element.detach(); - } - } - } - - if (positions.length === 0) { - delete angleCache[key]; - } - } - } - } - } - } - } - - layer.show(); - } - } - }; - - /** - * Creates (if necessary) and returns the text overlay container. - * - * @param {string} classes String of space-separated CSS classes used to - * uniquely identify the text layer. - * @return {object} The jQuery-wrapped text-layer div. - */ - Canvas.prototype.getTextLayer = function(classes) { - - var layer = this.text[classes]; - - // Create the text layer if it doesn't exist - - if (layer == null) { - - // Create the text layer container, if it doesn't exist - - if (this.textContainer == null) { - this.textContainer = $("
") - .css({ - position: "absolute", - top: 0, - left: 0, - bottom: 0, - right: 0, - "font-size": "smaller", - color: "#545454" - }) - .insertAfter(this.element); - } - - layer = this.text[classes] = $("
") - .addClass(classes) - .css({ - position: "absolute", - top: 0, - left: 0, - bottom: 0, - right: 0 - }) - .appendTo(this.textContainer); - } + /////////////////////////////////////////////////////////////////////////// + // The Canvas object is a wrapper around an HTML5 tag. + // + // @constructor + // @param {string} cls List of classes to apply to the canvas. + // @param {element} container Element onto which to append the canvas. + // + // Requiring a container is a little iffy, but unfortunately canvas + // operations don't work unless the canvas is attached to the DOM. - return layer; - }; + function Canvas(cls, container) { - /** - * Creates (if necessary) and returns a text info object. - * - * The object looks like this: - * - * { - * width: Width of the text's wrapper div. - * height: Height of the text's wrapper div. - * element: The jQuery-wrapped HTML div containing the text. - * positions: Array of positions at which this text is drawn. - * } - * - * The positions array contains objects that look like this: - * - * { - * active: Flag indicating whether the text should be visible. - * rendered: Flag indicating whether the text is currently visible. - * element: The jQuery-wrapped HTML div containing the text. - * x: X coordinate at which to draw the text. - * y: Y coordinate at which to draw the text. - * } - * - * Each position after the first receives a clone of the original element. - * - * The idea is that that the width, height, and general 'identity' of the - * text is constant no matter where it is placed; the placements are a - * secondary property. - * - * Canvas maintains a cache of recently-used text info objects; getTextInfo - * either returns the cached element or creates a new entry. - * - * @param {string} layer A string of space-separated CSS classes uniquely - * identifying the layer containing this text. - * @param {string} text Text string to retrieve info for. - * @param {(string|object)=} font Either a string of space-separated CSS - * classes or a font-spec object, defining the text's font and style. - * @param {number=} angle Angle at which to rotate the text, in degrees. - * @param {number=} width Maximum width of the text before it wraps. - * @return {object} a text info object. - */ - Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) { - - var textStyle, layerCache, styleCache, angleCache, info; - - text = "" + text; // Cast to string in case we have a number or such - angle = (360 + (angle || 0)) % 360; // Normalize the angle to 0...359 - - // If the font is a font-spec object, generate a CSS font definition - - if (typeof font === "object") { - textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family; - } else { - textStyle = font; - } + var element = container.children("." + cls)[0]; - // Retrieve or create the caches for the text's layer, style, and angle + if (element == null) { - layerCache = this._textCache[layer]; - if (layerCache == null) { - layerCache = this._textCache[layer] = {}; - } + element = document.createElement("canvas"); + element.className = cls; - styleCache = layerCache[textStyle]; - if (styleCache == null) { - styleCache = layerCache[textStyle] = {}; - } + $(element).css({ direction: "ltr", position: "absolute", left: 0, top: 0 }) + .appendTo(container); - angleCache = styleCache[angle]; - if (angleCache == null) { - angleCache = styleCache[angle] = {}; - } + // If HTML5 Canvas isn't available, fall back to [Ex|Flash]canvas - info = angleCache[text]; + if (!element.getContext) { + if (window.G_vmlCanvasManager) { + element = window.G_vmlCanvasManager.initElement(element); + } else { + throw new Error("Canvas is not available. If you're using IE with a fall-back such as Excanvas, then there's either a mistake in your conditional include, or the page has no DOCTYPE and is rendering in Quirks Mode."); + } + } + } - // If we can't find a matching element in our cache, create a new one + this.element = element; - if (info == null) { + var context = this.context = element.getContext("2d"); - var element = $("
").html(text) - .css({ - position: "absolute", - "max-width": width, - top: -9999 - }) - .appendTo(this.getTextLayer(layer)); + // Determine the screen's ratio of physical to device-independent + // pixels. This is the ratio between the canvas width that the browser + // advertises and the number of pixels actually present in that space. - if (typeof font === "object") { - element.css({ - font: textStyle, - color: font.color - }); - } else if (typeof font === "string") { - element.addClass(font); - } - - // Save the original dimensions of the text; we'll modify these - // later to take into account rotation, if there is any. - - var textWidth = element.outerWidth(true), - textHeight = element.outerHeight(true); - - // Apply rotation to the text using CSS3/IE matrix transforms - - // Note how we also set the element's width, as a work-around for - // the way most browsers resize the div on rotate, which may cause - // the contents to wrap differently. The extra +1 is because IE - // rounds the width differently and needs a little extra help. - - if (angle) { - - var radians = angle * Math.PI / 180, - sin = Math.sin(radians), - cos = Math.cos(radians), - a = cos.toFixed(6), // Use fixed-point so these don't - b = (-sin).toFixed(6), // show up in scientific notation - c = sin.toFixed(6), // when we add them to the string - transformRule; - - if ($.support.leadingWhitespace) { - - // The transform origin defaults to '50% 50%', producing - // blurry text on some browsers (Chrome) when the width or - // height happens to be odd, making 50% fractional. Avoid - // this by setting the origin to rounded values. - - var cx = textWidth / 2, - cy = textHeight / 2, - transformOrigin = Math.floor(cx) + "px " + Math.floor(cy) + "px"; - - // Transforms alter the div's appearance without changing - // its origin. This will make it difficult to position it - // later, since we'll be positioning the new bounding box - // with respect to the old origin. We can work around this - // by adding a translation to align the new bounding box's - // top-left corner with the origin, using the same matrix. - - // Rather than examining all four points, we can use the - // angle to figure out in advance which two points are in - // the top-left quadrant; we can then use the x-coordinate - // of the first (left-most) point and the y-coordinate of - // the second (top-most) point as the bounding box corner. - - var x, y; - if (angle < 90) { - x = Math.floor(cx * cos + cy * sin - cx); - y = Math.floor(cx * sin + cy * cos - cy); - } else if (angle < 180) { - x = Math.floor(cy * sin - cx * cos - cx); - y = Math.floor(cx * sin - cy * cos - cy); - } else if (angle < 270) { - x = Math.floor(-cx * cos - cy * sin - cx); - y = Math.floor(-cx * sin - cy * cos - cy); - } else { - x = Math.floor(cx * cos - cy * sin - cx); - y = Math.floor(cy * cos - cx * sin - cy); - } - - transformRule = "matrix(" + a + "," + c + "," + b + "," + a + "," + x + "," + y + ")"; - - element.css({ - width: textWidth + 1, - transform: transformRule, - "-o-transform": transformRule, - "-ms-transform": transformRule, - "-moz-transform": transformRule, - "-webkit-transform": transformRule, - "transform-origin": transformOrigin, - "-o-transform-origin": transformOrigin, - "-ms-transform-origin": transformOrigin, - "-moz-transform-origin": transformOrigin, - "-webkit-transform-origin": transformOrigin - }); + // The iPhone 4, for example, has a device-independent width of 320px, + // but its screen is actually 640px wide. It therefore has a pixel + // ratio of 2, while most normal devices have a ratio of 1. - } else { + var devicePixelRatio = window.devicePixelRatio || 1, + backingStoreRatio = + context.webkitBackingStorePixelRatio || + context.mozBackingStorePixelRatio || + context.msBackingStorePixelRatio || + context.oBackingStorePixelRatio || + context.backingStorePixelRatio || 1; - // The IE7/8 matrix filter produces very ugly aliasing for - // text with a transparent background. Using a solid color - // greatly improves text clarity, although it does result - // in ugly boxes for plots using a non-white background. + this.pixelRatio = devicePixelRatio / backingStoreRatio; - // TODO: Instead of white use the actual background color? - // This still wouldn't solve the problem when the plot has - // a gradient background, but it would at least help. + // Size the canvas to match the internal dimensions of its container - transformRule = "progid:DXImageTransform.Microsoft.Matrix(M11=" + a + ", M12=" + b + ", M21=" + c + ", M22=" + a + ",sizingMethod='auto expand')"; + this.resize(container.width(), container.height()); - element.css({ - width: textWidth + 1, - filter: transformRule, - "-ms-filter": transformRule, - "background-color": "#fff" - }); - } + // Collection of HTML div layers for text overlaid onto the canvas - // Compute the final dimensions of the text's bounding box + this.textContainer = null; + this.text = {}; - var ac = Math.abs(cos), - as = Math.abs(sin), - originalWidth = textWidth; - textWidth = Math.round(ac * textWidth + as * textHeight); - textHeight = Math.round(as * originalWidth + ac * textHeight); - } + // Cache of text fragments and metrics, so we can avoid expensively + // re-calculating them when the plot is re-rendered in a loop. - info = angleCache[text] = { - width: textWidth, - height: textHeight, - element: element, - positions: [] - }; + this._textCache = {}; + } - element.detach(); - } + // Resizes the canvas to the given dimensions. + // + // @param {number} width New width of the canvas, in pixels. + // @param {number} width New height of the canvas, in pixels. - return info; - }; + Canvas.prototype.resize = function(width, height) { - /** - * Adds a text string to the canvas text overlay. - * - * The text isn't drawn immediately; it is marked as rendering, which will - * result in its addition to the canvas on the next render pass. - * - * @param {string} layer A string of space-separated CSS classes uniquely - * identifying the layer containing this text. - * @param {number} x X coordinate at which to draw the text. - * @param {number} y Y coordinate at which to draw the text. - * @param {string} text Text string to draw. - * @param {(string|object)=} font Either a string of space-separated CSS - * classes or a font-spec object, defining the text's font and style. - * @param {number=} angle Angle at which to rotate the text, in degrees. - * @param {number=} width Maximum width of the text before it wraps. - * @param {string=} halign Horizontal alignment of the text; either "left", - * "center" or "right". - * @param {string=} valign Vertical alignment of the text; either "top", - * "middle" or "bottom". - */ - Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) { - - var info = this.getTextInfo(layer, text, font, angle, width), - positions = info.positions; - - // Tweak the div's position to match the text's alignment - - if (halign === "center") { - x -= info.width / 2; - } else if (halign === "right") { - x -= info.width; - } + if (width <= 0 || height <= 0) { + throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height); + } - if (valign === "middle") { - y -= info.height / 2; - } else if (valign === "bottom") { - y -= info.height; - } + var element = this.element, + context = this.context, + pixelRatio = this.pixelRatio; - // Determine whether this text already exists at this position. - // If so, mark it for inclusion in the next render pass. + // Resize the canvas, increasing its density based on the display's + // pixel ratio; basically giving it more pixels without increasing the + // size of its element, to take advantage of the fact that retina + // displays have that many more pixels in the same advertised space. - for (var i = 0, position; position = positions[i]; i++) { - if (position.x === x && position.y === y) { - position.active = true; - return; - } - } + // Resizing should reset the state (excanvas seems to be buggy though) - // If the text doesn't exist at this position, create a new entry + if (this.width != width) { + element.width = width * pixelRatio; + element.style.width = width + "px"; + this.width = width; + } - // For the very first position we'll re-use the original element, - // while for subsequent ones we'll clone it. + if (this.height != height) { + element.height = height * pixelRatio; + element.style.height = height + "px"; + this.height = height; + } - position = { - active: true, - rendered: false, - element: positions.length ? info.element.clone() : info.element, - x: x, - y: y - }; + // Save the context, so we can reset in case we get replotted. The + // restore ensure that we're really back at the initial state, and + // should be safe even if we haven't saved the initial state yet. - positions.push(position); + context.restore(); + context.save(); - // Move the element to its final position within the container + // Scale the coordinate space to match the display density; so even though we + // may have twice as many pixels, we still want lines and other drawing to + // appear at the same size; the extra pixels will just make them crisper. - position.element.css({ - top: Math.round(y), - left: Math.round(x), - "text-align": halign // In case the text wraps - }); - }; + context.scale(pixelRatio, pixelRatio); + }; - /** - * Removes one or more text strings from the canvas text overlay. - * - * If no parameters are given, all text within the layer is removed. - * - * Note that the text is not immediately removed; it is simply marked as - * inactive, which will result in its removal on the next render pass. - * This avoids the performance penalty for 'clear and redraw' behavior, - * where we potentially get rid of all text on a layer, but will likely - * add back most or all of it later, as when redrawing axes, for example. - * - * @param {string} layer A string of space-separated CSS classes uniquely - * identifying the layer containing this text. - * @param {number=} x X coordinate of the text. - * @param {number=} y Y coordinate of the text. - * @param {string=} text Text string to remove. - * @param {(string|object)=} font Either a string of space-separated CSS - * classes or a font-spec object, defining the text's font and style. - * @param {number=} angle Angle at which the text is rotated, in degrees. - * Angle is currently unused, it will be implemented in the future. - */ - Canvas.prototype.removeText = function(layer, x, y, text, font, angle) { - var i, positions, position; - if (text == null) { - var layerCache = this._textCache[layer]; - if (layerCache != null) { - for (var styleKey in layerCache) { - if (Object.prototype.hasOwnProperty.call(layerCache, styleKey)) { - var styleCache = layerCache[styleKey]; - for (var angleKey in styleCache) { - if (Object.prototype.hasOwnProperty.call(styleCache, angleKey)) { - var angleCache = styleCache[angleKey]; - for (var key in angleCache) { - if (Object.prototype.hasOwnProperty.call(angleCache, key)) { - positions = angleCache[key].positions; - for (i = 0; position = positions[i]; i++) { - position.active = false; - } - } - } - } - } - } - } - } - } else { - positions = this.getTextInfo(layer, text, font, angle).positions; - for (i = 0; position = positions[i]; i++) { - if (position.x === x && position.y === y) { - position.active = false; - } - } - } - }; + // Clears the entire canvas area, not including any overlaid HTML text + + Canvas.prototype.clear = function() { + this.context.clearRect(0, 0, this.width, this.height); + }; + + // Finishes rendering the canvas, including managing the text overlay. + + Canvas.prototype.render = function() { + + var cache = this._textCache; + + // For each text layer, add elements marked as active that haven't + // already been rendered, and remove those that are no longer active. + + for (var layerKey in cache) { + if (hasOwnProperty.call(cache, layerKey)) { + + var layer = this.getTextLayer(layerKey), + layerCache = cache[layerKey]; + + layer.hide(); + + for (var styleKey in layerCache) { + if (hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey]; + for (var key in styleCache) { + if (hasOwnProperty.call(styleCache, key)) { + + var positions = styleCache[key].positions; + + for (var i = 0, position; position = positions[i]; i++) { + if (position.active) { + if (!position.rendered) { + layer.append(position.element); + position.rendered = true; + } + } else { + positions.splice(i--, 1); + if (position.rendered) { + position.element.detach(); + } + } + } + + if (positions.length == 0) { + delete styleCache[key]; + } + } + } + } + } + + layer.show(); + } + } + }; + + // Creates (if necessary) and returns the text overlay container. + // + // @param {string} classes String of space-separated CSS classes used to + // uniquely identify the text layer. + // @return {object} The jQuery-wrapped text-layer div. + + Canvas.prototype.getTextLayer = function(classes) { + + var layer = this.text[classes]; + + // Create the text layer if it doesn't exist + + if (layer == null) { + + // Create the text layer container, if it doesn't exist + + if (this.textContainer == null) { + this.textContainer = $("
") + .css({ + position: "absolute", + top: 0, + left: 0, + bottom: 0, + right: 0, + 'font-size': "smaller", + color: "#545454" + }) + .insertAfter(this.element); + } + + layer = this.text[classes] = $("
") + .addClass(classes) + .css({ + position: "absolute", + top: 0, + left: 0, + bottom: 0, + right: 0 + }) + .appendTo(this.textContainer); + } + + return layer; + }; + + // Creates (if necessary) and returns a text info object. + // + // The object looks like this: + // + // { + // width: Width of the text's wrapper div. + // height: Height of the text's wrapper div. + // element: The jQuery-wrapped HTML div containing the text. + // positions: Array of positions at which this text is drawn. + // } + // + // The positions array contains objects that look like this: + // + // { + // active: Flag indicating whether the text should be visible. + // rendered: Flag indicating whether the text is currently visible. + // element: The jQuery-wrapped HTML div containing the text. + // x: X coordinate at which to draw the text. + // y: Y coordinate at which to draw the text. + // } + // + // Each position after the first receives a clone of the original element. + // + // The idea is that that the width, height, and general 'identity' of the + // text is constant no matter where it is placed; the placements are a + // secondary property. + // + // Canvas maintains a cache of recently-used text info objects; getTextInfo + // either returns the cached element or creates a new entry. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {string} text Text string to retrieve info for. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which to rotate the text, in degrees. + // Angle is currently unused, it will be implemented in the future. + // @param {number=} width Maximum width of the text before it wraps. + // @return {object} a text info object. + + Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) { + + var textStyle, layerCache, styleCache, info; + + // Cast the value to a string, in case we were given a number or such + + text = "" + text; + + // If the font is a font-spec object, generate a CSS font definition + + if (typeof font === "object") { + textStyle = font.style + " " + font.variant + " " + font.weight + " " + font.size + "px/" + font.lineHeight + "px " + font.family; + } else { + textStyle = font; + } + + // Retrieve (or create) the cache for the text's layer and styles + + layerCache = this._textCache[layer]; + + if (layerCache == null) { + layerCache = this._textCache[layer] = {}; + } + + styleCache = layerCache[textStyle]; + + if (styleCache == null) { + styleCache = layerCache[textStyle] = {}; + } + + info = styleCache[text]; + + // If we can't find a matching element in our cache, create a new one + + if (info == null) { + + var element = $("
").text(text) + .css({ + position: "absolute", + 'max-width': width, + top: -9999 + }) + .appendTo(this.getTextLayer(layer)); + + if (typeof font === "object") { + element.css({ + font: textStyle, + color: font.color + }); + } else if (typeof font === "string") { + element.addClass(font); + } + + info = styleCache[text] = { + width: element.outerWidth(true), + height: element.outerHeight(true), + element: element, + positions: [] + }; + + element.detach(); + } + + return info; + }; + + // Adds a text string to the canvas text overlay. + // + // The text isn't drawn immediately; it is marked as rendering, which will + // result in its addition to the canvas on the next render pass. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {number} x X coordinate at which to draw the text. + // @param {number} y Y coordinate at which to draw the text. + // @param {string} text Text string to draw. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which to rotate the text, in degrees. + // Angle is currently unused, it will be implemented in the future. + // @param {number=} width Maximum width of the text before it wraps. + // @param {string=} halign Horizontal alignment of the text; either "left", + // "center" or "right". + // @param {string=} valign Vertical alignment of the text; either "top", + // "middle" or "bottom". + + Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) { + + var info = this.getTextInfo(layer, text, font, angle, width), + positions = info.positions; + + // Tweak the div's position to match the text's alignment + + if (halign == "center") { + x -= info.width / 2; + } else if (halign == "right") { + x -= info.width; + } + + if (valign == "middle") { + y -= info.height / 2; + } else if (valign == "bottom") { + y -= info.height; + } + + // Determine whether this text already exists at this position. + // If so, mark it for inclusion in the next render pass. + + for (var i = 0, position; position = positions[i]; i++) { + if (position.x == x && position.y == y) { + position.active = true; + return; + } + } + + // If the text doesn't exist at this position, create a new entry + + // For the very first position we'll re-use the original element, + // while for subsequent ones we'll clone it. + + position = { + active: true, + rendered: false, + element: positions.length ? info.element.clone() : info.element, + x: x, + y: y + }; + + positions.push(position); + + // Move the element to its final position within the container + + position.element.css({ + top: Math.round(y), + left: Math.round(x), + 'text-align': halign // In case the text wraps + }); + }; + + // Removes one or more text strings from the canvas text overlay. + // + // If no parameters are given, all text within the layer is removed. + // + // Note that the text is not immediately removed; it is simply marked as + // inactive, which will result in its removal on the next render pass. + // This avoids the performance penalty for 'clear and redraw' behavior, + // where we potentially get rid of all text on a layer, but will likely + // add back most or all of it later, as when redrawing axes, for example. + // + // @param {string} layer A string of space-separated CSS classes uniquely + // identifying the layer containing this text. + // @param {number=} x X coordinate of the text. + // @param {number=} y Y coordinate of the text. + // @param {string=} text Text string to remove. + // @param {(string|object)=} font Either a string of space-separated CSS + // classes or a font-spec object, defining the text's font and style. + // @param {number=} angle Angle at which the text is rotated, in degrees. + // Angle is currently unused, it will be implemented in the future. + + Canvas.prototype.removeText = function(layer, x, y, text, font, angle) { + if (text == null) { + var layerCache = this._textCache[layer]; + if (layerCache != null) { + for (var styleKey in layerCache) { + if (hasOwnProperty.call(layerCache, styleKey)) { + var styleCache = layerCache[styleKey]; + for (var key in styleCache) { + if (hasOwnProperty.call(styleCache, key)) { + var positions = styleCache[key].positions; + for (var i = 0, position; position = positions[i]; i++) { + position.active = false; + } + } + } + } + } + } + } else { + var positions = this.getTextInfo(layer, text, font, angle).positions; + for (var i = 0, position; position = positions[i]; i++) { + if (position.x == x && position.y == y) { + position.active = false; + } + } + } + }; + + /////////////////////////////////////////////////////////////////////////// + // The top-level container for the entire plot. - /** - * The top-level container for the entire plot. - */ function Plot(placeholder, data_, options_, plugins) { // data is on the form: // [ series1, series2 ... ] @@ -635,7 +517,7 @@ Licensed under the MIT license. colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], legend: { show: true, - noColumns: 1, // number of colums in legend table + noColumns: 1, // number of columns in legend table labelFormatter: null, // fn: string -> string labelBoxBorderColor: "#ccc", // border color for the little label boxes container: null, // container (as jQuery object) to put legend in, null means default on top of graph @@ -646,45 +528,31 @@ Licensed under the MIT license. sorted: null // default to no legend sorting }, xaxis: { - - show: null, // null = auto-detect, true = always, false = never - position: "bottom", // or "top" - mode: null, // null or "time" - - color: null, // base color, labels, ticks - font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" } - - min: null, // min. value to show, null means set automatically - max: null, // max. value to show, null means set automatically - autoscaleMargin: null, // margin in % to add if auto-setting min/max - - transform: null, // null or f: number -> number to transform axis + show: null, // null = auto-detect, true = always, false = never + position: "bottom", // or "top" + mode: null, // null or "time" + font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" } + color: null, // base color, labels, ticks + tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" + transform: null, // null or f: number -> number to transform axis inverseTransform: null, // if transform is set, this should be the inverse function - - ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks - tickSize: null, // number or [number, "unit"] - minTickSize: null, // number or [number, "unit"] - tickFormatter: null, // fn: number -> string - tickDecimals: null, // no. of decimals, null means auto - - tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" - tickLength: null, // size in pixels of ticks, or "full" for whole line - - tickWidth: null, // width of tick labels in pixels - tickHeight: null, // height of tick labels in pixels - tickFont: null, // null or font-spec object (see font, above) - - label: null, // null or an axis label string - labelFont: null, // null or font-spec object (see font, above) - labelPadding: 2, // spacing between the axis and its label - - reserveSpace: null, // whether to reserve space even if axis isn't shown - alignTicksWithAxis: null // axis number or null for no sync + min: null, // min. value to show, null means set automatically + max: null, // max. value to show, null means set automatically + autoscaleMargin: null, // margin in % to add if auto-setting min/max + ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks + tickFormatter: null, // fn: number -> string + labelWidth: null, // size of tick labels in pixels + labelHeight: null, + reserveSpace: null, // whether to reserve space even if axis isn't shown + tickLength: null, // size in pixels of ticks, or "full" for whole line + alignTicksWithAxis: null, // axis number or null for no sync + tickDecimals: null, // no. of decimals, null means auto + tickSize: null, // number or [number, "unit"] + minTickSize: null // number or [number, "unit"] }, yaxis: { - position: "left", // or "right" autoscaleMargin: 0.02, - labelPadding: 2 + position: "left" // or "right" }, xaxes: [], yaxes: [], @@ -695,7 +563,6 @@ Licensed under the MIT license. lineWidth: 2, // in pixels fill: true, fillColor: "#ffffff", - strokeColor: null, symbol: "circle" // or callback }, lines: { @@ -747,26 +614,26 @@ Licensed under the MIT license. }, hooks: {} }, - surface = null, // the canvas for the plot itself - overlay = null, // canvas for interactive stuff on top of plot - eventHolder = null, // jQuery object that events should be bound to - ctx = null, octx = null, - xaxes = [], yaxes = [], - plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, - plotWidth = 0, plotHeight = 0, - hooks = { - processOptions: [], - processRawData: [], - processDatapoints: [], - processOffset: [], - drawBackground: [], - drawSeries: [], - draw: [], - bindEvents: [], - drawOverlay: [], - shutdown: [] - }, - plot = this; + surface = null, // the canvas for the plot itself + overlay = null, // canvas for interactive stuff on top of plot + eventHolder = null, // jQuery object that events should be bound to + ctx = null, octx = null, + xaxes = [], yaxes = [], + plotOffset = { left: 0, right: 0, top: 0, bottom: 0}, + plotWidth = 0, plotHeight = 0, + hooks = { + processOptions: [], + processRawData: [], + processDatapoints: [], + processOffset: [], + drawBackground: [], + drawSeries: [], + draw: [], + bindEvents: [], + drawOverlay: [], + shutdown: [] + }, + plot = this; // public functions plot.setData = setData; @@ -785,11 +652,10 @@ Licensed under the MIT license. }; plot.getData = function () { return series; }; plot.getAxes = function () { - var res = {}; + var res = {}, i; $.each(xaxes.concat(yaxes), function (_, axis) { - if (axis) { - res[axis.direction + (axis.n !== 1 ? axis.n : "") + "axis"] = axis; - } + if (axis) + res[axis.direction + (axis.n != 1 ? axis.n : "") + "axis"] = axis; }); return res; }; @@ -808,9 +674,26 @@ Licensed under the MIT license. }; }; plot.shutdown = shutdown; + plot.destroy = function () { + shutdown(); + placeholder.removeData("plot").empty(); + + series = []; + options = null; + surface = null; + overlay = null; + eventHolder = null; + ctx = null; + octx = null; + xaxes = []; + yaxes = []; + hooks = null; + highlights = []; + plot = null; + }; plot.resize = function () { - var width = placeholder.width(), - height = placeholder.height(); + var width = placeholder.width(), + height = placeholder.height(); surface.resize(width, height); overlay.resize(width, height); }; @@ -830,9 +713,8 @@ Licensed under the MIT license. function executeHooks(hook, args) { args = [plot].concat(args); - for (var i = 0; i < hook.length; ++i) { + for (var i = 0; i < hook.length; ++i) hook[i].apply(this, args); - } } function initPlugins() { @@ -846,9 +728,8 @@ Licensed under the MIT license. for (var i = 0; i < plugins.length; ++i) { var p = plugins[i]; p.init(plot, classes); - if (p.options) { + if (p.options) $.extend(true, options, p.options); - } } } @@ -862,29 +743,23 @@ Licensed under the MIT license. // not expected behavior; avoid it by replacing them here. if (opts && opts.colors) { - options.colors = opts.colors; + options.colors = opts.colors; } - if (options.xaxis.color == null) { - options.xaxis.color = $.color.parse(options.grid.color).scale("a", 0.22).toString(); - } - if (options.yaxis.color == null) { - options.yaxis.color = $.color.parse(options.grid.color).scale("a", 0.22).toString(); - } + if (options.xaxis.color == null) + options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); + if (options.yaxis.color == null) + options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); - if (options.xaxis.tickColor == null) { // grid.tickColor for back-compatibility + if (options.xaxis.tickColor == null) // grid.tickColor for back-compatibility options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color; - } - if (options.yaxis.tickColor == null) { // grid.tickColor for back-compatibility + if (options.yaxis.tickColor == null) // grid.tickColor for back-compatibility options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color; - } - if (options.grid.borderColor == null) { + if (options.grid.borderColor == null) options.grid.borderColor = options.grid.color; - } - if (options.grid.tickColor == null) { - options.grid.tickColor = $.color.parse(options.grid.color).scale("a", 0.22).toString(); - } + if (options.grid.tickColor == null) + options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString(); // Fill in defaults for axis options, including any unspecified // font-spec fields, if a font-spec was provided. @@ -893,16 +768,16 @@ Licensed under the MIT license. // since the rest of the code assumes that they exist. var i, axisOptions, axisCount, + fontSize = placeholder.css("font-size"), + fontSizeDefault = fontSize ? +fontSize.replace("px", "") : 13, fontDefaults = { style: placeholder.css("font-style"), - size: Math.round(0.8 * (+placeholder.css("font-size").replace("px", "") || 13)), + size: Math.round(0.8 * fontSizeDefault), variant: placeholder.css("font-variant"), weight: placeholder.css("font-weight"), family: placeholder.css("font-family") }; - fontDefaults.lineHeight = fontDefaults.size * 1.15; - axisCount = options.xaxes.length || 1; for (i = 0; i < axisCount; ++i) { @@ -911,29 +786,17 @@ Licensed under the MIT license. axisOptions.tickColor = axisOptions.color; } - // Compatibility with markrcote/flot-axislabels - - if (axisOptions) { - if (!axisOptions.label && axisOptions.axisLabel) { - axisOptions.label = axisOptions.axisLabel; - } - if (!axisOptions.labelPadding && axisOptions.axisLabelPadding) { - axisOptions.labelPadding = axisOptions.axisLabelPadding; - } - } - axisOptions = $.extend(true, {}, options.xaxis, axisOptions); options.xaxes[i] = axisOptions; - fontDefaults.color = axisOptions.color; if (axisOptions.font) { axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); - } - if (axisOptions.tickFont || axisOptions.font) { - axisOptions.tickFont = $.extend({}, axisOptions.font || fontDefaults, axisOptions.tickFont); - } - if (axisOptions.label && (axisOptions.labelFont || axisOptions.font)) { - axisOptions.labelFont = $.extend({}, axisOptions.font || fontDefaults, axisOptions.labelFont); + if (!axisOptions.font.color) { + axisOptions.font.color = axisOptions.color; + } + if (!axisOptions.font.lineHeight) { + axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15); + } } } @@ -945,83 +808,72 @@ Licensed under the MIT license. axisOptions.tickColor = axisOptions.color; } - // Compatibility with markrcote/flot-axislabels - - if (axisOptions) { - if (!axisOptions.label && axisOptions.axisLabel) { - axisOptions.label = axisOptions.axisLabel; - } - if (!axisOptions.labelPadding && axisOptions.axisLabelPadding) { - axisOptions.labelPadding = axisOptions.axisLabelPadding; - } - } - axisOptions = $.extend(true, {}, options.yaxis, axisOptions); options.yaxes[i] = axisOptions; - fontDefaults.color = axisOptions.color; if (axisOptions.font) { axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); - } - if (axisOptions.tickFont || axisOptions.font) { - axisOptions.tickFont = $.extend({}, axisOptions.font || fontDefaults, axisOptions.tickFont); - } - if (axisOptions.label && (axisOptions.labelFont || axisOptions.font)) { - axisOptions.labelFont = $.extend({}, axisOptions.font || fontDefaults, axisOptions.labelFont); + if (!axisOptions.font.color) { + axisOptions.font.color = axisOptions.color; + } + if (!axisOptions.font.lineHeight) { + axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15); + } } } // backwards compatibility, to be removed in future - if (options.xaxis.noTicks && options.xaxis.ticks == null) { + if (options.xaxis.noTicks && options.xaxis.ticks == null) options.xaxis.ticks = options.xaxis.noTicks; - } - if (options.yaxis.noTicks && options.yaxis.ticks == null) { + if (options.yaxis.noTicks && options.yaxis.ticks == null) options.yaxis.ticks = options.yaxis.noTicks; - } if (options.x2axis) { options.xaxes[1] = $.extend(true, {}, options.xaxis, options.x2axis); options.xaxes[1].position = "top"; + // Override the inherit to allow the axis to auto-scale + if (options.x2axis.min == null) { + options.xaxes[1].min = null; + } + if (options.x2axis.max == null) { + options.xaxes[1].max = null; + } } if (options.y2axis) { options.yaxes[1] = $.extend(true, {}, options.yaxis, options.y2axis); options.yaxes[1].position = "right"; + // Override the inherit to allow the axis to auto-scale + if (options.y2axis.min == null) { + options.yaxes[1].min = null; + } + if (options.y2axis.max == null) { + options.yaxes[1].max = null; + } } - if (options.grid.coloredAreas) { + if (options.grid.coloredAreas) options.grid.markings = options.grid.coloredAreas; - } - if (options.grid.coloredAreasColor) { + if (options.grid.coloredAreasColor) options.grid.markingsColor = options.grid.coloredAreasColor; - } - if (options.lines) { + if (options.lines) $.extend(true, options.series.lines, options.lines); - } - if (options.points) { + if (options.points) $.extend(true, options.series.points, options.points); - } - if (options.bars) { + if (options.bars) $.extend(true, options.series.bars, options.bars); - } - if (options.shadowSize != null) { + if (options.shadowSize != null) options.series.shadowSize = options.shadowSize; - } - if (options.highlightColor != null) { + if (options.highlightColor != null) options.series.highlightColor = options.highlightColor; - } // save options on axes for future reference - for (i = 0; i < options.xaxes.length; ++i) { + for (i = 0; i < options.xaxes.length; ++i) getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i]; - } - for (i = 0; i < options.yaxes.length; ++i) { + for (i = 0; i < options.yaxes.length; ++i) getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i]; - } // add hooks from options - for (var n in hooks) { - if (options.hooks[n] && options.hooks[n].length) { + for (var n in hooks) + if (options.hooks[n] && options.hooks[n].length) hooks[n] = hooks[n].concat(options.hooks[n]); - } - } executeHooks(hooks.processOptions, [options]); } @@ -1044,9 +896,9 @@ Licensed under the MIT license. $.extend(true, s, d[i]); d[i].data = s.data; - } else { - s.data = d[i]; } + else + s.data = d[i]; res.push(s); } @@ -1055,12 +907,10 @@ Licensed under the MIT license. function axisNumber(obj, coord) { var a = obj[coord + "axis"]; - if (typeof a === "object") { // if we got a real axis, extract number + if (typeof a == "object") // if we got a real axis, extract number a = a.n; - } - if (!isNumeric(a)) { + if (typeof a != "number") a = 1; // default to first axis - } return a; } @@ -1074,24 +924,20 @@ Licensed under the MIT license. var res = {}, i, axis; for (i = 0; i < xaxes.length; ++i) { axis = xaxes[i]; - if (axis && axis.used) { + if (axis && axis.used) res["x" + axis.n] = axis.c2p(pos.left); - } } for (i = 0; i < yaxes.length; ++i) { axis = yaxes[i]; - if (axis && axis.used) { + if (axis && axis.used) res["y" + axis.n] = axis.c2p(pos.top); - } } - if (res.x1 !== undefined) { + if (res.x1 !== undefined) res.x = res.x1; - } - if (res.y1 !== undefined) { + if (res.y1 !== undefined) res.y = res.y1; - } return res; } @@ -1104,9 +950,8 @@ Licensed under the MIT license. axis = xaxes[i]; if (axis && axis.used) { key = "x" + axis.n; - if (pos[key] == null && axis.n === 1) { + if (pos[key] == null && axis.n == 1) key = "x"; - } if (pos[key] != null) { res.left = axis.p2c(pos[key]); @@ -1119,9 +964,8 @@ Licensed under the MIT license. axis = yaxes[i]; if (axis && axis.used) { key = "y" + axis.n; - if (pos[key] == null && axis.n === 1) { + if (pos[key] == null && axis.n == 1) key = "y"; - } if (pos[key] != null) { res.top = axis.p2c(pos[key]); @@ -1134,13 +978,12 @@ Licensed under the MIT license. } function getOrCreateAxis(axes, number) { - if (!axes[number - 1]) { + if (!axes[number - 1]) axes[number - 1] = { n: number, // save the number for future reference - direction: axes === xaxes ? "x" : "y", - options: $.extend(true, {}, axes === xaxes ? options.xaxis : options.yaxis) + direction: axes == xaxes ? "x" : "y", + options: $.extend(true, {}, axes == xaxes ? options.xaxis : options.yaxis) }; - } return axes[number - 1]; } @@ -1156,7 +999,7 @@ Licensed under the MIT license. var sc = series[i].color; if (sc != null) { neededColors--; - if (isNumeric(sc) && sc > maxIndex) { + if (typeof sc == "number" && sc > maxIndex) { maxIndex = sc; } } @@ -1187,19 +1030,15 @@ Licensed under the MIT license. // Reset the variation after every few cycles, or else // it will end up producing only white or black colors. - if (i % colorPoolSize === 0 && i) { + if (i % colorPoolSize == 0 && i) { if (variation >= 0) { if (variation < 0.5) { variation = -variation - 0.2; - } else { - variation = 0; - } - } else { - variation = -variation; - } + } else variation = 0; + } else variation = -variation; } - colors[i] = c.scale("rgb", 1 + variation); + colors[i] = c.scale('rgb', 1 + variation); } // Finalize the series options, filling in their colors @@ -1212,22 +1051,20 @@ Licensed under the MIT license. if (s.color == null) { s.color = colors[colori].toString(); ++colori; - } else if (isNumeric(s.color)) { - s.color = colors[s.color].toString(); } + else if (typeof s.color == "number") + s.color = colors[s.color].toString(); // turn on lines automatically in case nothing is set if (s.lines.show == null) { var v, show = true; - for (v in s) { + for (v in s) if (s[v] && s[v].show) { show = false; break; } - } - if (show) { + if (show) s.lines.show = true; - } } // If nothing was provided for lines.zero, default it to match @@ -1247,15 +1084,15 @@ Licensed under the MIT license. var topSentry = Number.POSITIVE_INFINITY, bottomSentry = Number.NEGATIVE_INFINITY, fakeInfinity = Number.MAX_VALUE, - i, j, k, m, s, points, ps, val, f, p, data, format; + i, j, k, m, length, + s, points, ps, x, y, axis, val, f, p, + data, format; function updateAxis(axis, min, max) { - if (min < axis.datamin && min !== -fakeInfinity) { + if (min < axis.datamin && min != -fakeInfinity) axis.datamin = min; - } - if (max > axis.datamax && max !== fakeInfinity) { + if (max > axis.datamax && max != fakeInfinity) axis.datamax = max; - } } $.each(allAxes(), function (_, axis) { @@ -1268,6 +1105,7 @@ Licensed under the MIT license. for (i = 0; i < series.length; ++i) { s = series[i]; s.datapoints = { points: [] }; + executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]); } @@ -1296,9 +1134,8 @@ Licensed under the MIT license. s.datapoints.format = format; } - if (s.datapoints.pointsize != null) { + if (s.datapoints.pointsize != null) continue; // already filled in - } s.datapoints.pointsize = format.length; @@ -1320,23 +1157,20 @@ Licensed under the MIT license. if (f) { if (f.number && val != null) { val = +val; // convert to number - if (isNaN(val)) { + if (isNaN(val)) val = null; - } else if (val === Infinity) { + else if (val == Infinity) val = fakeInfinity; - } else if (val === -Infinity) { + else if (val == -Infinity) val = -fakeInfinity; - } } if (val == null) { - if (f.required) { + if (f.required) nullify = true; - } - if (f.defaultValue != null) { + if (f.defaultValue != null) val = f.defaultValue; - } } } @@ -1350,7 +1184,7 @@ Licensed under the MIT license. if (val != null) { f = format[m]; // extract min/max info - if (f.autoscale) { + if (f.autoscale !== false) { if (f.x) { updateAxis(s.xaxis, val, val); } @@ -1361,18 +1195,18 @@ Licensed under the MIT license. } points[k + m] = null; } - } else { + } + else { // a little bit of line specific stuff that // perhaps shouldn't be here, but lacking // better means... - if (insertSteps && k > 0 && - points[k - ps] != null && - points[k - ps] !== points[k] && - points[k - ps + 1] !== points[k + 1]) { + if (insertSteps && k > 0 + && points[k - ps] != null + && points[k - ps] != points[k] + && points[k - ps + 1] != points[k + 1]) { // copy the point to make room for a middle point - for (m = 0; m < ps; ++m) { + for (m = 0; m < ps; ++m) points[k + ps + m] = points[k + m]; - } // middle point has same y points[k + 1] = points[k - ps + 1]; @@ -1402,32 +1236,26 @@ Licensed under the MIT license. xmax = bottomSentry, ymax = bottomSentry; for (j = 0; j < points.length; j += ps) { - if (points[j] == null) { + if (points[j] == null) continue; - } for (m = 0; m < ps; ++m) { val = points[j + m]; f = format[m]; - if (!f || f.autoscale === false || val === fakeInfinity || val === -fakeInfinity) { + if (!f || f.autoscale === false || val == fakeInfinity || val == -fakeInfinity) continue; - } if (f.x) { - if (val < xmin) { + if (val < xmin) xmin = val; - } - if (val > xmax) { + if (val > xmax) xmax = val; - } } if (f.y) { - if (val < ymin) { + if (val < ymin) ymin = val; - } - if (val > ymax) { + if (val > ymax) ymax = val; - } } } } @@ -1437,23 +1265,21 @@ Licensed under the MIT license. var delta; switch (s.bars.align) { - case "left": - delta = 0; - break; - case "right": - delta = -s.bars.barWidth; - break; - case "center": - delta = -s.bars.barWidth / 2; - break; - default: - throw new Error("Invalid bar alignment: " + s.bars.align); + case "left": + delta = 0; + break; + case "right": + delta = -s.bars.barWidth; + break; + default: + delta = -s.bars.barWidth / 2; } if (s.bars.horizontal) { ymin += delta; ymax += delta + s.bars.barWidth; - } else { + } + else { xmin += delta; xmax += delta + s.bars.barWidth; } @@ -1464,12 +1290,10 @@ Licensed under the MIT license. } $.each(allAxes(), function (_, axis) { - if (axis.datamin === topSentry) { + if (axis.datamin == topSentry) axis.datamin = null; - } - if (axis.datamax === bottomSentry) { + if (axis.datamax == bottomSentry) axis.datamax = null; - } }); } @@ -1479,11 +1303,12 @@ Licensed under the MIT license. // from a previous plot in this container that we'll try to re-use. placeholder.css("padding", 0) // padding messes up the positioning - .children(":not(.flot-base,.flot-overlay)").remove(); + .children().filter(function(){ + return !$(this).hasClass("flot-overlay") && !$(this).hasClass('flot-base'); + }).remove(); - if (placeholder.css("position") === "static") { + if (placeholder.css("position") == 'static') placeholder.css("position", "relative"); // for positioning labels and overlay - } surface = new Canvas("flot-base", placeholder); overlay = new Canvas("flot-overlay", placeholder); // overlay canvas for interactive features @@ -1521,17 +1346,15 @@ Licensed under the MIT license. eventHolder.bind("mouseleave", onMouseLeave); } - if (options.grid.clickable) { + if (options.grid.clickable) eventHolder.click(onClick); - } executeHooks(hooks.bindEvents, [eventHolder]); } function shutdown() { - if (redrawTimeout) { + if (redrawTimeout) clearTimeout(redrawTimeout); - } eventHolder.unbind("mousemove", onMouseMove); eventHolder.unbind("mouseleave", onMouseLeave); @@ -1551,143 +1374,136 @@ Licensed under the MIT license. // precompute how much the axis is scaling a point // in canvas space - if (axis.direction === "x") { + if (axis.direction == "x") { s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min)); m = Math.min(t(axis.max), t(axis.min)); - } else { + } + else { s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min)); s = -s; m = Math.max(t(axis.max), t(axis.min)); } // data point to canvas coordinate - if (t === identity) { // slight optimization + if (t == identity) // slight optimization axis.p2c = function (p) { return (p - m) * s; }; - } else { + else axis.p2c = function (p) { return (t(p) - m) * s; }; - } // canvas coordinate to data point - if (!it) { + if (!it) axis.c2p = function (c) { return m + c / s; }; - } else { + else axis.c2p = function (c) { return it(m + c / s); }; - } } function measureTickLabels(axis) { var opts = axis.options, ticks = axis.ticks || [], - // Label width & height are deprecated; remove in 1.0! - tickWidth = opts.tickWidth || opts.labelWidth || 0, - tickHeight = opts.tickHeight || opts.labelHeight || 0, - maxWidth = tickWidth || axis.direction === "x" ? Math.floor(surface.width / (ticks.length || 1)) : null, - layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + axis.direction + "Axis " + axis.direction + axis.n + "Axis", - font = opts.tickFont || "flot-tick-label tickLabel"; + labelWidth = opts.labelWidth || 0, + labelHeight = opts.labelHeight || 0, + maxWidth = labelWidth || (axis.direction == "x" ? Math.floor(surface.width / (ticks.length || 1)) : null), + legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", + layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, + font = opts.font || "flot-tick-label tickLabel"; for (var i = 0; i < ticks.length; ++i) { var t = ticks[i]; - if (!t.label) { + if (!t.label) continue; - } var info = surface.getTextInfo(layer, t.label, font, null, maxWidth); - tickWidth = Math.max(tickWidth, info.width); - tickHeight = Math.max(tickHeight, info.height); + labelWidth = Math.max(labelWidth, info.width); + labelHeight = Math.max(labelHeight, info.height); } - axis.tickWidth = opts.tickWidth || opts.labelWidth || tickWidth; - axis.tickHeight = opts.tickHeight || opts.labelHeight || tickHeight; - - // Label width/height properties are deprecated; remove in 1.0! - - axis.labelWidth = axis.tickWidth; - axis.labelHeight = axis.tickHeight; + axis.labelWidth = opts.labelWidth || labelWidth; + axis.labelHeight = opts.labelHeight || labelHeight; } - /////////////////////////////////////////////////////////////////////// - // Compute the axis bounding box based on the dimensions of its label - // and tick labels, then adjust the plotOffset to make room for it. - // - // This first phase only considers one dimension per axis; the other - // dimension depends on the other axes, and will be calculated later. - function allocateAxisBoxFirstPhase(axis) { - - var contentWidth = axis.tickWidth, - contentHeight = axis.tickHeight, - axisOptions = axis.options, - tickLength = axisOptions.tickLength, - axisPosition = axisOptions.position, + // find the bounding box of the axis by looking at label + // widths/heights and ticks, make room by diminishing the + // plotOffset; this first phase only looks at one + // dimension per axis, the other dimension depends on the + // other axes so will have to wait + + var lw = axis.labelWidth, + lh = axis.labelHeight, + pos = axis.options.position, + isXAxis = axis.direction === "x", + tickLength = axis.options.tickLength, axisMargin = options.grid.axisMargin, padding = options.grid.labelMargin, - all = axis.direction === "x" ? xaxes : yaxes, - innermost; - - // Determine the margin around the axis - - var samePosition = $.grep(all, function(axis) { - return axis && axis.options.position === axisPosition && axis.reserveSpace; + innermost = true, + outermost = true, + first = true, + found = false; + + // Determine the axis's position in its direction and on its side + + $.each(isXAxis ? xaxes : yaxes, function(i, a) { + if (a && (a.show || a.reserveSpace)) { + if (a === axis) { + found = true; + } else if (a.options.position === pos) { + if (found) { + outermost = false; + } else { + innermost = false; + } + } + if (!found) { + first = false; + } + } }); - if ($.inArray(axis, samePosition) === samePosition.length - 1) { - axisMargin = 0; // outermost - } - // Determine whether the axis is the first (innermost) on its side + // The outermost axis on each side has no margin - innermost = $.inArray(axis, samePosition) === 0; + if (outermost) { + axisMargin = 0; + } - // Determine the length of the tick marks + // The ticks for the first axis in each direction stretch across if (tickLength == null) { - if (innermost) { - tickLength = "full"; - } else { - tickLength = 5; - } + tickLength = first ? "full" : 5; } - if (!isNaN(+tickLength)) { + if (!isNaN(+tickLength)) padding += +tickLength; - } - // Measure the dimensions of the axis label, if it has one + if (isXAxis) { + lh += padding; - if (axisOptions.label) { - var layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + axis.direction + "Axis " + axis.direction + axis.n + "Axis", - font = axisOptions.labelFont || "flot-axis-label axisLabels " + axis.direction + axis.n + "axisLabel", - angle = axis.direction === "x" ? 0 : axisOptions.position === "right" ? 90 : -90, - labelInfo = surface.getTextInfo(layer, axisOptions.label, font, angle); - contentWidth += labelInfo.width + axisOptions.labelPadding; - contentHeight += labelInfo.height + axisOptions.labelPadding; + if (pos == "bottom") { + plotOffset.bottom += lh + axisMargin; + axis.box = { top: surface.height - plotOffset.bottom, height: lh }; + } + else { + axis.box = { top: plotOffset.top + axisMargin, height: lh }; + plotOffset.top += lh + axisMargin; + } } + else { + lw += padding; - // Compute the axis bounding box and update the plot bounds - - if (axis.direction === "x") { - contentHeight += padding; - if (axisPosition === "top") { - axis.box = { top: plotOffset.top + axisMargin, height: contentHeight }; - plotOffset.top += contentHeight + axisMargin; - } else { - plotOffset.bottom += contentHeight + axisMargin; - axis.box = { top: surface.height - plotOffset.bottom, height: contentHeight }; + if (pos == "left") { + axis.box = { left: plotOffset.left + axisMargin, width: lw }; + plotOffset.left += lw + axisMargin; } - } else { - contentWidth += padding; - if (axisPosition === "right") { - plotOffset.right += contentWidth + axisMargin; - axis.box = { left: surface.width - plotOffset.right, width: contentWidth }; - } else { - axis.box = { left: plotOffset.left + axisMargin, width: contentWidth }; - plotOffset.left += contentWidth + axisMargin; + else { + plotOffset.right += lw + axisMargin; + axis.box = { left: surface.width - plotOffset.right, width: lw }; } } - axis.position = axisPosition; + // save for future reference + axis.position = pos; axis.tickLength = tickLength; axis.box.padding = padding; axis.innermost = innermost; @@ -1696,12 +1512,13 @@ Licensed under the MIT license. function allocateAxisBoxSecondPhase(axis) { // now that all axis boxes have been placed in one // dimension, we can set the remaining dimension coordinates - if (axis.direction === "x") { - axis.box.left = plotOffset.left - axis.tickWidth / 2; - axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.tickWidth; - } else { - axis.box.top = plotOffset.top - axis.tickHeight / 2; - axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.tickHeight; + if (axis.direction == "x") { + axis.box.left = plotOffset.left - axis.labelWidth / 2; + axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth; + } + else { + axis.box.top = plotOffset.top - axis.labelHeight / 2; + axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight; } } @@ -1710,92 +1527,95 @@ Licensed under the MIT license. // inside the canvas and isn't clipped off var minMargin = options.grid.minBorderMargin, - margins = { x: 0, y: 0 }, i; + axis, i; // check stuff from the plot (FIXME: this should just read // a value from the series, otherwise it's impossible to // customize) if (minMargin == null) { minMargin = 0; - for (i = 0; i < series.length; ++i) { + for (i = 0; i < series.length; ++i) minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2)); - } } - margins.x = margins.y = Math.ceil(minMargin); + var margins = { + left: minMargin, + right: minMargin, + top: minMargin, + bottom: minMargin + }; // check axis labels, note we don't check the actual // labels but instead use the overall width/height to not // jump as much around with replots $.each(allAxes(), function (_, axis) { - var dir = axis.direction; - if (axis.reserveSpace) { - margins[dir] = Math.ceil(Math.max(margins[dir], (dir === "x" ? axis.tickWidth : axis.tickHeight) / 2)); + if (axis.reserveSpace && axis.ticks && axis.ticks.length) { + if (axis.direction === "x") { + margins.left = Math.max(margins.left, axis.labelWidth / 2); + margins.right = Math.max(margins.right, axis.labelWidth / 2); + } else { + margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2); + margins.top = Math.max(margins.top, axis.labelHeight / 2); + } } }); - plotOffset.left = Math.max(margins.x, plotOffset.left); - plotOffset.right = Math.max(margins.x, plotOffset.right); - plotOffset.top = Math.max(margins.y, plotOffset.top); - plotOffset.bottom = Math.max(margins.y, plotOffset.bottom); + plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left)); + plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right)); + plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top)); + plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom)); } function setupGrid() { - var axes = allAxes(), - showGrid = options.grid.show, - margin = options.grid.margin || 0, - i, a; + var i, axes = allAxes(), showGrid = options.grid.show; // Initialize the plot's offset from the edge of the canvas - for (a in plotOffset) { - if (Object.prototype.hasOwnProperty.call(plotOffset, a)) { - plotOffset[a] = isNumeric(margin) ? margin : margin[a] || 0; - } + for (var a in plotOffset) { + var margin = options.grid.margin || 0; + plotOffset[a] = typeof margin == "number" ? margin : margin[a] || 0; } executeHooks(hooks.processOffset, [plotOffset]); // If the grid is visible, add its border width to the offset - for (a in plotOffset) { - if(typeof(options.grid.borderWidth) === "object") { + for (var a in plotOffset) { + if(typeof(options.grid.borderWidth) == "object") { plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0; - } else { + } + else { plotOffset[a] += showGrid ? options.grid.borderWidth : 0; } } - // init axes $.each(axes, function (_, axis) { - axis.show = axis.options.show; - if (axis.show == null) { - axis.show = axis.used; // by default an axis is visible if it's got data - } - - axis.reserveSpace = axis.show || axis.options.reserveSpace; - + var axisOpts = axis.options; + axis.show = axisOpts.show == null ? axis.used : axisOpts.show; + axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace; setRange(axis); }); if (showGrid) { - var allocatedAxes = $.grep(axes, function (axis) { return axis.reserveSpace; }); + var allocatedAxes = $.grep(axes, function (axis) { + return axis.show || axis.reserveSpace; + }); $.each(allocatedAxes, function (_, axis) { // make the ticks setupTickGeneration(axis); setTicks(axis); snapRangeToTicks(axis, axis.ticks); + // find labelWidth/Height for axis measureTickLabels(axis); }); // with all dimensions calculated, we can compute the // axis bounding boxes, start from the outside // (reverse order) - for (i = allocatedAxes.length - 1; i >= 0; --i) { + for (i = allocatedAxes.length - 1; i >= 0; --i) allocateAxisBoxFirstPhase(allocatedAxes[i]); - } // make sure we've got enough space for things that // might stick out @@ -1827,19 +1647,18 @@ Licensed under the MIT license. max = +(opts.max != null ? opts.max : axis.datamax), delta = max - min; - if (delta === 0.0) { + if (delta == 0.0) { // degenerate case - var widen = max === 0 ? 1 : 0.01; + var widen = max == 0 ? 1 : 0.01; - if (opts.min == null) { + if (opts.min == null) min -= widen; - } // always widen max if we couldn't widen min to ensure we // don't fall into min == max which doesn't work - if (opts.max == null || opts.min != null) { + if (opts.max == null || opts.min != null) max += widen; - } - } else { + } + else { // consider autoscaling var margin = opts.autoscaleMargin; if (margin != null) { @@ -1847,15 +1666,13 @@ Licensed under the MIT license. min -= delta * margin; // make sure we don't go below zero if all values // are positive - if (min < 0 && axis.datamin != null && axis.datamin >= 0) { + if (min < 0 && axis.datamin != null && axis.datamin >= 0) min = 0; - } } if (opts.max == null) { max += delta * margin; - if (max > 0 && axis.datamax != null && axis.datamax <= 0) { + if (max > 0 && axis.datamax != null && axis.datamax <= 0) max = 0; - } } } } @@ -1868,13 +1685,12 @@ Licensed under the MIT license. // estimate number of ticks var noTicks; - if (isNumeric(opts.ticks) && opts.ticks > 0) { + if (typeof opts.ticks == "number" && opts.ticks > 0) noTicks = opts.ticks; - } else { + else // heuristic based on the model a*sqrt(x) fitted to // some data points that seemed reasonable - noTicks = 0.3 * Math.sqrt(axis.direction === "x" ? surface.width : surface.height); - } + noTicks = 0.3 * Math.sqrt(axis.direction == "x" ? surface.width : surface.height); var delta = (axis.max - axis.min) / noTicks, dec = -Math.floor(Math.log(delta) / Math.LN10), @@ -1913,10 +1729,10 @@ Licensed under the MIT license. axis.tickDecimals = Math.max(0, maxDec != null ? maxDec : dec); axis.tickSize = opts.tickSize || size; - // Time mode was moved to a plug-in in 0.8, but since so many people use this - // we'll add an especially friendly make sure they remembered to include it. + // Time mode was moved to a plug-in in 0.8, and since so many people use it + // we'll add an especially friendly reminder to make sure they included it. - if (opts.mode === "time" && !axis.tickGenerator) { + if (opts.mode == "time" && !axis.tickGenerator) { throw new Error("Time mode requires the flot.time plugin."); } @@ -1938,46 +1754,43 @@ Licensed under the MIT license. v = start + i * axis.tickSize; ticks.push(v); ++i; - } while (v < axis.max && v !== prev); + } while (v < axis.max && v != prev); return ticks; }; - axis.tickFormatter = function (value, axis) { + axis.tickFormatter = function (value, axis) { - var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1; - var formatted = "" + Math.round(value * factor) / factor; + var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1; + var formatted = "" + Math.round(value * factor) / factor; - // If tickDecimals was specified, ensure that we have exactly that - // much precision; otherwise default to the value's own precision. + // If tickDecimals was specified, ensure that we have exactly that + // much precision; otherwise default to the value's own precision. - if (axis.tickDecimals != null) { - var decimal = formatted.indexOf("."); - var precision = decimal === -1 ? 0 : formatted.length - decimal - 1; - if (precision < axis.tickDecimals) { - return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision); - } - } + if (axis.tickDecimals != null) { + var decimal = formatted.indexOf("."); + var precision = decimal == -1 ? 0 : formatted.length - decimal - 1; + if (precision < axis.tickDecimals) { + return (precision ? formatted : formatted + ".") + ("" + factor).substr(1, axis.tickDecimals - precision); + } + } return formatted; }; } - if ($.isFunction(opts.tickFormatter)) { + if ($.isFunction(opts.tickFormatter)) axis.tickFormatter = function (v, axis) { return "" + opts.tickFormatter(v, axis); }; - } if (opts.alignTicksWithAxis != null) { - var otherAxis = (axis.direction === "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; - if (otherAxis && otherAxis.used && otherAxis !== axis) { + var otherAxis = (axis.direction == "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; + if (otherAxis && otherAxis.used && otherAxis != axis) { // consider snapping min/max to outermost nice ticks var niceTicks = axis.tickGenerator(axis); if (niceTicks.length > 0) { - if (opts.min == null) { + if (opts.min == null) axis.min = Math.min(axis.min, niceTicks[0]); - } - if (opts.max == null && niceTicks.length > 1) { + if (opts.max == null && niceTicks.length > 1) axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]); - } } axis.tickGenerator = function (axis) { @@ -2000,9 +1813,8 @@ Licensed under the MIT license. // only proceed if the tick interval rounded // with an extra decimal doesn't give us a // zero at end - if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) { + if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) axis.tickDecimals = extraDec; - } } } } @@ -2010,15 +1822,14 @@ Licensed under the MIT license. function setTicks(axis) { var oticks = axis.options.ticks, ticks = []; - if (oticks == null || (isNumeric(oticks) && oticks > 0)) { + if (oticks == null || (typeof oticks == "number" && oticks > 0)) ticks = axis.tickGenerator(axis); - } else if (oticks) { - if ($.isFunction(oticks)) { + else if (oticks) { + if ($.isFunction(oticks)) // generate the ticks ticks = oticks(axis); - } else { + else ticks = oticks; - } } // clean up/labelify the supplied ticks, copy them over @@ -2027,32 +1838,27 @@ Licensed under the MIT license. for (i = 0; i < ticks.length; ++i) { var label = null; var t = ticks[i]; - if (typeof t === "object") { + if (typeof t == "object") { v = +t[0]; - if (t.length > 1) { + if (t.length > 1) label = t[1]; - } - } else { - v = +t; } - if (label == null) { + else + v = +t; + if (label == null) label = axis.tickFormatter(v, axis); - } - if (!isNaN(v)) { + if (!isNaN(v)) axis.ticks.push({ v: v, label: label }); - } } } function snapRangeToTicks(axis, ticks) { if (axis.options.autoscaleMargin && ticks.length > 0) { // snap to ticks - if (axis.options.min == null) { + if (axis.options.min == null) axis.min = Math.min(axis.min, ticks[0].v); - } - if (axis.options.max == null && ticks.length > 1) { + if (axis.options.max == null && ticks.length > 1) axis.max = Math.max(axis.max, ticks[ticks.length - 1].v); - } } } @@ -2065,9 +1871,8 @@ Licensed under the MIT license. var grid = options.grid; // draw background, if any - if (grid.show && grid.backgroundColor) { + if (grid.show && grid.backgroundColor) drawBackground(); - } if (grid.show && !grid.aboveData) { drawGrid(); @@ -2097,11 +1902,10 @@ Licensed under the MIT license. for (var i = 0; i < axes.length; ++i) { axis = axes[i]; - if (axis.direction === coord) { + if (axis.direction == coord) { key = coord + axis.n + "axis"; - if (!ranges[key] && axis.n === 1) { + if (!ranges[key] && axis.n == 1) key = coord + "axis"; // support x1axis as xaxis - } if (ranges[key]) { from = ranges[key].from; to = ranges[key].to; @@ -2112,7 +1916,7 @@ Licensed under the MIT license. // backwards-compat stuff - to be removed in future if (!ranges[key]) { - axis = coord === "x" ? xaxes[0] : yaxes[0]; + axis = coord == "x" ? xaxes[0] : yaxes[0]; from = ranges[coord + "1"]; to = ranges[coord + "2"]; } @@ -2163,50 +1967,53 @@ Licensed under the MIT license. yrange = extractRange(m, "y"); // fill in missing - if (xrange.from == null) { + if (xrange.from == null) xrange.from = xrange.axis.min; - } - if (xrange.to == null) { + if (xrange.to == null) xrange.to = xrange.axis.max; - } - if (yrange.from == null) { + if (yrange.from == null) yrange.from = yrange.axis.min; - } - if (yrange.to == null) { + if (yrange.to == null) yrange.to = yrange.axis.max; - } // clip if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || - yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) { + yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) continue; - } xrange.from = Math.max(xrange.from, xrange.axis.min); xrange.to = Math.min(xrange.to, xrange.axis.max); yrange.from = Math.max(yrange.from, yrange.axis.min); yrange.to = Math.min(yrange.to, yrange.axis.max); - if (xrange.from === xrange.to && yrange.from === yrange.to) { + var xequal = xrange.from === xrange.to, + yequal = yrange.from === yrange.to; + + if (xequal && yequal) { continue; } // then draw - xrange.from = xrange.axis.p2c(xrange.from); - xrange.to = xrange.axis.p2c(xrange.to); - yrange.from = yrange.axis.p2c(yrange.from); - yrange.to = yrange.axis.p2c(yrange.to); - - if (xrange.from === xrange.to || yrange.from === yrange.to) { - // draw line + xrange.from = Math.floor(xrange.axis.p2c(xrange.from)); + xrange.to = Math.floor(xrange.axis.p2c(xrange.to)); + yrange.from = Math.floor(yrange.axis.p2c(yrange.from)); + yrange.to = Math.floor(yrange.axis.p2c(yrange.to)); + + if (xequal || yequal) { + var lineWidth = m.lineWidth || options.grid.markingsLineWidth, + subPixel = lineWidth % 2 ? 0.5 : 0; ctx.beginPath(); ctx.strokeStyle = m.color || options.grid.markingsColor; - ctx.lineWidth = m.lineWidth || options.grid.markingsLineWidth; - ctx.moveTo(xrange.from, yrange.from); - ctx.lineTo(xrange.to, yrange.to); + ctx.lineWidth = lineWidth; + if (xequal) { + ctx.moveTo(xrange.to + subPixel, yrange.from); + ctx.lineTo(xrange.to + subPixel, yrange.to); + } else { + ctx.moveTo(xrange.from, yrange.to + subPixel); + ctx.lineTo(xrange.to, yrange.to + subPixel); + } ctx.stroke(); } else { - // fill area ctx.fillStyle = m.color || options.grid.markingsColor; ctx.fillRect(xrange.from, yrange.to, xrange.to - xrange.from, @@ -2222,27 +2029,25 @@ Licensed under the MIT license. for (var j = 0; j < axes.length; ++j) { var axis = axes[j], box = axis.box, t = axis.tickLength, x, y, xoff, yoff; - if (!axis.show || axis.ticks.length === 0) { + if (!axis.show || axis.ticks.length == 0) continue; - } ctx.lineWidth = 1; // find the edges - if (axis.direction === "x") { + if (axis.direction == "x") { x = 0; - if (t === "full") { - y = (axis.position === "top" ? 0 : plotHeight); - } else { - y = box.top - plotOffset.top + (axis.position === "top" ? box.height : 0); - } - } else { + if (t == "full") + y = (axis.position == "top" ? 0 : plotHeight); + else + y = box.top - plotOffset.top + (axis.position == "top" ? box.height : 0); + } + else { y = 0; - if (t === "full") { - x = (axis.position === "left" ? 0 : plotWidth); - } else { - x = box.left - plotOffset.left + (axis.position === "left" ? box.width : 0); - } + if (t == "full") + x = (axis.position == "left" ? 0 : plotWidth); + else + x = box.left - plotOffset.left + (axis.position == "left" ? box.width : 0); } // draw tick bar @@ -2250,14 +2055,13 @@ Licensed under the MIT license. ctx.strokeStyle = axis.options.color; ctx.beginPath(); xoff = yoff = 0; - if (axis.direction === "x") { + if (axis.direction == "x") xoff = plotWidth + 1; - } else { + else yoff = plotHeight + 1; - } - if (ctx.lineWidth === 1) { - if (axis.direction === "x") { + if (ctx.lineWidth == 1) { + if (axis.direction == "x") { y = Math.floor(y) + 0.5; } else { x = Math.floor(x) + 0.5; @@ -2279,36 +2083,33 @@ Licensed under the MIT license. xoff = yoff = 0; - if (isNaN(v) || v < axis.min || v > axis.max || ( + if (isNaN(v) || v < axis.min || v > axis.max // skip those lying on the axes if we got a border - t === "full" && ((typeof bw === "object" && bw[axis.position] > 0) || bw > 0) && - (v === axis.min || v === axis.max) - )) { + || (t == "full" + && ((typeof bw == "object" && bw[axis.position] > 0) || bw > 0) + && (v == axis.min || v == axis.max))) continue; - } - if (axis.direction === "x") { + if (axis.direction == "x") { x = axis.p2c(v); - yoff = t === "full" ? -plotHeight : t; + yoff = t == "full" ? -plotHeight : t; - if (axis.position === "top") { + if (axis.position == "top") yoff = -yoff; - } - } else { + } + else { y = axis.p2c(v); - xoff = t === "full" ? -plotWidth : t; + xoff = t == "full" ? -plotWidth : t; - if (axis.position === "left") { + if (axis.position == "left") xoff = -xoff; - } } - if (ctx.lineWidth === 1) { - if (axis.direction === "x") { + if (ctx.lineWidth == 1) { + if (axis.direction == "x") x = Math.floor(x) + 0.5; - } else { + else y = Math.floor(y) + 0.5; - } } ctx.moveTo(x, y); @@ -2324,7 +2125,7 @@ Licensed under the MIT license. // If either borderWidth or borderColor is an object, then draw the border // line by line instead of as one rectangle bc = options.grid.borderColor; - if(typeof bw === "object" || typeof bc === "object") { + if(typeof bw == "object" || typeof bc == "object") { if (typeof bw !== "object") { bw = {top: bw, right: bw, bottom: bw, left: bw}; } @@ -2367,7 +2168,8 @@ Licensed under the MIT license. ctx.lineTo(0- bw.left/2, 0); ctx.stroke(); } - } else { + } + else { ctx.lineWidth = bw; ctx.strokeStyle = options.grid.borderColor; ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw); @@ -2380,48 +2182,31 @@ Licensed under the MIT license. function drawAxisLabels() { $.each(allAxes(), function (_, axis) { - if (!axis.show || axis.ticks.length === 0) { - return; - } - var box = axis.box, - axisOptions = axis.options, - layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + axis.direction + "Axis " + axis.direction + axis.n + "Axis", - labelFont = axisOptions.labelFont || "flot-axis-label axisLabels " + axis.direction + axis.n + "axisLabel", - tickFont = axisOptions.tickFont || "flot-tick-label tickLabel", + legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", + layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, + font = axis.options.font || "flot-tick-label tickLabel", tick, x, y, halign, valign; - surface.removeText(layer); + // Remove text before checking for axis.show and ticks.length; + // otherwise plugins, like flot-tickrotor, that draw their own + // tick labels will end up with both theirs and the defaults. - if (axisOptions.label) { - if (axis.direction === "x") { - if (axisOptions.position === "top") { - surface.addText(layer, box.left + box.width / 2, box.top, axisOptions.label, labelFont, 0, null, "center", "top"); - } else { - surface.addText(layer, box.left + box.width / 2, box.top + box.height, axisOptions.label, labelFont, 0, null, "center", "bottom"); - } - } else { - if (axisOptions.position === "right") { - surface.addText(layer, box.left + box.width, box.top + box.height / 2, axisOptions.label, labelFont, 90, null, "right", "middle"); - } else { - surface.addText(layer, box.left, box.top + box.height / 2, axisOptions.label, labelFont, -90, null, "left", "middle"); - } - } - } + surface.removeText(layer); - // Add labels for the ticks on this axis + if (!axis.show || axis.ticks.length == 0) + return; for (var i = 0; i < axis.ticks.length; ++i) { tick = axis.ticks[i]; - if (!tick.label || tick.v < axis.min || tick.v > axis.max) { + if (!tick.label || tick.v < axis.min || tick.v > axis.max) continue; - } - if (axis.direction === "x") { + if (axis.direction == "x") { halign = "center"; x = plotOffset.left + axis.p2c(tick.v); - if (axis.position === "bottom") { + if (axis.position == "bottom") { y = box.top + box.padding; } else { y = box.top + box.height - box.padding; @@ -2430,7 +2215,7 @@ Licensed under the MIT license. } else { valign = "middle"; y = plotOffset.top + axis.p2c(tick.v); - if (axis.position === "left") { + if (axis.position == "left") { x = box.left + box.width - box.padding; halign = "right"; } else { @@ -2438,21 +2223,18 @@ Licensed under the MIT license. } } - surface.addText(layer, x, y, tick.label, tickFont, null, null, halign, valign); + surface.addText(layer, x, y, tick.label, font, null, null, halign, valign); } }); } function drawSeries(series) { - if (series.lines.show) { + if (series.lines.show) drawSeriesLines(series); - } - if (series.bars.show) { + if (series.bars.show) drawSeriesBars(series); - } - if (series.points.show) { + if (series.points.show) drawSeriesPoints(series); - } } function drawSeriesLines(series) { @@ -2466,74 +2248,68 @@ Licensed under the MIT license. var x1 = points[i - ps], y1 = points[i - ps + 1], x2 = points[i], y2 = points[i + 1]; - if (x1 == null || x2 == null) { + if (x1 == null || x2 == null) continue; - } // clip with ymin if (y1 <= y2 && y1 < axisy.min) { - if (y2 < axisy.min) { + if (y2 < axisy.min) continue; // line segment is outside - } // compute new intersection point x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; y1 = axisy.min; - } else if (y2 <= y1 && y2 < axisy.min) { - if (y1 < axisy.min) { + } + else if (y2 <= y1 && y2 < axisy.min) { + if (y1 < axisy.min) continue; - } x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; y2 = axisy.min; } // clip with ymax if (y1 >= y2 && y1 > axisy.max) { - if (y2 > axisy.max) { + if (y2 > axisy.max) continue; - } x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; y1 = axisy.max; - } else if (y2 >= y1 && y2 > axisy.max) { - if (y1 > axisy.max) { + } + else if (y2 >= y1 && y2 > axisy.max) { + if (y1 > axisy.max) continue; - } x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; y2 = axisy.max; } // clip with xmin if (x1 <= x2 && x1 < axisx.min) { - if (x2 < axisx.min) { + if (x2 < axisx.min) continue; - } y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; x1 = axisx.min; - } else if (x2 <= x1 && x2 < axisx.min) { - if (x1 < axisx.min) { + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) continue; - } y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; x2 = axisx.min; } // clip with xmax if (x1 >= x2 && x1 > axisx.max) { - if (x2 > axisx.max) { + if (x2 > axisx.max) continue; - } y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; x1 = axisx.max; - } else if (x2 >= x1 && x2 > axisx.max) { - if (x1 > axisx.max) { + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) continue; - } y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; x2 = axisx.max; } - if (x1 !== prevx || y1 !== prevy) { + if (x1 != prevx || y1 != prevy) ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); - } prevx = x2; prevy = y2; @@ -2546,16 +2322,15 @@ Licensed under the MIT license. var points = datapoints.points, ps = datapoints.pointsize, bottom = Math.min(Math.max(0, axisy.min), axisy.max), - i = 0, areaOpen = false, + i = 0, top, areaOpen = false, ypos = 1, segmentStart = 0, segmentEnd = 0; // we process each segment in two turns, first forward // direction to sketch out top, then once we hit the // end we go backwards to sketch the bottom while (true) { - if (ps > 0 && i > points.length + ps) { + if (ps > 0 && i > points.length + ps) break; - } i += ps; // ps is negative if going backwards @@ -2572,7 +2347,7 @@ Licensed under the MIT license. continue; } - if (ps < 0 && i === segmentStart + ps) { + if (ps < 0 && i == segmentStart + ps) { // done with the reverse sweep ctx.fill(); areaOpen = false; @@ -2583,38 +2358,35 @@ Licensed under the MIT license. } } - if (x1 == null || x2 == null) { + if (x1 == null || x2 == null) continue; - } // clip x values // clip with xmin if (x1 <= x2 && x1 < axisx.min) { - if (x2 < axisx.min) { + if (x2 < axisx.min) continue; - } y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; x1 = axisx.min; - } else if (x2 <= x1 && x2 < axisx.min) { - if (x1 < axisx.min) { + } + else if (x2 <= x1 && x2 < axisx.min) { + if (x1 < axisx.min) continue; - } y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; x2 = axisx.min; } // clip with xmax if (x1 >= x2 && x1 > axisx.max) { - if (x2 > axisx.max) { + if (x2 > axisx.max) continue; - } y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; x1 = axisx.max; - } else if (x2 >= x1 && x2 > axisx.max) { - if (x1 > axisx.max) { + } + else if (x2 >= x1 && x2 > axisx.max) { + if (x1 > axisx.max) continue; - } y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; x2 = axisx.max; } @@ -2631,7 +2403,8 @@ Licensed under the MIT license. ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); continue; - } else if (y1 <= axisy.min && y2 <= axisy.min) { + } + else if (y1 <= axisy.min && y2 <= axisy.min) { ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); continue; @@ -2650,7 +2423,8 @@ Licensed under the MIT license. if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; y1 = axisy.min; - } else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { + } + else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; y2 = axisy.min; } @@ -2659,14 +2433,15 @@ Licensed under the MIT license. if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; y1 = axisy.max; - } else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { + } + else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; y2 = axisy.max; } // if the x value was changed we got a rectangle // to fill - if (x1 !== x1old) { + if (x1 != x1old) { ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1)); // it goes to (x1, y1), but we fill that below } @@ -2678,7 +2453,7 @@ Licensed under the MIT license. ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); // fill the other rectangle if it's there - if (x2 !== x2old) { + if (x2 != x2old) { ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2)); } @@ -2711,9 +2486,8 @@ Licensed under the MIT license. plotLineArea(series.datapoints, series.xaxis, series.yaxis); } - if (lw > 0) { + if (lw > 0) plotLine(series.datapoints, 0, 0, series.xaxis, series.yaxis); - } ctx.restore(); } @@ -2723,18 +2497,16 @@ Licensed under the MIT license. for (var i = 0; i < points.length; i += ps) { var x = points[i], y = points[i + 1]; - if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) { + if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) continue; - } ctx.beginPath(); x = axisx.p2c(x); y = axisy.p2c(y) + offset; - if (symbol === "circle") { + if (symbol == "circle") ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false); - } else { + else symbol(ctx, x, y, radius, shadow); - } ctx.closePath(); if (fillStyle) { @@ -2758,9 +2530,8 @@ Licensed under the MIT license. // Doing the conditional here allows the shadow setting to still be // optional even with a lineWidth of 0. - if( lw === 0 ) { + if( lw == 0 ) lw = 0.0001; - } if (lw > 0 && sw > 0) { // draw shadow in two steps @@ -2776,14 +2547,14 @@ Licensed under the MIT license. } ctx.lineWidth = lw; - ctx.strokeStyle = series.points.strokeColor || series.color; + ctx.strokeStyle = series.color; plotPoints(series.datapoints, radius, getFillStyle(series.points, series.color), 0, false, series.xaxis, series.yaxis, symbol); ctx.restore(); } - function drawBar(x, y, b, barLeft, barRight, offset, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { + function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { var left, right, bottom, top, drawLeft, drawRight, drawTop, drawBottom, tmp; @@ -2807,7 +2578,8 @@ Licensed under the MIT license. drawLeft = true; drawRight = false; } - } else { + } + else { drawLeft = drawRight = drawTop = true; drawBottom = false; left = x + barLeft; @@ -2827,9 +2599,8 @@ Licensed under the MIT license. // clip if (right < axisx.min || left > axisx.max || - top < axisy.min || bottom > axisy.max) { + top < axisy.min || bottom > axisy.max) return; - } if (left < axisx.min) { left = axisx.min; @@ -2858,13 +2629,8 @@ Licensed under the MIT license. // fill the bar if (fillStyleCallback) { - c.beginPath(); - c.moveTo(left, bottom); - c.lineTo(left, top); - c.lineTo(right, top); - c.lineTo(right, bottom); c.fillStyle = fillStyleCallback(bottom, top); - c.fill(); + c.fillRect(left, top, right - left, bottom - top) } // draw outline @@ -2872,40 +2638,35 @@ Licensed under the MIT license. c.beginPath(); // FIXME: inline moveTo is buggy with excanvas - c.moveTo(left, bottom + offset); - if (drawLeft) { - c.lineTo(left, top + offset); - } else { - c.moveTo(left, top + offset); - } - if (drawTop) { - c.lineTo(right, top + offset); - } else { - c.moveTo(right, top + offset); - } - if (drawRight) { - c.lineTo(right, bottom + offset); - } else { - c.moveTo(right, bottom + offset); - } - if (drawBottom) { - c.lineTo(left, bottom + offset); - } else { - c.moveTo(left, bottom + offset); - } + c.moveTo(left, bottom); + if (drawLeft) + c.lineTo(left, top); + else + c.moveTo(left, top); + if (drawTop) + c.lineTo(right, top); + else + c.moveTo(right, top); + if (drawRight) + c.lineTo(right, bottom); + else + c.moveTo(right, bottom); + if (drawBottom) + c.lineTo(left, bottom); + else + c.moveTo(left, bottom); c.stroke(); } } function drawSeriesBars(series) { - function plotBars(datapoints, barLeft, barRight, offset, fillStyleCallback, axisx, axisy) { + function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) { var points = datapoints.points, ps = datapoints.pointsize; for (var i = 0; i < points.length; i += ps) { - if (points[i] == null) { + if (points[i] == null) continue; - } - drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, offset, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); + drawBar(points[i], points[i + 1], points[i + 2], barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); } } @@ -2919,53 +2680,53 @@ Licensed under the MIT license. var barLeft; switch (series.bars.align) { - case "left": - barLeft = 0; - break; - case "right": - barLeft = -series.bars.barWidth; - break; - case "center": - barLeft = -series.bars.barWidth / 2; - break; - default: - throw new Error("Invalid bar alignment: " + series.bars.align); + case "left": + barLeft = 0; + break; + case "right": + barLeft = -series.bars.barWidth; + break; + default: + barLeft = -series.bars.barWidth / 2; } var fillStyleCallback = series.bars.fill ? function (bottom, top) { return getFillStyle(series.bars, series.color, bottom, top); } : null; - plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, 0, fillStyleCallback, series.xaxis, series.yaxis); + plotBars(series.datapoints, barLeft, barLeft + series.bars.barWidth, fillStyleCallback, series.xaxis, series.yaxis); ctx.restore(); } function getFillStyle(filloptions, seriesColor, bottom, top) { var fill = filloptions.fill; - if (!fill) { + if (!fill) return null; - } - if (filloptions.fillColor) { + if (filloptions.fillColor) return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); - } var c = $.color.parse(seriesColor); - c.a = isNumeric(fill) ? fill : 0.4; + c.a = typeof fill == "number" ? fill : 0.4; c.normalize(); return c.toString(); } function insertLegend() { - placeholder.find(".legend").remove(); + if (options.legend.container != null) { + $(options.legend.container).html(""); + } else { + placeholder.find(".legend").remove(); + } if (!options.legend.show) { return; } - var entries = [], lf = options.legend.labelFormatter, s, label, i; + var fragments = [], entries = [], rowStarted = false, + lf = options.legend.labelFormatter, s, label; // Build a list of legend entries, with each having a label and a color - for (i = 0; i < series.length; ++i) { + for (var i = 0; i < series.length; ++i) { s = series[i]; if (s.label) { label = lf ? lf(s.label, s) : s.label; @@ -2978,24 +2739,18 @@ Licensed under the MIT license. } } - // No entries implies no legend - - if (entries.length === 0) { - return; - } - // Sort the legend using either the default or a custom comparator if (options.legend.sorted) { if ($.isFunction(options.legend.sorted)) { entries.sort(options.legend.sorted); - } else if (options.legend.sorted === "reverse") { - entries.reverse(); + } else if (options.legend.sorted == "reverse") { + entries.reverse(); } else { - var ascending = options.legend.sorted !== "descending"; + var ascending = options.legend.sorted != "descending"; entries.sort(function(a, b) { - return a.label === b.label ? 0 : ( - (a.label < b.label) !== ascending ? 1 : -1 // Logical XOR + return a.label == b.label ? 0 : ( + ((a.label < b.label) != ascending ? 1 : -1) // Logical XOR ); }); } @@ -3003,86 +2758,63 @@ Licensed under the MIT license. // Generate markup for the list of entries, in their final order - var table = $("
").css({ - "font-size": "smaller", - "color": options.grid.color - }), rowBuffer = null; - - for (i = 0; i < entries.length; ++i) { + for (var i = 0; i < entries.length; ++i) { var entry = entries[i]; - if (i % options.legend.noColumns === 0) { - if (rowBuffer !== null) { - table.append(rowBuffer); - } - rowBuffer = $(""); + if (i % options.legend.noColumns == 0) { + if (rowStarted) + fragments.push(''); + fragments.push(''); + rowStarted = true; } - var colorbox = $("
").css({ - "width": "4px", - "height": 0, - "border": "5px solid " + entry.color, - "overflow": "hidden" - }), - - borderbox = $("
").css({ - "border": "1px solid " + options.legend.labelBoxBorderColor, - "padding": "1px" - }); - - rowBuffer.append( - $("").addClass("legendColorBox").append(borderbox.append(colorbox)), - $("").addClass("legendLabel").html(entry.label) + fragments.push( + '
' + + '' + entry.label + '' ); } - table.append(rowBuffer); + if (rowStarted) + fragments.push(''); - if (options.legend.container != null) { + if (fragments.length == 0) + return; + + var table = '' + fragments.join("") + '
'; + if (options.legend.container != null) $(options.legend.container).html(table); - } else { - var pos = {"position": "absolute"}, + else { + var pos = "", p = options.legend.position, m = options.legend.margin; - if (m[0] == null) { + if (m[0] == null) m = [m, m]; - } - if (p.charAt(0) === "n") { - pos.top = (m[1] + plotOffset.top) + "px"; - } else if (p.charAt(0) === "s") { - pos.bottom = (m[1] + plotOffset.bottom) + "px"; - } - if (p.charAt(1) === "e") { - pos.right = (m[0] + plotOffset.right) + "px"; - } else if (p.charAt(1) === "w") { - pos.left = (m[0] + plotOffset.left) + "px"; - } - var legend = $("
").addClass("legend").append(table.css(pos)).appendTo(placeholder); - if (options.legend.backgroundOpacity !== 0.0) { + if (p.charAt(0) == "n") + pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; + else if (p.charAt(0) == "s") + pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; + if (p.charAt(1) == "e") + pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; + else if (p.charAt(1) == "w") + pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; + var legend = $('
' + table.replace('style="', 'style="position:absolute;' + pos +';') + '
').appendTo(placeholder); + if (options.legend.backgroundOpacity != 0.0) { // put in the transparent background // separately to avoid blended labels and // label boxes var c = options.legend.backgroundColor; if (c == null) { c = options.grid.backgroundColor; - if (c && typeof c === "string") { + if (c && typeof c == "string") c = $.color.parse(c); - } else { - c = $.color.extract(legend, "background-color"); - } + else + c = $.color.extract(legend, 'background-color'); c.a = 1; c = c.toString(); } var div = legend.children(); - - // Position also applies to this - $("
").css(pos).css({ - "width": div.width() + "px", - "height": div.height() + "px", - "background-color": c, - "opacity": options.legend.backgroundOpacity - }).prependTo(legend); + $('
').prependTo(legend).css('opacity', options.legend.backgroundOpacity); } } } @@ -3097,12 +2829,11 @@ Licensed under the MIT license. function findNearbyItem(mouseX, mouseY, seriesFilter) { var maxDistance = options.grid.mouseActiveRadius, smallestDistance = maxDistance * maxDistance + 1, - item = null, i, j, ps; + item = null, foundPoint = false, i, j, ps; for (i = series.length - 1; i >= 0; --i) { - if (!seriesFilter(series[i])) { + if (!seriesFilter(series[i])) continue; - } var s = series[i], axisx = s.xaxis, @@ -3111,35 +2842,27 @@ Licensed under the MIT license. mx = axisx.c2p(mouseX), // precompute some stuff to make the loop faster my = axisy.c2p(mouseY), maxx = maxDistance / axisx.scale, - maxy = maxDistance / axisy.scale, - x, y; + maxy = maxDistance / axisy.scale; ps = s.datapoints.pointsize; // with inverse transforms, we can't use the maxx/maxy // optimization, sadly - if (axisx.options.inverseTransform) { + if (axisx.options.inverseTransform) maxx = Number.MAX_VALUE; - } - if (axisy.options.inverseTransform) { + if (axisy.options.inverseTransform) maxy = Number.MAX_VALUE; - } if (s.lines.show || s.points.show) { for (j = 0; j < points.length; j += ps) { - - x = points[j]; - y = points[j + 1]; - - if (x == null) { + var x = points[j], y = points[j + 1]; + if (x == null) continue; - } // For points and lines, the cursor must be within a // certain distance to the data point if (x - mx > maxx || x - mx < -maxx || - y - my > maxy || y - my < -maxy) { + y - my > maxy || y - my < -maxy) continue; - } // We have to calculate distances in pixels, not in // data units, because the scales of the axes may be different @@ -3157,25 +2880,34 @@ Licensed under the MIT license. } if (s.bars.show && !item) { // no other point can be nearby - var barLeft = s.bars.align === "left" ? 0 : -s.bars.barWidth/2, - barRight = barLeft + s.bars.barWidth; + + var barLeft, barRight; + + switch (s.bars.align) { + case "left": + barLeft = 0; + break; + case "right": + barLeft = -s.bars.barWidth; + break; + default: + barLeft = -s.bars.barWidth / 2; + } + + barRight = barLeft + s.bars.barWidth; for (j = 0; j < points.length; j += ps) { - x = points[j]; - y = points[j + 1]; - var b = points[j + 2]; - if (x == null) { + var x = points[j], y = points[j + 1], b = points[j + 2]; + if (x == null) continue; - } // for a bar graph, the cursor must be inside the bar if (series[i].bars.horizontal ? (mx <= Math.max(b, x) && mx >= Math.min(b, x) && my >= y + barLeft && my <= y + barRight) : (mx >= x + barLeft && mx <= x + barRight && - my >= Math.min(b, y) && my <= Math.max(b, y))) { - item = [i, j / ps]; - } + my >= Math.min(b, y) && my <= Math.max(b, y))) + item = [i, j / ps]; } } } @@ -3195,22 +2927,20 @@ Licensed under the MIT license. } function onMouseMove(e) { - if (options.grid.hoverable) { + if (options.grid.hoverable) triggerClickHoverEvent("plothover", e, - function (s) { return s.hoverable !== false; }); - } + function (s) { return s["hoverable"] != false; }); } function onMouseLeave(e) { - if (options.grid.hoverable) { + if (options.grid.hoverable) triggerClickHoverEvent("plothover", e, - function () { return false; }); - } + function (s) { return false; }); } function onClick(e) { triggerClickHoverEvent("plotclick", e, - function (s) { return s.clickable !== false; }); + function (s) { return s["clickable"] != false; }); } // trigger click or hover event (they send the same parameters @@ -3236,18 +2966,15 @@ Licensed under the MIT license. // clear auto-highlights for (var i = 0; i < highlights.length; ++i) { var h = highlights[i]; - if (h.auto === eventname && !( - item && h.series === item.series && - h.point[0] === item.datapoint[0] && - h.point[1] === item.datapoint[1] - )) { + if (h.auto == eventname && + !(item && h.series == item.series && + h.point[0] == item.datapoint[0] && + h.point[1] == item.datapoint[1])) unhighlight(h.series, h.point); - } } - if (item) { + if (item) highlight(item.series, item.datapoint, eventname); - } } placeholder.trigger(eventname, [ pos, item ]); @@ -3255,14 +2982,13 @@ Licensed under the MIT license. function triggerRedrawOverlay() { var t = options.interaction.redrawOverlayInterval; - if (t === -1) { // skip event queue + if (t == -1) { // skip event queue drawOverlay(); return; } - if (!redrawTimeout) { + if (!redrawTimeout) redrawTimeout = setTimeout(drawOverlay, t); - } } function drawOverlay() { @@ -3277,11 +3003,10 @@ Licensed under the MIT license. for (i = 0; i < highlights.length; ++i) { hi = highlights[i]; - if (hi.series.bars.show) { + if (hi.series.bars.show) drawBarHighlight(hi.series, hi.point); - } else { + else drawPointHighlight(hi.series, hi.point); - } } octx.restore(); @@ -3289,22 +3014,22 @@ Licensed under the MIT license. } function highlight(s, point, auto) { - if (isNumeric(s)) { + if (typeof s == "number") s = series[s]; - } - if (isNumeric(point)) { + if (typeof point == "number") { var ps = s.datapoints.pointsize; point = s.datapoints.points.slice(ps * point, ps * (point + 1)); } var i = indexOfHighlight(s, point); - if (i === -1) { + if (i == -1) { highlights.push({ series: s, point: point, auto: auto }); + triggerRedrawOverlay(); - } else if (!auto) { - highlights[i].auto = false; } + else if (!auto) + highlights[i].auto = false; } function unhighlight(s, point) { @@ -3314,18 +3039,18 @@ Licensed under the MIT license. return; } - if (isNumeric(s)) { + if (typeof s == "number") s = series[s]; - } - if (isNumeric(point)) { + if (typeof point == "number") { var ps = s.datapoints.pointsize; point = s.datapoints.points.slice(ps * point, ps * (point + 1)); } var i = indexOfHighlight(s, point); - if (i !== -1) { + if (i != -1) { highlights.splice(i, 1); + triggerRedrawOverlay(); } } @@ -3333,9 +3058,9 @@ Licensed under the MIT license. function indexOfHighlight(s, p) { for (var i = 0; i < highlights.length; ++i) { var h = highlights[i]; - if (h.series === s && h.point[0] === p[0] && h.point[1] === p[1]) { + if (h.series == s && h.point[0] == p[0] + && h.point[1] == p[1]) return i; - } } return -1; } @@ -3343,52 +3068,54 @@ Licensed under the MIT license. function drawPointHighlight(series, point) { var x = point[0], y = point[1], axisx = series.xaxis, axisy = series.yaxis, - highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale("a", 0.5).toString(); + highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(); - if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) { + if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) return; - } - var pointRadius; - var radius; - if (series.points.show) { - pointRadius = series.points.radius + series.points.lineWidth / 2; - radius = 1.5 * pointRadius; - } else { - pointRadius = series.points.radius; - radius = 0.5 * pointRadius; - } + var pointRadius = series.points.radius + series.points.lineWidth / 2; octx.lineWidth = pointRadius; octx.strokeStyle = highlightColor; + var radius = 1.5 * pointRadius; x = axisx.p2c(x); y = axisy.p2c(y); octx.beginPath(); - if (series.points.symbol === "circle") { + if (series.points.symbol == "circle") octx.arc(x, y, radius, 0, 2 * Math.PI, false); - } else { + else series.points.symbol(octx, x, y, radius, false); - } octx.closePath(); octx.stroke(); } function drawBarHighlight(series, point) { - var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale("a", 0.5).toString(), + var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(), fillStyle = highlightColor, - barLeft = series.bars.align === "left" ? 0 : -series.bars.barWidth/2; + barLeft; + + switch (series.bars.align) { + case "left": + barLeft = 0; + break; + case "right": + barLeft = -series.bars.barWidth; + break; + default: + barLeft = -series.bars.barWidth / 2; + } octx.lineWidth = series.bars.lineWidth; octx.strokeStyle = highlightColor; drawBar(point[0], point[1], point[2] || 0, barLeft, barLeft + series.bars.barWidth, - 0, function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); + function () { return fillStyle; }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); } function getColorOrGradient(spec, bottom, top, defaultColor) { - if (typeof spec === "string") { + if (typeof spec == "string") return spec; - } else { + else { // assume this is a gradient spec; IE currently only // supports a simple vertical gradient properly, so that's // what we support too @@ -3396,14 +3123,12 @@ Licensed under the MIT license. for (var i = 0, l = spec.colors.length; i < l; ++i) { var c = spec.colors[i]; - if (typeof c !== "string") { + if (typeof c != "string") { var co = $.color.parse(defaultColor); - if (c.brightness != null) { - co = co.scale("rgb", c.brightness); - } - if (c.opacity != null) { + if (c.brightness != null) + co = co.scale('rgb', c.brightness); + if (c.opacity != null) co.a *= c.opacity; - } c = co.toString(); } gradient.addColorStop(i / (l - 1), c); @@ -3423,7 +3148,7 @@ Licensed under the MIT license. return plot; }; - $.plot.version = "0.9.0-alpha"; + $.plot.version = "0.8.3"; $.plot.plugins = []; @@ -3440,4 +3165,4 @@ Licensed under the MIT license. return base * Math.floor(n / base); } -})(jQuery); \ No newline at end of file +})(jQuery); From 8146226d9492eeabc1193663172514da99b49c77 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 29 Oct 2024 07:22:05 +1100 Subject: [PATCH 101/135] skip failing test suite (#181466) --- .../cypress/e2e/investigations/timelines/timelines_table.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/timelines_table.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/timelines_table.cy.ts index 4b8d55065d44e..fe0e60afa785c 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/timelines_table.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/timelines_table.cy.ts @@ -26,7 +26,8 @@ import { clearSearchBar, searchForTimeline, toggleFavoriteFilter } from '../../. const mockTimeline = getTimeline(); const mockFavoritedTimeline = getFavoritedTimeline(); -describe('timeline overview search', { tags: ['@ess', '@serverless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/181466 +describe.skip('timeline overview search', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { deleteTimelines(); // create timeline which is not favorited From c378cd9186278d47d97ca7d328b4c666eb7a9df4 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Mon, 28 Oct 2024 13:35:17 -0700 Subject: [PATCH 102/135] [Global Search] Instantly set `isLoading=true` when search value changes (#197750) ## Summary Close https://github.com/elastic/kibana/issues/77059 This PR solves the bug by setting the `isLoading` flag outside of the block of debounced code whenever the search term changes. This also makes a few slight cleanups to `search_bar.tsx`, which is quite large. I avoided doing any serious cleanups that would make the diff hard to read or detract from the fix. --- .../public/components/search_bar.tsx | 46 ++++++++----------- .../public/telemetry/telemetry.test.tsx | 4 +- 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx index c8ac154b34c9f..6c7eef92c6623 100644 --- a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx +++ b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx @@ -39,10 +39,6 @@ import { PopoverPlaceholder } from './popover_placeholder'; import './search_bar.scss'; import { SearchBarProps } from './types'; -const NoMatchesMessage = (props: { basePathUrl: string }) => { - return ; -}; - const SearchCharLimitExceededMessage = (props: { basePathUrl: string }) => { const charLimitMessage = ( <> @@ -90,17 +86,17 @@ export const SearchBar: FC = (opts) => { // General hooks const [initialLoad, setInitialLoad] = useState(false); const [searchValue, setSearchValue] = useState(''); - const [searchTerm, setSearchTerm] = useState(''); const [searchRef, setSearchRef] = useState(null); const [buttonRef, setButtonRef] = useState(null); const searchSubscription = useRef(null); - const [options, _setOptions] = useState([]); + const [options, setOptions] = useState([]); const [searchableTypes, setSearchableTypes] = useState([]); const [showAppend, setShowAppend] = useState(true); const UNKNOWN_TAG_ID = '__unknown__'; const [isLoading, setIsLoading] = useState(false); const [searchCharLimitExceeded, setSearchCharLimitExceeded] = useState(false); + // Initialize searchableTypes data useEffect(() => { if (initialLoad) { const fetch = async () => { @@ -111,6 +107,11 @@ export const SearchBar: FC = (opts) => { } }, [globalSearch, initialLoad]); + // Whenever searchValue changes, isLoading = true + useEffect(() => { + setIsLoading(true); + }, [searchValue]); + const loadSuggestions = useCallback( (term: string) => { return getSuggestions({ @@ -122,17 +123,13 @@ export const SearchBar: FC = (opts) => { [taggingApi, searchableTypes] ); - const setOptions = useCallback( + const setDecoratedOptions = useCallback( ( _options: GlobalSearchResult[], suggestions: SearchSuggestion[], searchTagIds: string[] = [] ) => { - if (!isMounted()) { - return; - } - - _setOptions([ + setOptions([ ...suggestions.map(suggestionToOption), ..._options.map((option) => resultToOption( @@ -143,7 +140,7 @@ export const SearchBar: FC = (opts) => { ), ]); }, - [isMounted, _setOptions, taggingApi] + [setOptions, taggingApi] ); useDebounce( @@ -163,9 +160,7 @@ export const SearchBar: FC = (opts) => { setSearchCharLimitExceeded(false); } - setIsLoading(true); const suggestions = loadSuggestions(searchValue.toLowerCase()); - setIsLoading(false); let aggregatedResults: GlobalSearchResult[] = []; @@ -187,26 +182,23 @@ export const SearchBar: FC = (opts) => { types: rawParams.filters.types, tags: tagIds, }; - // TODO technically a subtle bug here - // this term won't be set until the next time the debounce is fired - // so the SearchOption won't highlight anything if only one call is fired - // in practice, this is hard to spot, unlikely to happen, and is a negligible issue - setSearchTerm(rawParams.term ?? ''); - setIsLoading(true); + searchSubscription.current = globalSearch.find(searchParams, {}).subscribe({ next: ({ results }) => { + if (!isMounted()) { + return; + } + if (searchValue.length > 0) { aggregatedResults = [...results, ...aggregatedResults].sort(sort.byScore); - setOptions(aggregatedResults, suggestions, searchParams.tags); + setDecoratedOptions(aggregatedResults, suggestions, searchParams.tags); return; } // if searchbar is empty, filter to only applications and sort alphabetically results = results.filter(({ type }: GlobalSearchResult) => type === 'application'); - aggregatedResults = [...results, ...aggregatedResults].sort(sort.byTitle); - - setOptions(aggregatedResults, suggestions, searchParams.tags); + setDecoratedOptions(aggregatedResults, suggestions, searchParams.tags); }, error: (err) => { setIsLoading(false); @@ -371,7 +363,7 @@ export const SearchBar: FC = (opts) => { className="kbnSearchBar" popoverButtonBreakpoints={['xs', 's']} singleSelection={true} - renderOption={(option) => euiSelectableTemplateSitewideRenderOptions(option, searchTerm)} + renderOption={(option) => euiSelectableTemplateSitewideRenderOptions(option, searchValue)} listProps={{ className: 'eui-yScroll', css: css` @@ -401,7 +393,7 @@ export const SearchBar: FC = (opts) => { }} errorMessage={searchCharLimitExceeded ? : null} emptyMessage={} - noMatchesMessage={} + noMatchesMessage={} popoverProps={{ 'data-test-subj': 'nav-search-popover', panelClassName: 'navSearch__panel', diff --git a/x-pack/plugins/global_search_bar/public/telemetry/telemetry.test.tsx b/x-pack/plugins/global_search_bar/public/telemetry/telemetry.test.tsx index 2137679fcf5c3..e4302c1e64aec 100644 --- a/x-pack/plugins/global_search_bar/public/telemetry/telemetry.test.tsx +++ b/x-pack/plugins/global_search_bar/public/telemetry/telemetry.test.tsx @@ -194,9 +194,7 @@ describe('SearchBar', () => { }); it(`tracks the user's search term`, async () => { - searchService.find.mockReturnValueOnce( - of(createBatch('Discover', { id: 'My Dashboard', type: 'test' })) - ); + searchService.find.mockReturnValue(of(createBatch('Discover'))); render( From 82ec7ff742295f7f4691f23d989159f6aa9129ed Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 28 Oct 2024 20:36:52 +0000 Subject: [PATCH 103/135] skip flaky suite (#178404) --- .../cypress/e2e/all/alerts_automated_action_results.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts index 4c7c9663b2d40..4444bc0af7b49 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts @@ -11,7 +11,8 @@ import { checkActionItemsInResults, loadRuleAlerts } from '../../tasks/live_quer const UUID_REGEX = '[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}'; -describe('Alert Flyout Automated Action Results', () => { +// FLAKY: https://github.com/elastic/kibana/issues/178404 +describe.skip('Alert Flyout Automated Action Results', () => { let ruleId: string; before(() => { From 98d807cdab80d0c680e458f929375cdedd1d0b64 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 28 Oct 2024 20:38:08 +0000 Subject: [PATCH 104/135] skip flaky suite (#197335) --- .../cypress/e2e/all/alerts_automated_action_results.cy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts index 4444bc0af7b49..cd36950ba3b60 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_automated_action_results.cy.ts @@ -12,6 +12,7 @@ import { checkActionItemsInResults, loadRuleAlerts } from '../../tasks/live_quer const UUID_REGEX = '[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}'; // FLAKY: https://github.com/elastic/kibana/issues/178404 +// FLAKY: https://github.com/elastic/kibana/issues/197335 describe.skip('Alert Flyout Automated Action Results', () => { let ruleId: string; From a652f4f08bae966fedcba990300a3c8c98c7fa4d Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 28 Oct 2024 20:39:55 +0000 Subject: [PATCH 105/135] skip flaky suite (#189038) --- .../single_page_layout/hooks/setup_technology.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts index 958dec6d20a08..0dfb673f97d4d 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts @@ -135,7 +135,8 @@ describe('useAgentless', () => { }); }); -describe('useSetupTechnology', () => { +// FLAKY: https://github.com/elastic/kibana/issues/189038 +describe.skip('useSetupTechnology', () => { const setNewAgentPolicy = jest.fn(); const updateAgentPoliciesMock = jest.fn(); const setSelectedPolicyTabMock = jest.fn(); From 3759a60fa0e987fb35f2bca11769a81be3540b4f Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 28 Oct 2024 20:41:10 +0000 Subject: [PATCH 106/135] skip flaky suite (#192126) --- .../single_page_layout/hooks/setup_technology.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts index 0dfb673f97d4d..4f6da695f260a 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/setup_technology.test.ts @@ -136,6 +136,7 @@ describe('useAgentless', () => { }); // FLAKY: https://github.com/elastic/kibana/issues/189038 +// FLAKY: https://github.com/elastic/kibana/issues/192126 describe.skip('useSetupTechnology', () => { const setNewAgentPolicy = jest.fn(); const updateAgentPoliciesMock = jest.fn(); From 924b72ee7b2635943962da74bca1ec1cc651a4fa Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 28 Oct 2024 20:43:07 +0000 Subject: [PATCH 107/135] skip flaky suite (#197765) --- .../execution_logic/indicator_match_alert_suppression.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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/indicator_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/indicator_match_alert_suppression.ts index 1ecf949b18951..9bbfe6179f397 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/indicator_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/indicator_match_alert_suppression.ts @@ -167,7 +167,8 @@ export default ({ getService }: FtrProviderContext) => { }); cases.forEach(({ eventsCount, threatsCount, title }) => { - describe(`Code execution path: ${title}`, () => { + // FLAKY: https://github.com/elastic/kibana/issues/197765 + describe.skip(`Code execution path: ${title}`, () => { it('should suppress an alert on real rule executions', async () => { const id = uuidv4(); const firstTimestamp = new Date().toISOString(); From e3aa369c3e761f96a000cd081e11c72c05678186 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 28 Oct 2024 20:46:03 +0000 Subject: [PATCH 108/135] skip flaky suite (#189739) --- .../public/components/category/category_form_field.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cases/public/components/category/category_form_field.test.tsx b/x-pack/plugins/cases/public/components/category/category_form_field.test.tsx index 87477a5f84a75..8380276e3e106 100644 --- a/x-pack/plugins/cases/public/components/category/category_form_field.test.tsx +++ b/x-pack/plugins/cases/public/components/category/category_form_field.test.tsx @@ -16,7 +16,8 @@ import { categories } from '../../containers/mock'; import { MAX_CATEGORY_LENGTH } from '../../../common/constants'; import { FormTestComponent } from '../../common/test_utils'; -describe('Category', () => { +// FLAKY: https://github.com/elastic/kibana/issues/189739 +describe.skip('Category', () => { let appMockRender: AppMockRenderer; const onSubmit = jest.fn(); From 7821dd74140d9873c47d5b8650a47d6c50ecc194 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 28 Oct 2024 20:49:24 +0000 Subject: [PATCH 109/135] skip flaky suite (#196766) --- .../apps/observability/pages/alerts/custom_threshold.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/observability_functional/apps/observability/pages/alerts/custom_threshold.ts b/x-pack/test/observability_functional/apps/observability/pages/alerts/custom_threshold.ts index 91cb7eec19ef6..13891653b605e 100644 --- a/x-pack/test/observability_functional/apps/observability/pages/alerts/custom_threshold.ts +++ b/x-pack/test/observability_functional/apps/observability/pages/alerts/custom_threshold.ts @@ -18,7 +18,8 @@ export default ({ getService }: FtrProviderContext) => { const logger = getService('log'); const retry = getService('retry'); - describe('Custom threshold rule', function () { + // FLAKY: https://github.com/elastic/kibana/issues/196766 + describe.skip('Custom threshold rule', function () { this.tags('includeFirefox'); const observability = getService('observability'); From e65a08cc9154f6cf21609ab3f22ea10eef4f7aed Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 28 Oct 2024 20:52:57 +0000 Subject: [PATCH 110/135] skip flaky suite (#174661) --- .../public/components/files/file_attachment_event.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cases/public/components/files/file_attachment_event.test.tsx b/x-pack/plugins/cases/public/components/files/file_attachment_event.test.tsx index 344eab2634cb0..543496622b0c6 100644 --- a/x-pack/plugins/cases/public/components/files/file_attachment_event.test.tsx +++ b/x-pack/plugins/cases/public/components/files/file_attachment_event.test.tsx @@ -16,7 +16,8 @@ import { createAppMockRenderer } from '../../common/mock'; import { basicFileMock } from '../../containers/mock'; import { FileAttachmentEvent } from './file_attachment_event'; -describe('FileAttachmentEvent', () => { +// FLAKY: https://github.com/elastic/kibana/issues/174661 +describe.skip('FileAttachmentEvent', () => { let appMockRender: AppMockRenderer; beforeEach(() => { From be6708bffcb0a264bee29c029c7945ff22fa6761 Mon Sep 17 00:00:00 2001 From: Jared Burgett <147995946+jaredburgettelastic@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:00:06 -0500 Subject: [PATCH 111/135] Added redirect option after Entity CSV upload (#197937) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Added a redirect button to view Entities after a successful Asset Criticality CSV file upload process Additionally, made some small changes to the copy for the Entity Store management workflows Screenshot 2024-10-27 at 9 49 17 PM Co-authored-by: Elastic Machine --- .../components/result_step.tsx | 17 ++++++++++++++--- .../components/entity_store/translations.ts | 2 +- .../pages/entity_store_management_page.tsx | 2 +- .../public/management/links.ts | 2 +- 4 files changed, 17 insertions(+), 6 deletions(-) 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 3a71b48055fcc..07629b2c6e0b6 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 @@ -7,6 +7,7 @@ import { EuiButtonEmpty, + EuiButton, EuiCallOut, EuiCodeBlock, EuiFlexGroup, @@ -17,7 +18,8 @@ import { import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { css } from '@emotion/react'; -import type { BulkUpsertAssetCriticalityRecordsResponse } from '../../../../../common/entity_analytics/asset_criticality/types'; +import { SecurityPageName } from '@kbn/deeplinks-security'; +import type { BulkUpsertAssetCriticalityRecordsResponse } from '../../../../../common/api/entity_analytics'; import { buildAnnotationsFromError } from '../helpers'; import { ScheduleRiskEngineCallout } from './schedule_risk_engine_callout'; @@ -61,7 +63,7 @@ export const AssetCriticalityResultStep: React.FC<{ data-test-subj="asset-criticality-result-step-success" title={ } @@ -69,9 +71,18 @@ export const AssetCriticalityResultStep: React.FC<{ iconType="checkInCircleFilled" > + + + { + + } + diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/translations.ts index 127ff5c88506b..4c113dd533acb 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/translations.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/translations.ts @@ -51,7 +51,7 @@ export const ENABLEMENT_DESCRIPTION_RISK_ENGINE_ONLY = i18n.translate( export const ENABLEMENT_DESCRIPTION_ENTITY_STORE_ONLY = i18n.translate( 'xpack.securitySolution.entityAnalytics.entityStore.enablement.description.store', { - defaultMessage: "Allows comprehensive monitoring of your system's hosts and users.", + defaultMessage: 'Store host and user entities observed in events.', } ); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/pages/entity_store_management_page.tsx b/x-pack/plugins/security_solution/public/entity_analytics/pages/entity_store_management_page.tsx index 8b2292448b13d..1ca2b0e2b02da 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/pages/entity_store_management_page.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/pages/entity_store_management_page.tsx @@ -290,7 +290,7 @@ export const EntityStoreManagementPage = () => { {isEntityStoreFeatureFlagDisabled && } diff --git a/x-pack/plugins/security_solution/public/management/links.ts b/x-pack/plugins/security_solution/public/management/links.ts index 27b5b62eac6f8..d033fdf491ce8 100644 --- a/x-pack/plugins/security_solution/public/management/links.ts +++ b/x-pack/plugins/security_solution/public/management/links.ts @@ -198,7 +198,7 @@ export const links: LinkItem = { id: SecurityPageName.entityAnalyticsEntityStoreManagement, title: ENTITY_STORE, description: i18n.translate('xpack.securitySolution.appLinks.entityStoreDescription', { - defaultMessage: "Allows comprehensive monitoring of your system's hosts and users.", + defaultMessage: 'Store host and user entities observed in events.', }), landingIcon: IconAssetCriticality, path: ENTITY_ANALYTICS_ENTITY_STORE_MANAGEMENT_PATH, From 0de1f95d0e60d20196ef414557a8432ed719406f Mon Sep 17 00:00:00 2001 From: "elastic-renovate-prod[bot]" <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Mon, 28 Oct 2024 18:47:42 -0500 Subject: [PATCH 112/135] Update dependency msw to ^2.4.12 (main) (#198060) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [msw](https://mswjs.io) ([source](https://togithub.com/mswjs/msw)) | devDependencies | patch | [`^2.4.11` -> `^2.4.12`](https://renovatebot.com/diffs/npm/msw/2.4.11/2.4.12) | `2.5.2` (+3) | --- ### Release Notes
mswjs/msw (msw) ### [`v2.4.12`](https://togithub.com/mswjs/msw/releases/tag/v2.4.12) [Compare Source](https://togithub.com/mswjs/msw/compare/v2.4.11...v2.4.12) #### v2.4.12 (2024-10-21) ##### Bug Fixes - **node:** preserve headers instanceof when recording raw headers ([#​2321](https://togithub.com/mswjs/msw/issues/2321)) ([`a58a300`](https://togithub.com/mswjs/msw/commit/a58a300687a48e13c0268403a71183cf7825f748)) [@​paoloricciuti](https://togithub.com/paoloricciuti)
--- ### 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 [Renovate Bot](https://togithub.com/renovatebot/renovate). Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 103 +++++++++++++++++++++++---------------------------- 2 files changed, 47 insertions(+), 58 deletions(-) diff --git a/package.json b/package.json index 0205652b04a20..09e19ab86b1ca 100644 --- a/package.json +++ b/package.json @@ -1765,7 +1765,7 @@ "mochawesome-merge": "^4.3.0", "mock-fs": "^5.1.2", "ms-chromium-edge-driver": "^0.5.1", - "msw": "^2.4.11", + "msw": "^2.4.12", "multistream": "^4.1.0", "mutation-observer": "^1.0.3", "native-hdr-histogram": "^1.0.0", diff --git a/yarn.lock b/yarn.lock index a1a3d604833c9..ce86d0b1e6d77 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2893,42 +2893,38 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== -"@inquirer/confirm@^3.0.0": - version "3.1.8" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.8.tgz#db80f23f775d9b980c6de2425dde39f9786bf1d3" - integrity sha512-f3INZ+ca4dQdn+MQiq1yP/mOIR/Oc8BLRYuDh6ciToWd6z4W8yArfzjBCMQ0BPY8PcJKwZxGIt8Z6yNT32eSTw== - dependencies: - "@inquirer/core" "^8.2.1" - "@inquirer/type" "^1.3.2" - -"@inquirer/core@^8.2.1": - version "8.2.1" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-8.2.1.tgz#ee92c2bf25f378819f56290f8ed8bfef8c6cc94d" - integrity sha512-TIcuQMn2qrtyYe0j136UpHeYpk7AcR/trKeT/7YY0vRgcS9YSfJuQ2+PudPhSofLLsHNnRYAHScQCcVZrJkMqA== - dependencies: - "@inquirer/figures" "^1.0.2" - "@inquirer/type" "^1.3.2" - "@types/mute-stream" "^0.0.4" - "@types/node" "^20.12.12" - "@types/wrap-ansi" "^3.0.0" +"@inquirer/confirm@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.0.0.tgz#9ecf8214452c48e8061aed0d513964f05c92d4a3" + integrity sha512-6QEzj6bZg8atviRIL+pR0tODC854cYSjvZxkyCarr8DVaOJPEyuGys7GmEG3W0Rb8kKSQec7P6okt0sJvNneFw== + dependencies: + "@inquirer/core" "^10.0.0" + "@inquirer/type" "^3.0.0" + +"@inquirer/core@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.0.0.tgz#aa821527e8f6f82990b3fa18a35f8489ffb02c5f" + integrity sha512-7dwoKCGvgZGHWTZfOj2KLmbIAIdiXP9NTrwGaTO/XDfKMEmyBahZpnombiG6JDHmiOrmK3GLEJRXrWExXCDLmQ== + dependencies: + "@inquirer/figures" "^1.0.7" + "@inquirer/type" "^3.0.0" ansi-escapes "^4.3.2" - chalk "^4.1.2" - cli-spinners "^2.9.2" cli-width "^4.1.0" - mute-stream "^1.0.0" + mute-stream "^2.0.0" signal-exit "^4.1.0" strip-ansi "^6.0.1" wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.2" -"@inquirer/figures@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.2.tgz#a6af5e9f9969efb9ed3469130566315c36506b8a" - integrity sha512-4F1MBwVr3c/m4bAUef6LgkvBfSjzwH+OfldgHqcuacWwSUetFebM2wi58WfG9uk1rR98U6GwLed4asLJbwdV5w== +"@inquirer/figures@^1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.7.tgz#d050ccc0eabfacc0248c4ff647a9dfba1b01594b" + integrity sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw== -"@inquirer/type@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.3.2.tgz#439b0b50c152c89fd369d2a17eff54869b4d79b8" - integrity sha512-5Frickan9c89QbPkSu6I6y8p+9eR6hZkdPahGmNDsTFX8FHLPAozyzCZMKUeW8FyYwnlCKUjqIEqxY+UctARiw== +"@inquirer/type@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.0.tgz#1762ebe667ec1d838012b20bf0cf90b841ba68bc" + integrity sha512-YYykfbw/lefC7yKj7nanzQXILM7r3suIvyFlCcMskc99axmsSewXWkAfXKwMbgxL76iAFVmRwmYdwNZNc8gjog== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -7780,10 +7776,10 @@ express "^4.18.2" strict-event-emitter "^0.5.1" -"@mswjs/interceptors@^0.35.8": - version "0.35.8" - resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.35.8.tgz#f36e5907e05593e33037ef4519aac7815fa3509f" - integrity sha512-PFfqpHplKa7KMdoQdj5td03uG05VK2Ng1dG0sP4pT9h0dGSX2v9txYt/AnrzPb/vAmfyBBC0NQV7VaBEX+efgQ== +"@mswjs/interceptors@^0.36.5": + version "0.36.5" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.36.5.tgz#c0fc6970a7a9f8c7b9f4c122dbab3827e4cc19a5" + integrity sha512-aQ8WF5zQwOdcxLsxSEk9Jd01GgGb80xxqCaiDDlewhtwqpSm8MOvUHslwPydVirasdW09++NxDNNftm1vLY8yA== dependencies: "@open-draft/deferred-promise" "^2.2.0" "@open-draft/logger" "^0.3.0" @@ -10936,13 +10932,6 @@ resolved "https://registry.yarnpkg.com/@types/mustache/-/mustache-0.8.31.tgz#7c86cbf74f7733f9e3bdc28817623927eb386616" integrity sha512-72flCZJkEJHPwhmpHgg4a0ZBLssMhg5NB0yltRblRlZMo4py3B/u/d7icevc4EeN9MPQUo/dPtuVOoVy9ih6cQ== -"@types/mute-stream@^0.0.4": - version "0.0.4" - resolved "https://registry.yarnpkg.com/@types/mute-stream/-/mute-stream-0.0.4.tgz#77208e56a08767af6c5e1237be8888e2f255c478" - integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== - dependencies: - "@types/node" "*" - "@types/nock@^10.0.3": version "10.0.3" resolved "https://registry.yarnpkg.com/@types/nock/-/nock-10.0.3.tgz#dab1d18ffbccfbf2db811dab9584304eeb6e1c4c" @@ -10980,7 +10969,7 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@14 || 16 || 17", "@types/node@20.10.5", "@types/node@>= 8", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0", "@types/node@^18.0.0", "@types/node@^18.11.18", "@types/node@^20.12.12": +"@types/node@*", "@types/node@14 || 16 || 17", "@types/node@20.10.5", "@types/node@>= 8", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.14.20 || ^16.0.0", "@types/node@^18.0.0", "@types/node@^18.11.18": version "20.10.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== @@ -11609,11 +11598,6 @@ tapable "^2.2.0" webpack "^5" -"@types/wrap-ansi@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" - integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== - "@types/ws@*", "@types/ws@^8.5.1": version "8.5.3" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" @@ -14380,7 +14364,7 @@ cli-progress@^3.12.0: dependencies: string-width "^4.2.3" -cli-spinners@^2.2.0, cli-spinners@^2.5.0, cli-spinners@^2.9.2: +cli-spinners@^2.2.0, cli-spinners@^2.5.0: version "2.9.2" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== @@ -23878,16 +23862,16 @@ msgpackr@^1.9.9: optionalDependencies: msgpackr-extract "^3.0.2" -msw@^2.4.11: - version "2.4.11" - resolved "https://registry.yarnpkg.com/msw/-/msw-2.4.11.tgz#17001366c7c8de1540436d06d194f8facffed0f4" - integrity sha512-TVEw9NOPTc6ufOQLJ53234S9NBRxQbu7xFMxs+OCP43JQcNEIOKiZHxEm2nDzYIrwccoIhUxUf8wr99SukD76A== +msw@^2.4.12: + version "2.5.2" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.5.2.tgz#dfce10b68dbabc2d5dafeb6d7fb82c3c7073a4d1" + integrity sha512-eBsFgU30NYtrfC62XzS1rdAzFK+Br0zKU4ORqD9Qliq86362DWZyPiD6FLfMgy0Ktik83DPTXmqPMz2bqwmJdA== dependencies: "@bundled-es-modules/cookie" "^2.0.0" "@bundled-es-modules/statuses" "^1.0.1" "@bundled-es-modules/tough-cookie" "^0.1.6" - "@inquirer/confirm" "^3.0.0" - "@mswjs/interceptors" "^0.35.8" + "@inquirer/confirm" "^5.0.0" + "@mswjs/interceptors" "^0.36.5" "@open-draft/until" "^2.1.0" "@types/cookie" "^0.6.0" "@types/statuses" "^2.0.4" @@ -23955,10 +23939,10 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -mute-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" - integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== +mute-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" + integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== nano-css@^5.2.1: version "5.2.1" @@ -32991,6 +32975,11 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yoctocolors-cjs@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" + integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== + z-schema@^5.0.1: version "5.0.2" resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-5.0.2.tgz#f410394b2c9fcb9edaf6a7511491c0bb4e89a504" From 8700807899000a86a30f0bdbee59d64f07e31d15 Mon Sep 17 00:00:00 2001 From: Brad White Date: Mon, 28 Oct 2024 18:40:12 -0600 Subject: [PATCH 113/135] [CI] Disable UpdateCLI workflow on forks (#196624) ## Summary The UpdateCLI workflow is running against forks when it shouldn't be: https://github.com/Ikuni17/kibana/actions/runs/11359905941 --- .github/workflows/updatecli-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/updatecli-compose.yml b/.github/workflows/updatecli-compose.yml index cbab42d3a63b1..44a937db3fa6d 100644 --- a/.github/workflows/updatecli-compose.yml +++ b/.github/workflows/updatecli-compose.yml @@ -11,6 +11,7 @@ permissions: jobs: compose: + if: github.event.repository.fork == false runs-on: ubuntu-latest permissions: contents: write From 686b0214cefd96137c5a87ef4bad61ddbbcea5c0 Mon Sep 17 00:00:00 2001 From: Brad White Date: Mon, 28 Oct 2024 18:44:36 -0600 Subject: [PATCH 114/135] Fix Dev Container KBN_DIR (#195810) ## Summary In #193488, `KBN_DIR` was changed to be a dynamic variable. It wasn't being properly propagated through the build process in the Dockerfile and the full path to `env.sh` wasn't being set. This passes the directory as a build `ARG` as well to fix the path. --- .devcontainer/Dockerfile | 6 ++++-- .devcontainer/devcontainer.json | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 5f925468ac716..725570d958f0c 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,5 +1,7 @@ FROM mcr.microsoft.com/devcontainers/base:ubuntu-22.04 +ARG KBN_DIR + ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8 ENV HOME=/home/vscode ENV NVM_DIR=${HOME}/nvm @@ -67,8 +69,8 @@ RUN mkdir -p $NVM_DIR && \ USER root # Reload the env everytime a new shell is opened incase the .env file changed. -RUN echo "source $KBN_DIR/.devcontainer/scripts/env.sh" >> ${HOME}/.bashrc && \ - echo "source $KBN_DIR/.devcontainer/scripts/env.sh" >> ${HOME}/.zshrc +RUN echo "source ${KBN_DIR}/.devcontainer/scripts/env.sh" >> ${HOME}/.bashrc && \ + echo "source ${KBN_DIR}/.devcontainer/scripts/env.sh" >> ${HOME}/.zshrc # This is for documentation. Ports are exposed via devcontainer.json EXPOSE 9200 5601 9229 9230 9231 diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 932c16ddb293d..1b8f51120dae9 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,10 @@ "name": "Kibana", "build": { "dockerfile": "Dockerfile", - "context": ".." + "context": "..", + "args": { + "KBN_DIR": "${containerWorkspaceFolder}" + } }, "customizations": { "vscode": { From 82da5111fef0907226a23371eb229166493c2c9e Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 29 Oct 2024 17:25:50 +1100 Subject: [PATCH 115/135] [api-docs] 2024-10-29 Daily api_docs build (#198103) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/875 --- 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.devdocs.json | 6 +-- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.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_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.mdx | 2 +- api_docs/data_quality.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_usage.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 | 4 +- 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/discover_shared.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/entities_data_access.mdx | 2 +- api_docs/entity_manager.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/esql.mdx | 2 +- api_docs/esql_data_grid.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/fields_metadata.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/inference.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/integration_assistant.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/inventory.mdx | 2 +- api_docs/investigate.mdx | 2 +- api_docs/investigate_app.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_ai_assistant.mdx | 2 +- api_docs/kbn_ai_assistant_common.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_comparators.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerting_types.devdocs.json | 2 +- api_docs/kbn_alerting_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_grouping.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_collection_utils.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_types.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_avc_banner.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_cbor.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 +- .../kbn_cloud_security_posture.devdocs.json | 13 +++++- api_docs/kbn_cloud_security_posture.mdx | 4 +- .../kbn_cloud_security_posture_common.mdx | 2 +- api_docs/kbn_cloud_security_posture_graph.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 +- ...ent_management_content_insights_public.mdx | 2 +- ...ent_management_content_insights_server.mdx | 2 +- ...bn_content_management_favorites_public.mdx | 2 +- ...bn_content_management_favorites_server.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 +- .../kbn_content_management_user_profiles.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_feature_flags_browser.mdx | 2 +- ...bn_core_feature_flags_browser_internal.mdx | 2 +- .../kbn_core_feature_flags_browser_mocks.mdx | 2 +- api_docs/kbn_core_feature_flags_server.mdx | 2 +- ...kbn_core_feature_flags_server_internal.mdx | 2 +- .../kbn_core_feature_flags_server_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 +- ...core_saved_objects_api_server.devdocs.json | 44 ------------------- .../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 +- ...kbn_core_saved_objects_server.devdocs.json | 44 ------------------- 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_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.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 +- .../kbn_discover_contextual_components.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_entities_schema.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_editor.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 +- ...tr_common_functional_services.devdocs.json | 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_grid_layout.mdx | 2 +- api_docs/kbn_grouping.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 +- .../kbn_index_management_shared_types.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_investigation_shared.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_ipynb.mdx | 2 +- api_docs/kbn_item_buffer.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_json_schemas.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- api_docs/kbn_language_documentation.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 | 4 +- ...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_manifest.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_field_stats_flyout.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_parse_interval.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_ml_validators.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_object_versioning_utils.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_rule_utils.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_observability_logs_overview.mdx | 2 +- ...kbn_observability_synthetics_test_data.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_product_doc_artifact_builder.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_hooks.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_recently_accessed.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 +- .../kbn_response_ops_feature_flag_service.mdx | 2 +- api_docs/kbn_response_ops_rule_params.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rollup.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_screenshotting_server.mdx | 2 +- api_docs/kbn_search_api_keys_components.mdx | 2 +- api_docs/kbn_search_api_keys_server.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_search_shared_ui.mdx | 2 +- api_docs/kbn_search_types.mdx | 2 +- api_docs/kbn_security_api_key_management.mdx | 2 +- api_docs/kbn_security_authorization_core.mdx | 2 +- ...kbn_security_authorization_core_common.mdx | 2 +- api_docs/kbn_security_form_components.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 +- .../kbn_security_role_management_model.mdx | 2 +- api_docs/kbn_security_solution_common.mdx | 2 +- ...kbn_security_solution_distribution_bar.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 +- api_docs/kbn_security_ui_components.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_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 +- .../kbn_server_route_repository_client.mdx | 2 +- .../kbn_server_route_repository_utils.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_table_persist.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_predicates.mdx | 2 +- api_docs/kbn_sse_utils.mdx | 2 +- api_docs/kbn_sse_utils_client.mdx | 2 +- api_docs/kbn_sse_utils_server.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_synthetics_e2e.mdx | 2 +- api_docs/kbn_synthetics_private_location.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_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_transpose_utils.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_try_in_console.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_unsaved_changes_prompt.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.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_data_access.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 | 4 +- 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 | 10 ++--- 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_assistant.mdx | 2 +- api_docs/search_connectors.mdx | 2 +- api_docs/search_homepage.mdx | 2 +- api_docs/search_indices.mdx | 2 +- api_docs/search_inference_endpoints.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.mdx | 2 +- api_docs/security.mdx | 2 +- 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/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 +- 764 files changed, 783 insertions(+), 860 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 8a8ae5631dca2..2d75da66a0b43 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-10-27 +date: 2024-10-29 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 1ed8c5a686eb9..da5a3d8bcdf78 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-10-27 +date: 2024-10-29 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 c14e3705bd2e9..5ee081f33521b 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-10-27 +date: 2024-10-29 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 1788e8089ee2e..83acd6d943974 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 298ef15ab0e39..55610edc6e85a 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -3302,7 +3302,7 @@ "label": "monitoring", "description": [], "signature": [ - "Readonly<{} & { run: Readonly<{} & { history: Readonly<{ outcome?: Readonly<{ warning?: \"execute\" | \"validate\" | \"unknown\" | \"license\" | \"ruleExecution\" | \"timeout\" | \"read\" | \"decrypt\" | \"disabled\" | \"maxExecutableActions\" | \"maxAlerts\" | \"maxQueuedActions\" | null | undefined; outcomeOrder?: number | undefined; outcomeMsg?: string[] | null | undefined; } & { outcome: \"warning\" | \"succeeded\" | \"failed\"; alertsCount: Readonly<{ recovered?: number | null | undefined; active?: number | null | undefined; new?: number | null | undefined; ignored?: number | null | undefined; } & {}>; }> | undefined; duration?: number | undefined; } & { timestamp: number; success: boolean; }>[]; calculated_metrics: Readonly<{ p50?: number | undefined; p95?: number | undefined; p99?: number | undefined; } & { success_ratio: number; }>; last_run: Readonly<{} & { timestamp: string; metrics: Readonly<{ duration?: number | undefined; total_search_duration_ms?: number | null | undefined; total_indexing_duration_ms?: number | null | undefined; total_alerts_detected?: number | null | undefined; total_alerts_created?: number | null | undefined; gap_duration_s?: number | null | undefined; } & {}>; }>; }>; }> | undefined" + "Readonly<{} & { run: Readonly<{} & { history: Readonly<{ outcome?: \"warning\" | \"succeeded\" | \"failed\" | undefined; duration?: number | undefined; } & { timestamp: number; success: boolean; }>[]; calculated_metrics: Readonly<{ p50?: number | undefined; p95?: number | undefined; p99?: number | undefined; } & { success_ratio: number; }>; last_run: Readonly<{} & { timestamp: string; metrics: Readonly<{ duration?: number | undefined; total_search_duration_ms?: number | null | undefined; total_indexing_duration_ms?: number | null | undefined; total_alerts_detected?: number | null | undefined; total_alerts_created?: number | null | undefined; gap_duration_s?: number | null | undefined; } & {}>; }>; }>; }> | undefined" ], "path": "x-pack/plugins/alerting/server/application/rule/types/rule.ts", "deprecated": false, @@ -3316,7 +3316,7 @@ "label": "snoozeSchedule", "description": [], "signature": [ - "Readonly<{ id?: string | undefined; skipRecurrences?: string[] | undefined; } & { duration: number; rRule: Readonly<{ count?: number | undefined; interval?: number | undefined; freq?: 0 | 2 | 1 | 6 | 5 | 4 | 3 | undefined; until?: string | undefined; byweekday?: (string | number)[] | undefined; bymonthday?: number[] | undefined; bymonth?: number[] | undefined; wkst?: \"MO\" | \"TU\" | \"WE\" | \"TH\" | \"FR\" | \"SA\" | \"SU\" | undefined; bysetpos?: number[] | undefined; byyearday?: number[] | undefined; byweekno?: number[] | undefined; byhour?: number[] | undefined; byminute?: number[] | undefined; bysecond?: number[] | undefined; } & { dtstart: string; tzid: string; }>; }>[] | undefined" + "Readonly<{ id?: string | undefined; skipRecurrences?: string[] | undefined; } & { duration: number; rRule: Readonly<{ count?: number | undefined; interval?: number | undefined; freq?: 0 | 2 | 1 | 6 | 5 | 4 | 3 | undefined; until?: string | undefined; byweekday?: (string | number)[] | null | undefined; bymonthday?: number[] | null | undefined; bymonth?: number[] | null | undefined; wkst?: \"MO\" | \"TU\" | \"WE\" | \"TH\" | \"FR\" | \"SA\" | \"SU\" | undefined; bysetpos?: number[] | null | undefined; byyearday?: number[] | null | undefined; byweekno?: number[] | null | undefined; byhour?: number[] | null | undefined; byminute?: number[] | null | undefined; bysecond?: number[] | null | undefined; } & { dtstart: string; tzid: string; }>; }>[] | undefined" ], "path": "x-pack/plugins/alerting/server/application/rule/types/rule.ts", "deprecated": false, @@ -11436,7 +11436,7 @@ "signature": [ "Omit<", "Options", - ", \"dtstart\" | \"until\" | \"byweekday\" | \"wkst\"> & { dtstart: string; byweekday?: (string | number)[] | undefined; wkst?: ", + ", \"dtstart\" | \"until\" | \"byweekday\" | \"wkst\"> & { dtstart: string; byweekday?: (string | number)[] | null | undefined; wkst?: ", { "pluginId": "@kbn/rrule", "scope": "common", diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 90941040d30c1..356d0bd184f07 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-10-27 +date: 2024-10-29 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 1fec04dcb2f5c..8c1ae40f618fa 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-10-27 +date: 2024-10-29 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 00f34543a83c7..4e24b24bc1e03 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 7be91a6eb8b54..a80c596744198 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-10-27 +date: 2024-10-29 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 72f12df9761b5..e47d630a80bf7 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-10-27 +date: 2024-10-29 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 f0cc1f51d721e..3ba76fcb74ea6 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-10-27 +date: 2024-10-29 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 3f5d89a1fb224..f7e9f14210b02 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-10-27 +date: 2024-10-29 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 ab7d960a8ecd4..173fe94d644a5 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-10-27 +date: 2024-10-29 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 b7333d341f06d..b29cf06863503 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-10-27 +date: 2024-10-29 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 420c49a1726b4..a90a7d5376e98 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-10-27 +date: 2024-10-29 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 f91f25e7aa761..6dc8da8c5c874 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 2f6173f82ac01..5f2dfd273dc9d 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-10-27 +date: 2024-10-29 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 b1fedda3dff27..b1e38f5e2bbb5 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-10-27 +date: 2024-10-29 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 76bc33b38abf0..351923fcaeb15 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-10-27 +date: 2024-10-29 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 60e7b4cc84811..9585d30d7fa1a 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-10-27 +date: 2024-10-29 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 603fc1cfb35cf..1cce4327e1c3e 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-10-27 +date: 2024-10-29 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 711a2a495d177..c306076c86fe1 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-10-27 +date: 2024-10-29 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 df047269fcc68..9f1442b4d051e 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-10-27 +date: 2024-10-29 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 ebb60eca8749f..1e00625eecef7 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index bb11b03ab4f9d..ffdc05cf68768 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index c1d7c849b9210..d6515a64ee3c0 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-10-27 +date: 2024-10-29 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 80d16478d471d..6775b65910b58 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_usage.mdx b/api_docs/data_usage.mdx index 80340e3a9b68e..5775d930e428f 100644 --- a/api_docs/data_usage.mdx +++ b/api_docs/data_usage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataUsage title: "dataUsage" image: https://source.unsplash.com/400x175/?github description: API docs for the dataUsage plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataUsage'] --- import dataUsageObj from './data_usage.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index e6604fa3479d4..cdb3c711166e2 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-10-27 +date: 2024-10-29 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 53c0dba9e0d33..c6076a60d816b 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-10-27 +date: 2024-10-29 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 0011e4f1d9c59..59b47a782f32e 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-10-27 +date: 2024-10-29 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 5358eb04e71a8..85877ea7d9650 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-10-27 +date: 2024-10-29 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 08df37548d007..e5f3ba8d5315d 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-10-27 +date: 2024-10-29 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 018c9c211cbd2..6c9f3ad39826b 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-10-27 +date: 2024-10-29 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 6f14cde250d0d..54dd102b3fc9c 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 310f956f64ed0..3e2b2b6aaf24c 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -543,7 +543,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [rules_client_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client_factory.ts#:~:text=authc), [task.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/invalidate_pending_api_keys/task.ts#:~:text=authc), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/plugin.ts#:~:text=authc), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/plugin.ts#:~:text=authc), [rules_client_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client_factory.ts#:~:text=authc), [task.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/invalidate_pending_api_keys/task.ts#:~:text=authc), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/plugin.ts#:~:text=authc), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/plugin.ts#:~:text=authc) | - | | | [task.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/usage/task.ts#:~:text=index) | - | | | [retrieve_migrated_legacy_actions.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/lib/siem_legacy_actions/retrieve_migrated_legacy_actions.mock.ts#:~:text=migrationVersion), [retrieve_migrated_legacy_actions.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/lib/siem_legacy_actions/retrieve_migrated_legacy_actions.mock.ts#:~:text=migrationVersion), [retrieve_migrated_legacy_actions.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/lib/siem_legacy_actions/retrieve_migrated_legacy_actions.mock.ts#:~:text=migrationVersion), [retrieve_migrated_legacy_actions.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/lib/siem_legacy_actions/retrieve_migrated_legacy_actions.mock.ts#:~:text=migrationVersion), [retrieve_migrated_legacy_actions.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/lib/siem_legacy_actions/retrieve_migrated_legacy_actions.mock.ts#:~:text=migrationVersion), [retrieve_migrated_legacy_actions.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/lib/siem_legacy_actions/retrieve_migrated_legacy_actions.mock.ts#:~:text=migrationVersion), [retrieve_migrated_legacy_actions.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/lib/siem_legacy_actions/retrieve_migrated_legacy_actions.mock.ts#:~:text=migrationVersion), [retrieve_migrated_legacy_actions.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/lib/siem_legacy_actions/retrieve_migrated_legacy_actions.mock.ts#:~:text=migrationVersion), [retrieve_migrated_legacy_actions.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/lib/siem_legacy_actions/retrieve_migrated_legacy_actions.mock.ts#:~:text=migrationVersion), [retrieve_migrated_legacy_actions.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/lib/siem_legacy_actions/retrieve_migrated_legacy_actions.mock.ts#:~:text=migrationVersion) | - | -| | [rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/common/rule.ts#:~:text=SavedObjectAttributes), [rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/common/rule.ts#:~:text=SavedObjectAttributes), [rule_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts#:~:text=SavedObjectAttributes), [rule_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts#:~:text=SavedObjectAttributes), [rule_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts#:~:text=SavedObjectAttributes), [rule_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts#:~:text=SavedObjectAttributes), [rule_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts#:~:text=SavedObjectAttributes), [inject_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/common/inject_references.ts#:~:text=SavedObjectAttributes), [inject_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/common/inject_references.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/types.ts#:~:text=SavedObjectAttributes)+ 36 more | - | +| | [rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/common/rule.ts#:~:text=SavedObjectAttributes), [rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/common/rule.ts#:~:text=SavedObjectAttributes), [inject_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/common/inject_references.ts#:~:text=SavedObjectAttributes), [inject_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/common/inject_references.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/types.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/types.ts#:~:text=SavedObjectAttributes), [migrations.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/saved_objects/geo_containment/migrations.ts#:~:text=SavedObjectAttributes), [migrations.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/saved_objects/geo_containment/migrations.ts#:~:text=SavedObjectAttributes), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/saved_objects/migrations/7.11/index.ts#:~:text=SavedObjectAttributes), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/saved_objects/migrations/7.11/index.ts#:~:text=SavedObjectAttributes)+ 14 more | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/saved_objects/index.ts#:~:text=migrations) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/saved_objects/index.ts#:~:text=convertToMultiNamespaceTypeVersion) | - | | | [rules_client_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client_factory.ts#:~:text=audit) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 890f5374f7487..3236c8c102677 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 703b8da396eb3..8b6b6275571ed 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-10-27 +date: 2024-10-29 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 8f01412ab0e32..6ae711bfe0f69 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-10-27 +date: 2024-10-29 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 ad57874c2a8db..c165805a3c858 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index 8f9f97b245402..520134261ee26 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index cae52eca2f54b..112349452636d 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-10-27 +date: 2024-10-29 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 03ecd7c62185c..61acb1f436b44 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-10-27 +date: 2024-10-29 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 d76b9fb13d3e0..76121c2efa099 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-10-27 +date: 2024-10-29 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 da083fcc66ff5..259a8fe021e37 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-10-27 +date: 2024-10-29 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 7ad2ea023d040..a2bf51291f10e 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-10-27 +date: 2024-10-29 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 113e77b819835..e91b0600d1171 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entities_data_access.mdx b/api_docs/entities_data_access.mdx index 3ed72f153f33a..4f6b523ffad01 100644 --- a/api_docs/entities_data_access.mdx +++ b/api_docs/entities_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entitiesDataAccess title: "entitiesDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the entitiesDataAccess plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entitiesDataAccess'] --- import entitiesDataAccessObj from './entities_data_access.devdocs.json'; diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index 5fbb8b2b79322..9f7c4cd124b03 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index f27429f129e5c..6bcd7500e810c 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx index 1307f79a40e7c..0f03fbc026bd7 100644 --- a/api_docs/esql.mdx +++ b/api_docs/esql.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esql title: "esql" image: https://source.unsplash.com/400x175/?github description: API docs for the esql plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] --- import esqlObj from './esql.devdocs.json'; diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index 9d32ba9cc36d4..2a2fa6cf796e2 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 48b9e810f4c29..00d17f06c89df 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-10-27 +date: 2024-10-29 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 db018d3ed1588..9d9d9501d00f5 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-10-27 +date: 2024-10-29 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 f4930f61cd501..e4f1543fae610 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-10-27 +date: 2024-10-29 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 4259ca677457c..c38b67efee7ed 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-10-27 +date: 2024-10-29 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 da6c0ce1be16d..def6f9148e195 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-10-27 +date: 2024-10-29 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 010826abc4e78..606d0ebf0421b 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-10-27 +date: 2024-10-29 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 e99a4fef12965..4ad171f49ffdc 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-10-27 +date: 2024-10-29 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 461cc9a2e29b1..f12ba59e0b4fc 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-10-27 +date: 2024-10-29 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 c6b69200387e7..d3e2103b6b391 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-10-27 +date: 2024-10-29 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 520df905ef1ea..b64355975b10f 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-10-27 +date: 2024-10-29 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 7b9bb574c506e..8b4a2fd93187d 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-10-27 +date: 2024-10-29 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 b2b478387650c..cdb28904e3cef 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-10-27 +date: 2024-10-29 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 1131fae437abc..a18223c2d4a7e 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-10-27 +date: 2024-10-29 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 f6a56adebe9bd..4106d3eef394f 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-10-27 +date: 2024-10-29 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 73bcf450885e2..c44b855458796 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-10-27 +date: 2024-10-29 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 d18450bdcbde1..6fdc46422a0c0 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-10-27 +date: 2024-10-29 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 5726eb26f5d92..bfcf01a7d24e5 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-10-27 +date: 2024-10-29 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 57eff52602fbc..1a8b1dc201aa6 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-10-27 +date: 2024-10-29 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 614484c4e6093..adbf15f38931a 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-10-27 +date: 2024-10-29 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 b3846ad3c59d0..4513fb8fd9673 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index d757a535ea450..dc3e21c94edb6 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] --- import fieldsMetadataObj from './fields_metadata.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index bed6b4d91996c..6d2d108c13187 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-10-27 +date: 2024-10-29 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 8c071917c5de8..7a640bc5827ed 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-10-27 +date: 2024-10-29 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 41953bc2408cf..40f0ea2bef98a 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-10-27 +date: 2024-10-29 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 45ad662189be7..ad97cc4df5f0c 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-10-27 +date: 2024-10-29 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 78226015972a6..2d098de8d7b76 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-10-27 +date: 2024-10-29 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 e9532f412b8ca..9d8d18623cf42 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-10-27 +date: 2024-10-29 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 7c3ba61f8bec4..d59945c0d3c45 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-10-27 +date: 2024-10-29 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 5f2df53dbc4f7..775436e54df9b 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-10-27 +date: 2024-10-29 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 f2f195bf61fe1..198d5e87c8b60 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-10-27 +date: 2024-10-29 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 13cb91f0a3580..c2179eb1540dd 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/inference.mdx b/api_docs/inference.mdx index 6b61097f329a0..201b3cf8db86f 100644 --- a/api_docs/inference.mdx +++ b/api_docs/inference.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inference title: "inference" image: https://source.unsplash.com/400x175/?github description: API docs for the inference plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inference'] --- import inferenceObj from './inference.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index d1547ef030726..937fc1514a4f9 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-10-27 +date: 2024-10-29 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 795b3cf15cb61..880ed3e30ab78 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-10-27 +date: 2024-10-29 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 b7bfbef7eef61..af217ac06b393 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index 40bb0d65010e5..caa28b324bda6 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 849cdc2e1626b..ca11eba54cf6f 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/inventory.mdx b/api_docs/inventory.mdx index d7773bda894cf..9e6b1186f00b1 100644 --- a/api_docs/inventory.mdx +++ b/api_docs/inventory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inventory title: "inventory" image: https://source.unsplash.com/400x175/?github description: API docs for the inventory plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inventory'] --- import inventoryObj from './inventory.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index f421ba69c9838..f4f2a2936cf8b 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index 233bffbba8f1f..93b61c0850ac6 100644 --- a/api_docs/investigate_app.mdx +++ b/api_docs/investigate_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigateApp title: "investigateApp" image: https://source.unsplash.com/400x175/?github description: API docs for the investigateApp plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 5a2a5db134915..9c99f89fbca6e 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant.mdx b/api_docs/kbn_ai_assistant.mdx index ae9e295e6bb7d..6bd90ed7d6845 100644 --- a/api_docs/kbn_ai_assistant.mdx +++ b/api_docs/kbn_ai_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant title: "@kbn/ai-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant'] --- import kbnAiAssistantObj from './kbn_ai_assistant.devdocs.json'; diff --git a/api_docs/kbn_ai_assistant_common.mdx b/api_docs/kbn_ai_assistant_common.mdx index 6a87de32285e9..fac0397b97ec3 100644 --- a/api_docs/kbn_ai_assistant_common.mdx +++ b/api_docs/kbn_ai_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ai-assistant-common title: "@kbn/ai-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ai-assistant-common plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ai-assistant-common'] --- import kbnAiAssistantCommonObj from './kbn_ai_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 5139284b6a596..9765fbc78019a 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-10-27 +date: 2024-10-29 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 58fe707f2194f..c7b4c551f3b82 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-10-27 +date: 2024-10-29 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 dacfdbfba8efa..5bc560ea83d8c 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-10-27 +date: 2024-10-29 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 11e8b24f702be..2debad05e4062 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-10-27 +date: 2024-10-29 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_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index da7ae06bba25d..3d7040c6b9c4a 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 14ddae67360c8..2a5c6ac6877a0 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-10-27 +date: 2024-10-29 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.devdocs.json b/api_docs/kbn_alerting_types.devdocs.json index ec2985ed5666a..830a829583ab9 100644 --- a/api_docs/kbn_alerting_types.devdocs.json +++ b/api_docs/kbn_alerting_types.devdocs.json @@ -3659,7 +3659,7 @@ "signature": [ "Omit<", "Options", - ", \"dtstart\" | \"until\" | \"byweekday\" | \"wkst\"> & { dtstart: string; byweekday?: (string | number)[] | undefined; wkst?: ", + ", \"dtstart\" | \"until\" | \"byweekday\" | \"wkst\"> & { dtstart: string; byweekday?: (string | number)[] | null | undefined; wkst?: ", { "pluginId": "@kbn/rrule", "scope": "common", diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 37d15cada2905..0b232b7be0b1d 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-10-27 +date: 2024-10-29 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 762408606bea3..bceadb65a9666 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-10-27 +date: 2024-10-29 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_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index e087630d70324..82c65bf7575c1 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 3087cd97fc8f7..7fa8b377c6799 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-10-27 +date: 2024-10-29 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 39d3552ea9960..c8cd4e19a10a6 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index a541a933ec25f..2e9eff036a373 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index a1a6eb1b8a7cd..182006b9b0fb3 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-10-27 +date: 2024-10-29 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 cb55f078d4fd7..4eda73d3c66bf 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-10-27 +date: 2024-10-29 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 a4492c0f4eb90..3406142f5e795 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-10-27 +date: 2024-10-29 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 9497c4dbd333d..d88fe6a140a67 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-10-27 +date: 2024-10-29 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_types.mdx b/api_docs/kbn_apm_types.mdx index 391e87aae1934..f0af3e9380940 100644 --- a/api_docs/kbn_apm_types.mdx +++ b/api_docs/kbn_apm_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-types title: "@kbn/apm-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-types plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-types'] --- import kbnApmTypesObj from './kbn_apm_types.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index a31ece9df542c..0a1c8c51fbcd9 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_avc_banner.mdx b/api_docs/kbn_avc_banner.mdx index a57c91c5a047b..d2c8222cc79eb 100644 --- a/api_docs/kbn_avc_banner.mdx +++ b/api_docs/kbn_avc_banner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-avc-banner title: "@kbn/avc-banner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/avc-banner plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/avc-banner'] --- import kbnAvcBannerObj from './kbn_avc_banner.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 5a2622840371f..0dfdad7c3d71e 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-10-27 +date: 2024-10-29 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 6578e3cc9f972..c35da97cd6020 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-10-27 +date: 2024-10-29 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 71004ccf58f6d..03a259fda36be 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-10-27 +date: 2024-10-29 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 00374e1611ba2..42a9df9b72129 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-10-27 +date: 2024-10-29 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 1ad88d17d2a17..d043b597f3df8 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cbor.mdx b/api_docs/kbn_cbor.mdx index f05a8bb05db79..6f965c6a20e39 100644 --- a/api_docs/kbn_cbor.mdx +++ b/api_docs/kbn_cbor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cbor title: "@kbn/cbor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cbor plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cbor'] --- import kbnCborObj from './kbn_cbor.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 4d2516c7e587b..781fc3a265d65 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-10-27 +date: 2024-10-29 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 d6a6c36ebfe9b..c9665525dcdb0 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-10-27 +date: 2024-10-29 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 771ab68836a97..c35862a2ed808 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-10-27 +date: 2024-10-29 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 2ac3e14e76e8d..e70a1b8ead212 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-10-27 +date: 2024-10-29 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 e9a921470fb0a..53cc023be9953 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-10-27 +date: 2024-10-29 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 18477bb759b79..4efa45404e288 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-10-27 +date: 2024-10-29 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 dfd18c243ef05..60391a2ea2ffc 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture.devdocs.json b/api_docs/kbn_cloud_security_posture.devdocs.json index 89432b1285c4a..37cc79e0d28b8 100644 --- a/api_docs/kbn_cloud_security_posture.devdocs.json +++ b/api_docs/kbn_cloud_security_posture.devdocs.json @@ -1116,7 +1116,7 @@ "signature": [ "{ [x: string]: FilterValue; }" ], - "path": "x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts", + "path": "x-pack/packages/kbn-cloud-security-posture/public/src/utils/query_utils.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1514,6 +1514,17 @@ "path": "x-pack/packages/kbn-cloud-security-posture/public/src/constants/component_constants.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/cloud-security-posture", + "id": "def-public.statusColors.unknown", + "type": "string", + "tags": [], + "label": "unknown", + "description": [], + "path": "x-pack/packages/kbn-cloud-security-posture/public/src/constants/component_constants.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_cloud_security_posture.mdx b/api_docs/kbn_cloud_security_posture.mdx index 62b599458ba8f..d55ef9c63de40 100644 --- a/api_docs/kbn_cloud_security_posture.mdx +++ b/api_docs/kbn_cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture title: "@kbn/cloud-security-posture" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture'] --- import kbnCloudSecurityPostureObj from './kbn_cloud_security_posture.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 88 | 1 | 88 | 0 | +| 89 | 1 | 89 | 0 | ## Client diff --git a/api_docs/kbn_cloud_security_posture_common.mdx b/api_docs/kbn_cloud_security_posture_common.mdx index b52adcd79efe1..177a584749022 100644 --- a/api_docs/kbn_cloud_security_posture_common.mdx +++ b/api_docs/kbn_cloud_security_posture_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-common title: "@kbn/cloud-security-posture-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-common plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-common'] --- import kbnCloudSecurityPostureCommonObj from './kbn_cloud_security_posture_common.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_graph.mdx b/api_docs/kbn_cloud_security_posture_graph.mdx index 092cbbf52336f..1cae4ff1c4038 100644 --- a/api_docs/kbn_cloud_security_posture_graph.mdx +++ b/api_docs/kbn_cloud_security_posture_graph.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-graph title: "@kbn/cloud-security-posture-graph" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-graph plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-graph'] --- import kbnCloudSecurityPostureGraphObj from './kbn_cloud_security_posture_graph.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 5bb62e2641d23..e276b4694d933 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-10-27 +date: 2024-10-29 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 08f4fd4a415fd..2dcc4e5ea40fc 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-10-27 +date: 2024-10-29 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 bdf5dc02d73c4..06a4e11fc96d3 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-10-27 +date: 2024-10-29 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 f41e29971de12..981b7139df0e5 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-10-27 +date: 2024-10-29 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 0d48dcc6caa96..31d25569cb32b 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-10-27 +date: 2024-10-29 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 e3c599e2efbc9..3e7017a2d3151 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-10-27 +date: 2024-10-29 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 ca6d4987b926f..068775331182c 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-10-27 +date: 2024-10-29 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 4289f14973e98..84ec09b9fc2bb 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-10-27 +date: 2024-10-29 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_content_insights_public.mdx b/api_docs/kbn_content_management_content_insights_public.mdx index d5a2246bcb0bf..af2683ea7fcd5 100644 --- a/api_docs/kbn_content_management_content_insights_public.mdx +++ b/api_docs/kbn_content_management_content_insights_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-public title: "@kbn/content-management-content-insights-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-public plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-public'] --- import kbnContentManagementContentInsightsPublicObj from './kbn_content_management_content_insights_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_server.mdx b/api_docs/kbn_content_management_content_insights_server.mdx index e406cda2791d9..61b76efd569b6 100644 --- a/api_docs/kbn_content_management_content_insights_server.mdx +++ b/api_docs/kbn_content_management_content_insights_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-server title: "@kbn/content-management-content-insights-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-server plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-server'] --- import kbnContentManagementContentInsightsServerObj from './kbn_content_management_content_insights_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_public.mdx b/api_docs/kbn_content_management_favorites_public.mdx index 1065600b6d217..b298472d4a5fa 100644 --- a/api_docs/kbn_content_management_favorites_public.mdx +++ b/api_docs/kbn_content_management_favorites_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-public title: "@kbn/content-management-favorites-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-public plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-public'] --- import kbnContentManagementFavoritesPublicObj from './kbn_content_management_favorites_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_server.mdx b/api_docs/kbn_content_management_favorites_server.mdx index 8e9c35b6a808f..7719d502de90c 100644 --- a/api_docs/kbn_content_management_favorites_server.mdx +++ b/api_docs/kbn_content_management_favorites_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-server title: "@kbn/content-management-favorites-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-server plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-server'] --- import kbnContentManagementFavoritesServerObj from './kbn_content_management_favorites_server.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 423bc91c46f89..9fa69123c265f 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-10-27 +date: 2024-10-29 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 50e6c848420b2..cf85a90fec809 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-10-27 +date: 2024-10-29 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 70896bfd22d14..71392561db807 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-10-27 +date: 2024-10-29 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 e09f653d4eb8f..87a8d4b71bdf7 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-10-27 +date: 2024-10-29 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_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index 50aa27c992b16..99fee0b741ae8 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-user-profiles'] --- import kbnContentManagementUserProfilesObj from './kbn_content_management_user_profiles.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index f04e86f8956af..96827dda84e5b 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-10-27 +date: 2024-10-29 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 73bf73de9a992..4d0116c075393 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-10-27 +date: 2024-10-29 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 db242fb4ac494..d11ac459247a8 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-10-27 +date: 2024-10-29 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 e274e88da9dae..a43bcc90795ab 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-10-27 +date: 2024-10-29 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 9ade080630ca8..366b4a4f2774c 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-10-27 +date: 2024-10-29 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 d99566510d064..2a102c0d53d2a 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-10-27 +date: 2024-10-29 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 173e4a6234a91..d83935c76e364 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-10-27 +date: 2024-10-29 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 a0d8a209de2a9..aa4fed77cf134 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-10-27 +date: 2024-10-29 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 360c37ae525ea..62c91d0d8ee54 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-10-27 +date: 2024-10-29 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 1d2276e119f5b..e62870b10367d 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-10-27 +date: 2024-10-29 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 32c2ce9434975..aa5cd6c600e45 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-10-27 +date: 2024-10-29 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 3df2e8c4cf6d2..6e08efd5599ad 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-10-27 +date: 2024-10-29 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 254419125c204..0b0b9a88af9fe 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-10-27 +date: 2024-10-29 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 b3a2c29bd7275..c15c7db9e9ebf 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-10-27 +date: 2024-10-29 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 1bbbaea5ef796..a41352d26b2cf 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-10-27 +date: 2024-10-29 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 21c6c9bd6531d..2f29656d38d29 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-10-27 +date: 2024-10-29 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 bcf6690160a16..636323c7db0df 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-10-27 +date: 2024-10-29 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 022d1aa4409d3..0b1d59a032ca7 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-10-27 +date: 2024-10-29 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 35b1775866bd6..48f94d7bd9940 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-10-27 +date: 2024-10-29 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 4a2590200e39b..23057607b7597 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-10-27 +date: 2024-10-29 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 94faa7b8d31c0..c011a18e7dbcd 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-10-27 +date: 2024-10-29 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 155ae23fda43b..0392de50f71ee 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-10-27 +date: 2024-10-29 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 10e0393885280..095accbf9e41c 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-10-27 +date: 2024-10-29 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 8fa1958253bf4..a52f2b2c65f01 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-10-27 +date: 2024-10-29 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 ae31155971792..6364f5141d39d 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-10-27 +date: 2024-10-29 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 2d205d0ca5aeb..c2c52bd89b23a 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-10-27 +date: 2024-10-29 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 1644de8fb9c5c..707315221ba6f 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-10-27 +date: 2024-10-29 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 fb88efe9267c8..5586a541ca15f 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-10-27 +date: 2024-10-29 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 8dfa0c584b7f5..61ec8b24cbd66 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-10-27 +date: 2024-10-29 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 3f75ba13895af..4546e7ee7ee6f 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-10-27 +date: 2024-10-29 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 cfec5a876aec6..0df2ad9d8b05e 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-10-27 +date: 2024-10-29 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 c3bfa4469565a..1bc79dbee7965 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-10-27 +date: 2024-10-29 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 66612fa7ac72e..50fe5b59f806f 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-10-27 +date: 2024-10-29 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 edca8a8e0cca0..59088d2378285 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-10-27 +date: 2024-10-29 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 b88c85e740dfa..13fbe158b46f0 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-10-27 +date: 2024-10-29 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 97b906ab1ad9a..bd4aa2f08f82e 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-10-27 +date: 2024-10-29 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 11a42bc17a300..0fca2be853995 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-10-27 +date: 2024-10-29 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 e2f94c1c89235..4366891b4fc97 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-10-27 +date: 2024-10-29 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 bd9e6a835674f..d4717ec4edea7 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-10-27 +date: 2024-10-29 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 222559110dbd2..11a05adf90088 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-10-27 +date: 2024-10-29 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 4c77e10cb484d..179e00647dbd5 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-10-27 +date: 2024-10-29 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 9eb5458f6e807..39ea58f948c05 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-10-27 +date: 2024-10-29 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 67bad274ee1ae..92e03b9252491 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-10-27 +date: 2024-10-29 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 93a6a0df97782..f2e6383e027d7 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-10-27 +date: 2024-10-29 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 7d317c7b95aad..eec1068685a1c 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-10-27 +date: 2024-10-29 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 b20904e8cfe5e..64842f8376cf1 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-10-27 +date: 2024-10-29 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 d8488ca69eb0f..4491e4424310a 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-10-27 +date: 2024-10-29 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 a8bf9112b2b5c..0c7cd3c1468a2 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-10-27 +date: 2024-10-29 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 ed6703a0b3c6f..a812c8d0e0ceb 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-10-27 +date: 2024-10-29 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 ae9497fd4f31c..29edca4d5cd34 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-10-27 +date: 2024-10-29 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 e2ec00ac9d8c3..f5cb72986da07 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-10-27 +date: 2024-10-29 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 94dd11cad09f7..a9224f980173d 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-10-27 +date: 2024-10-29 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 a00375f262fee..4e2e9475d4454 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-10-27 +date: 2024-10-29 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 42e8157eabd7e..fa7996d7dbc66 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-10-27 +date: 2024-10-29 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 c27d967135568..b8103461bfcd1 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-10-27 +date: 2024-10-29 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 2b2362cb6a40e..a30697fb7b754 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-10-27 +date: 2024-10-29 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 5928cb3c10c40..000c92523e6d3 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-10-27 +date: 2024-10-29 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 ad3b6427a32cc..439d53c428b83 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-10-27 +date: 2024-10-29 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 b502612f7616f..e1624b96c30a6 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-10-27 +date: 2024-10-29 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_feature_flags_browser.mdx b/api_docs/kbn_core_feature_flags_browser.mdx index 4ca797e8fddb2..4b4a2a140ff1f 100644 --- a/api_docs/kbn_core_feature_flags_browser.mdx +++ b/api_docs/kbn_core_feature_flags_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser title: "@kbn/core-feature-flags-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser'] --- import kbnCoreFeatureFlagsBrowserObj from './kbn_core_feature_flags_browser.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_internal.mdx b/api_docs/kbn_core_feature_flags_browser_internal.mdx index a34f07358ae36..e2940c9b3f984 100644 --- a/api_docs/kbn_core_feature_flags_browser_internal.mdx +++ b/api_docs/kbn_core_feature_flags_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-internal title: "@kbn/core-feature-flags-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-internal plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-internal'] --- import kbnCoreFeatureFlagsBrowserInternalObj from './kbn_core_feature_flags_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_mocks.mdx b/api_docs/kbn_core_feature_flags_browser_mocks.mdx index 2ad2d4a3e5d34..6924f840fc366 100644 --- a/api_docs/kbn_core_feature_flags_browser_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-mocks title: "@kbn/core-feature-flags-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-mocks plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-mocks'] --- import kbnCoreFeatureFlagsBrowserMocksObj from './kbn_core_feature_flags_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server.mdx b/api_docs/kbn_core_feature_flags_server.mdx index 85ff30108fd8d..d45fabaffe6d1 100644 --- a/api_docs/kbn_core_feature_flags_server.mdx +++ b/api_docs/kbn_core_feature_flags_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server title: "@kbn/core-feature-flags-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server'] --- import kbnCoreFeatureFlagsServerObj from './kbn_core_feature_flags_server.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_internal.mdx b/api_docs/kbn_core_feature_flags_server_internal.mdx index 9906dfd6c0c2e..6a4a22b3aaf46 100644 --- a/api_docs/kbn_core_feature_flags_server_internal.mdx +++ b/api_docs/kbn_core_feature_flags_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-internal title: "@kbn/core-feature-flags-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-internal plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-internal'] --- import kbnCoreFeatureFlagsServerInternalObj from './kbn_core_feature_flags_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_mocks.mdx b/api_docs/kbn_core_feature_flags_server_mocks.mdx index 027f784e1c875..3e6ab1b12a63a 100644 --- a/api_docs/kbn_core_feature_flags_server_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-mocks title: "@kbn/core-feature-flags-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-mocks plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-mocks'] --- import kbnCoreFeatureFlagsServerMocksObj from './kbn_core_feature_flags_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 3b6d7144b0a2c..c41988b7ff4cd 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-10-27 +date: 2024-10-29 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 fe55ac816879d..0543973c020a3 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-10-27 +date: 2024-10-29 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 423576608cb73..8c0e79e187d21 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-10-27 +date: 2024-10-29 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 7cd117028c127..64417fe82a75b 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-10-27 +date: 2024-10-29 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 9e8f253bc79d2..26a9f4c1d293f 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-10-27 +date: 2024-10-29 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 3020b7577df8e..c1f14e9d7da5c 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-10-27 +date: 2024-10-29 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 8c3e7ee72411c..6df002bf56282 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-10-27 +date: 2024-10-29 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 b93ad4a07eb6e..ca93668fbc314 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-10-27 +date: 2024-10-29 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 dd7a58fe31ee1..0b3977ab557e7 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-10-27 +date: 2024-10-29 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 656f4aef7b74b..0d4d1023bca17 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-10-27 +date: 2024-10-29 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 cf6ce905041c0..b1c0475a014bc 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-10-27 +date: 2024-10-29 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 1991474ce4d66..4042198303dd3 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-10-27 +date: 2024-10-29 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 c69e66425959b..e93732cc43219 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-10-27 +date: 2024-10-29 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 df26387304bbd..78e32544360ce 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-10-27 +date: 2024-10-29 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 d91608911e97d..3f3ab00f63557 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-10-27 +date: 2024-10-29 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 7e78ff2bda98c..85f2da20c2277 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-10-27 +date: 2024-10-29 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 9ca8cec521be5..3d50ec756f73b 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-10-27 +date: 2024-10-29 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 2b128e3ed68b6..a494c518e35a4 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-10-27 +date: 2024-10-29 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 18184ac586f8b..141c5ad53f6b5 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-10-27 +date: 2024-10-29 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 511b5af5c81ec..2210651f3c64c 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-10-27 +date: 2024-10-29 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 3ae8f67276462..625a771e4ea28 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-10-27 +date: 2024-10-29 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 88373dbc1fc6e..0c195e9b30877 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-10-27 +date: 2024-10-29 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 8c4bd609acbaa..fa39be40e9fa8 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-10-27 +date: 2024-10-29 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 ff4a7603d5a46..49bc20d23a4b6 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-10-27 +date: 2024-10-29 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 871e9d487860c..4a7255b1aa63b 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-10-27 +date: 2024-10-29 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 24d8359993f3a..e59e56edc980c 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-10-27 +date: 2024-10-29 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 504b210a8db34..a873b1414c2dd 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-10-27 +date: 2024-10-29 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 5cda5b4aeacc0..3b507c030ce0a 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-10-27 +date: 2024-10-29 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 0befa5d18b265..c3bb906114f82 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-10-27 +date: 2024-10-29 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 38cff1b884034..85d8223b8bbef 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-10-27 +date: 2024-10-29 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 4fd48b766dd2f..e61cbf90885fe 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-10-27 +date: 2024-10-29 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 62cdc68a3b4d3..668c3b0866955 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-10-27 +date: 2024-10-29 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 d117b04ed659d..460f8875d9b5f 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-10-27 +date: 2024-10-29 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 465f4a56b586f..4a7b0ba52266c 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-10-27 +date: 2024-10-29 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 f345a14c5e0be..44c4365f283f3 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-10-27 +date: 2024-10-29 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 8e4d9548bc5b4..4eaeae4dd8775 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-10-27 +date: 2024-10-29 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 10902f2bb01d8..0c108f0c5230f 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-10-27 +date: 2024-10-29 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 d625c4bb85dbf..0a04fa7c50030 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-10-27 +date: 2024-10-29 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 5370a956886e2..4f5167d64e03b 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-10-27 +date: 2024-10-29 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 50b07ca70fcec..ea257ef78b210 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-10-27 +date: 2024-10-29 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 a56f6431f773d..5fdb07bf4a4cc 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-10-27 +date: 2024-10-29 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 45b8ee7ac8b52..9fc3d9337f5cf 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-10-27 +date: 2024-10-29 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 5dc099be10f5a..d6f1b3b382efc 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-10-27 +date: 2024-10-29 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 90720c6b53572..282bacb4109e5 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-10-27 +date: 2024-10-29 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 1a28652e2d9e0..181fb312a0c3c 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-10-27 +date: 2024-10-29 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 9674bc55d4b9a..5ec7a2a8d9992 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-10-27 +date: 2024-10-29 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 81acecdf960da..f070cf9e294c8 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-10-27 +date: 2024-10-29 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 8703b62c24113..82076c6b15c7f 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-10-27 +date: 2024-10-29 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 3cb304635de3b..db2431856e501 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-10-27 +date: 2024-10-29 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 be9c80089d1b0..458ff7ad9a879 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-10-27 +date: 2024-10-29 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 368c645eaf1b5..797af58f6db2c 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-10-27 +date: 2024-10-29 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 42200ab582ee9..eea9b7056f214 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-10-27 +date: 2024-10-29 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 ffbd96154ffff..bf3f89fbb1e34 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-10-27 +date: 2024-10-29 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 4a314337038f7..0c8ea5fd20cb8 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-10-27 +date: 2024-10-29 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 e2775ea41720d..915007b9d16ac 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-10-27 +date: 2024-10-29 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 c2f6a023c2b62..cc5978246c6aa 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-10-27 +date: 2024-10-29 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 e49aa9e828130..9c919ab9abfe0 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-10-27 +date: 2024-10-29 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 d6fbc9ce3cc38..fb59ccb60759b 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-10-27 +date: 2024-10-29 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 525282b125499..496d86f7d1d69 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-10-27 +date: 2024-10-29 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.devdocs.json b/api_docs/kbn_core_saved_objects_api_server.devdocs.json index 78c5844109cd2..7b8b82e990599 100644 --- a/api_docs/kbn_core_saved_objects_api_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_server.devdocs.json @@ -2746,26 +2746,6 @@ "plugin": "actions", "path": "x-pack/plugins/actions/server/application/connector/methods/create/create.ts" }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts" - }, { "plugin": "alerting", "path": "x-pack/plugins/alerting/server/rules_client/common/inject_references.ts" @@ -2782,30 +2762,6 @@ "plugin": "alerting", "path": "x-pack/plugins/alerting/server/types.ts" }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/types.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/types.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/types.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/types.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/types.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/types.ts" - }, { "plugin": "alerting", "path": "x-pack/plugins/alerting/server/saved_objects/geo_containment/migrations.ts" diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 9193fe1e03956..c35af813edae2 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-10-27 +date: 2024-10-29 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 95914df1134dd..0fffab87bb986 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-10-27 +date: 2024-10-29 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 99611f65d09cb..e9e58d2978b15 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-10-27 +date: 2024-10-29 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 1ee5d91b49b1e..a99fda4e40e71 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-10-27 +date: 2024-10-29 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 efac5cbb5c01c..5d8ab5e269391 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-10-27 +date: 2024-10-29 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 39430e3f79442..58815a50b8103 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-10-27 +date: 2024-10-29 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 72b01fd02dc87..047ede1b85f75 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-10-27 +date: 2024-10-29 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 3f4f8f5a80485..5221fd91127d8 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-10-27 +date: 2024-10-29 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 c8cd357835396..1e4f35df588fb 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-10-27 +date: 2024-10-29 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 25e60562b5a9b..bcf3b3436b98b 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-10-27 +date: 2024-10-29 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 bd1dfa89d6c31..43195cb8049bc 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-10-27 +date: 2024-10-29 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 32d8573a245e2..03bb7db061c4e 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-10-27 +date: 2024-10-29 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.devdocs.json b/api_docs/kbn_core_saved_objects_server.devdocs.json index fecd38966f116..c34c701d22002 100644 --- a/api_docs/kbn_core_saved_objects_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_server.devdocs.json @@ -6237,26 +6237,6 @@ "plugin": "actions", "path": "x-pack/plugins/actions/server/application/connector/methods/create/create.ts" }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts" - }, { "plugin": "alerting", "path": "x-pack/plugins/alerting/server/rules_client/common/inject_references.ts" @@ -6273,30 +6253,6 @@ "plugin": "alerting", "path": "x-pack/plugins/alerting/server/types.ts" }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/types.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/types.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/types.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/types.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/types.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/types.ts" - }, { "plugin": "alerting", "path": "x-pack/plugins/alerting/server/saved_objects/geo_containment/migrations.ts" diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 3b4531083204b..99fa62021f0a1 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-10-27 +date: 2024-10-29 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 4fa3920f5092c..ccc6081f35c3b 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-10-27 +date: 2024-10-29 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 13b185ee2f903..d2c321edee7c4 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-10-27 +date: 2024-10-29 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 fbe4214c49f1e..b2f29567f72ee 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-10-27 +date: 2024-10-29 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 711e562900042..4e1114736d538 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-10-27 +date: 2024-10-29 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 709f4f9432b10..728bad5e433a2 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-10-27 +date: 2024-10-29 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 8df09caf4d601..a8c38f255cde6 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-10-27 +date: 2024-10-29 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 86b20a396bd72..efe1cde114a01 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-10-27 +date: 2024-10-29 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 8d1ed38af518b..04530829625c9 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-10-27 +date: 2024-10-29 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 280fc27571727..ee437a0ae5135 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-10-27 +date: 2024-10-29 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 841501ca47db1..3fa65e7a5d1c7 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-10-27 +date: 2024-10-29 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 80b1743e193dd..b9b1d1a7bec19 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-10-27 +date: 2024-10-29 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 f8daa373ff338..82c4ddd3fcf3e 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-10-27 +date: 2024-10-29 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 ca41f463c2340..4540224ee16c6 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-10-27 +date: 2024-10-29 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 ebd1fdff1208b..9836fba612bcc 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-10-27 +date: 2024-10-29 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 d17f932db0d36..5ca9ad5096cf9 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-10-27 +date: 2024-10-29 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 59e8341cdcde5..4a2dea87ffe42 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-10-27 +date: 2024-10-29 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 0417c15301b2e..dcfdcc1403243 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-10-27 +date: 2024-10-29 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 7309180f9292d..487067f7b604e 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-10-27 +date: 2024-10-29 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 6e0fdd63926a9..0753177a23046 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-10-27 +date: 2024-10-29 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 a3cbdcdb75b48..b2a516e289d18 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-10-27 +date: 2024-10-29 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 c8deec261bacd..e8c44c8b15d60 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-10-27 +date: 2024-10-29 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 f25b124b83ced..3dfd8dcf53759 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-10-27 +date: 2024-10-29 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 4eb82f6f629ba..b342d9e6b8bf0 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-10-27 +date: 2024-10-29 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 39d26d8af1bf1..5dbf7bdd40ce3 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-10-27 +date: 2024-10-29 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 a341dbb6120d5..65aa80512df99 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-10-27 +date: 2024-10-29 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 acbb218ff0531..6744459d778e2 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-10-27 +date: 2024-10-29 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 ad0d61920a4fe..695ddd0e9e5f0 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-10-27 +date: 2024-10-29 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 3a7472f429fd3..8ff09a556e7e8 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-10-27 +date: 2024-10-29 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 b95738b8abadc..5aa0e599b0772 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-10-27 +date: 2024-10-29 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 480a8bf3fe862..c8caa95cd5b31 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-10-27 +date: 2024-10-29 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 3dc617cf5b84e..5a89eb7b2c8fa 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-10-27 +date: 2024-10-29 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 b489caf8f40f7..b3d06c2fd6f96 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-10-27 +date: 2024-10-29 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 c886985e31f74..963992129288d 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-10-27 +date: 2024-10-29 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_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index 95cf9afe24c32..7490e44269008 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index c3522e361e101..a18408dddb18e 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index 57a322449779f..7ea430c0986bc 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index e50de032d9728..3bc35aa30193a 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index 1fb96a835ef0a..42bc5c720f400 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index d90e9aacfa50b..a6a58d8dfa45e 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index a203357595940..162ef32536274 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_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 6c5cda9952b7b..dfc55f8b9cb82 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-10-27 +date: 2024-10-29 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_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 6433a16bb8002..91c144eabf626 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-10-27 +date: 2024-10-29 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 11aec2219e8de..0d3e667764e8d 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-10-27 +date: 2024-10-29 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 e73503bc3c226..7c4119c08e000 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-10-27 +date: 2024-10-29 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 a3de38b615406..56cc7f070330f 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-10-27 +date: 2024-10-29 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 019b392ae302a..7cfabc30ac9ba 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-10-27 +date: 2024-10-29 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 692e415d3a070..dbdc0ba6b37d0 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-10-27 +date: 2024-10-29 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 2480f6eb09d6b..287ac74639556 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-10-27 +date: 2024-10-29 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 8aa2f1e4617d2..0cb97d1fc056e 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-10-27 +date: 2024-10-29 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 7d5893cac7591..287a9f6f6ef18 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-10-27 +date: 2024-10-29 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 08694d2038960..7a2d0681c5b31 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-10-27 +date: 2024-10-29 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 6facc64146d9c..d14bb6a0244d9 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-10-27 +date: 2024-10-29 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 3f6a289270612..1604383907995 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-10-27 +date: 2024-10-29 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 d889789678017..5ee97e6714adb 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-10-27 +date: 2024-10-29 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 98189fe7bb303..bd92656605e87 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-10-27 +date: 2024-10-29 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 00e5f81d6906d..f0d265b7896a2 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-10-27 +date: 2024-10-29 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 4a139e9dc49c7..55fa5afb059c6 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-10-27 +date: 2024-10-29 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 43e66dadfd989..2f1d0ad8347d2 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-10-27 +date: 2024-10-29 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 da09e0ebd5069..28a86d5a0e836 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-10-27 +date: 2024-10-29 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 e41fed17bb523..4b1ea7277f9a7 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-10-27 +date: 2024-10-29 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 1ec9652a30541..d98fc711c1839 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-10-27 +date: 2024-10-29 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 03d758d15ecd3..95abcf71ade98 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-10-27 +date: 2024-10-29 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 5b04e0915d5da..6daad6284ec74 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-10-27 +date: 2024-10-29 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 515055e4b004f..b864e65c1ae9e 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-10-27 +date: 2024-10-29 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 130f937efc4d8..7ec2e27238a8a 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-10-27 +date: 2024-10-29 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 7826c372fe719..95682ec66e9ed 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-10-27 +date: 2024-10-29 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 89a2477547e74..5d291a852e35e 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-10-27 +date: 2024-10-29 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 cddc033ed5da6..44c6a2c823862 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-10-27 +date: 2024-10-29 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 d628383c8fd38..e3f53e3853e78 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_contextual_components.mdx b/api_docs/kbn_discover_contextual_components.mdx index 3cf9e355ced6c..48cc7f9040395 100644 --- a/api_docs/kbn_discover_contextual_components.mdx +++ b/api_docs/kbn_discover_contextual_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-contextual-components title: "@kbn/discover-contextual-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-contextual-components plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-contextual-components'] --- import kbnDiscoverContextualComponentsObj from './kbn_discover_contextual_components.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index c7b040df30949..a0c5b677cfc2e 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-10-27 +date: 2024-10-29 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 e0ba05c31b675..9551adaee19a2 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-10-27 +date: 2024-10-29 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 6bfb12dcd779b..af6b93c9f8e85 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-10-27 +date: 2024-10-29 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 9f216ffbf00d6..53d508ae5425e 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-10-27 +date: 2024-10-29 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 099e5b6a7a514..96aadc41ed447 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-10-27 +date: 2024-10-29 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 cfb4c7e45a66b..d61268515c588 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-10-27 +date: 2024-10-29 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 f2b58d89bc604..35132a72ca72e 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-10-27 +date: 2024-10-29 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 e09026131e14a..1b74cc3d2fb54 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-10-27 +date: 2024-10-29 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 da66810e74d5a..659bf1b27b071 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index 0a046ebc80424..9835e9b7335f8 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 554e27deba0f6..7dc8dba10337a 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-10-27 +date: 2024-10-29 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 9d66d0055f569..ef5072a347915 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-10-27 +date: 2024-10-29 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 cdf9afe000144..93e83620ef325 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-10-27 +date: 2024-10-29 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 ac764937fa5d7..9e1557f2cb9fb 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-10-27 +date: 2024-10-29 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 3ea57f4b33c65..6ca0de980b7fd 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-10-27 +date: 2024-10-29 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 f242cef826098..e831d2c8e0292 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-10-27 +date: 2024-10-29 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 9b4fdb9e57ad3..267849522ae82 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_editor.mdx b/api_docs/kbn_esql_editor.mdx index 016c5d44f3038..c134c71bac836 100644 --- a/api_docs/kbn_esql_editor.mdx +++ b/api_docs/kbn_esql_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-editor title: "@kbn/esql-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-editor plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-editor'] --- import kbnEsqlEditorObj from './kbn_esql_editor.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index e0023cb151f93..10214e501594e 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-10-27 +date: 2024-10-29 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 e1016d0c08ec5..36d6fef6be43a 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-10-27 +date: 2024-10-29 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 cddea3ed1b069..60da135a28c8d 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-10-27 +date: 2024-10-29 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 f0d9de5016870..a6bf55226438b 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-10-27 +date: 2024-10-29 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 5c9215aa93d02..f9a15dcf85cd4 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-10-27 +date: 2024-10-29 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 f6cde69d707c9..78eddd960ee16 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-10-27 +date: 2024-10-29 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 9c00ce5011d07..8e19898fe0ae4 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-10-27 +date: 2024-10-29 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 1764a67f9f947..39ef3da6761a3 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-10-27 +date: 2024-10-29 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 233ad79c47855..f28f011ca7a43 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.devdocs.json b/api_docs/kbn_ftr_common_functional_services.devdocs.json index 000ff1cb78701..da4cb9fdb2ab7 100644 --- a/api_docs/kbn_ftr_common_functional_services.devdocs.json +++ b/api_docs/kbn_ftr_common_functional_services.devdocs.json @@ -1901,7 +1901,7 @@ "label": "InternalRequestHeader", "description": [], "signature": [ - "{ 'kbn-xsrf': string; } | { 'x-elastic-internal-origin': string; 'kbn-xsrf': string; }" + "{ 'x-elastic-internal-origin': string; 'kbn-xsrf': string; } | { 'x-elastic-internal-origin': string; 'kbn-xsrf': string; }" ], "path": "packages/kbn-ftr-common-functional-services/services/saml_auth/default_request_headers.ts", "deprecated": false, diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 472fd81fc2ad1..553eb3f9c1afa 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-10-27 +date: 2024-10-29 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 064fde25c4e34..a09b0d8459328 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-10-27 +date: 2024-10-29 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 54c6e77e62b4b..dd58296bf4e8d 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-10-27 +date: 2024-10-29 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 412a4f53672e0..a56c3bf13069c 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-10-27 +date: 2024-10-29 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 92774a04ec411..27b20ca3fb6f4 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grid_layout.mdx b/api_docs/kbn_grid_layout.mdx index 1ae6f14af6b6a..5b6fcfb09eb9d 100644 --- a/api_docs/kbn_grid_layout.mdx +++ b/api_docs/kbn_grid_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grid-layout title: "@kbn/grid-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grid-layout plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grid-layout'] --- import kbnGridLayoutObj from './kbn_grid_layout.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index fb6daa2992d67..43e9d9483c53f 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 1045e21a0e2e3..ab24bb6657d03 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-10-27 +date: 2024-10-29 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 4d0784ab958b6..2d67ce9788e73 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-10-27 +date: 2024-10-29 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 91e9ddd460c74..36454569a138a 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-10-27 +date: 2024-10-29 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 688277092aae8..8468002692341 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-10-27 +date: 2024-10-29 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 aad2dba40369b..0091c62287e6b 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-10-27 +date: 2024-10-29 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 249cf308b507b..37a43ae2ea00b 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-10-27 +date: 2024-10-29 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 a4c94f002d786..a9a892a8b09b2 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-10-27 +date: 2024-10-29 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 49e78f3fbbd76..78731f24e44b7 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-10-27 +date: 2024-10-29 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 34e0773929f1e..0355aeb742946 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management_shared_types.mdx b/api_docs/kbn_index_management_shared_types.mdx index e1f1f804339d9..ce8311f0a9759 100644 --- a/api_docs/kbn_index_management_shared_types.mdx +++ b/api_docs/kbn_index_management_shared_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management-shared-types title: "@kbn/index-management-shared-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management-shared-types plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management-shared-types'] --- import kbnIndexManagementSharedTypesObj from './kbn_index_management_shared_types.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 4a0982a3846fe..4b358e7bea02e 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-10-27 +date: 2024-10-29 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 c3003f3a2844b..8e9e63ef82c29 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-10-27 +date: 2024-10-29 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 ec797b96c31ce..5623d6eb4cf25 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_investigation_shared.mdx b/api_docs/kbn_investigation_shared.mdx index 4dec7130cba4e..90f07292320d9 100644 --- a/api_docs/kbn_investigation_shared.mdx +++ b/api_docs/kbn_investigation_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-investigation-shared title: "@kbn/investigation-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/investigation-shared plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/investigation-shared'] --- import kbnInvestigationSharedObj from './kbn_investigation_shared.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 11ab47207d65c..7a5d0822252a7 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-10-27 +date: 2024-10-29 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 cfb78d10bdda7..272509c5ae8e2 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_item_buffer.mdx b/api_docs/kbn_item_buffer.mdx index 96201cec92f87..844e0fa6f41e6 100644 --- a/api_docs/kbn_item_buffer.mdx +++ b/api_docs/kbn_item_buffer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-item-buffer title: "@kbn/item-buffer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/item-buffer plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/item-buffer'] --- import kbnItemBufferObj from './kbn_item_buffer.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index bdc8d6484ce02..e97688ee43d86 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-10-27 +date: 2024-10-29 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 b23f888aeb0f6..6d1dad23e051b 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-10-27 +date: 2024-10-29 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 df4dadf4ee6b3..7718b89474716 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_json_schemas.mdx b/api_docs/kbn_json_schemas.mdx index e32289eaeb00a..9e6f4c5f450b6 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-schemas'] --- import kbnJsonSchemasObj from './kbn_json_schemas.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index b246069833c34..5ff460560264d 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-10-27 +date: 2024-10-29 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.mdx b/api_docs/kbn_language_documentation.mdx index 387ff58816bab..4bb0a3d649cc8 100644 --- a/api_docs/kbn_language_documentation.mdx +++ b/api_docs/kbn_language_documentation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation title: "@kbn/language-documentation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation'] --- import kbnLanguageDocumentationObj from './kbn_language_documentation.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 9f0af310e192a..adf5e2c00daee 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-10-27 +date: 2024-10-29 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 d41996f61eec7..ee04a89d77981 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-10-27 +date: 2024-10-29 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 71cf77392c2ce..107cd2b9f3727 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-10-27 +date: 2024-10-29 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 b378630d53634..1bbcb9e0f66e0 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-10-27 +date: 2024-10-29 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 eae19ebcc109c..904d79261236f 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-10-27 +date: 2024-10-29 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 528ba0c3fc560..61e4e6d111d4c 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-10-27 +date: 2024-10-29 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 40580e69a1b28..a3de13cc4b767 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-10-27 +date: 2024-10-29 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 3a842eec49a5a..68c73230fbc13 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-10-27 +date: 2024-10-29 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 2b1714db84e49..5d8ab8c26bbbc 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-10-27 +date: 2024-10-29 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 85d8a9d007c9c..2df290a82748f 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-10-27 +date: 2024-10-29 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 183e524fb65fa..cdb37edddb3e9 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-10-27 +date: 2024-10-29 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 af63a3fef1ffc..2bdb17e7a4c3e 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-10-27 +date: 2024-10-29 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 be923de7e3b48..bbed2ff1714e1 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-10-27 +date: 2024-10-29 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 36d340fd38aac..3ea5165976a66 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 143 | 0 | 142 | 0 | +| 141 | 0 | 140 | 0 | ## Common diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 5faf47d6af726..38bcd2cc9c383 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-10-27 +date: 2024-10-29 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 099ca6464689f..5ed1e06adc4da 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-10-27 +date: 2024-10-29 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 e18ca498bc0aa..0221f5ad298ee 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-10-27 +date: 2024-10-29 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 733c20df1b72b..c8a379debc461 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_manifest.mdx b/api_docs/kbn_manifest.mdx index 520fa60ae7b58..81beee7925706 100644 --- a/api_docs/kbn_manifest.mdx +++ b/api_docs/kbn_manifest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-manifest title: "@kbn/manifest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/manifest plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/manifest'] --- import kbnManifestObj from './kbn_manifest.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index d25022e0fa505..786771589ea27 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-10-27 +date: 2024-10-29 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 e19bf793905dd..62a2b89ef583a 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-10-27 +date: 2024-10-29 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 01d2284dfd351..7493b8f074c85 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-10-27 +date: 2024-10-29 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 d83c4f98a3438..b3b1902843fe5 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-10-27 +date: 2024-10-29 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 726ab1978a324..eb266a8c5afcc 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-10-27 +date: 2024-10-29 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 a74ad9715ef19..0256b8d5b3dbd 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-10-27 +date: 2024-10-29 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 e07b5cd8ffe4f..78a635f49cddb 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-10-27 +date: 2024-10-29 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 bf7af1b0f75d3..349ce3d9d1842 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-10-27 +date: 2024-10-29 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 c392a37f05beb..f034b0c48b16d 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-10-27 +date: 2024-10-29 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 3249a4c76ac81..0b3efc1290247 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-10-27 +date: 2024-10-29 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 d98911d9ac573..a60fdc4d9d7a5 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-10-27 +date: 2024-10-29 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 0826f16aa5e39..a9a6f376c8a45 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-10-27 +date: 2024-10-29 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_field_stats_flyout.mdx b/api_docs/kbn_ml_field_stats_flyout.mdx index 38165556eb3a0..470340bfcfb78 100644 --- a/api_docs/kbn_ml_field_stats_flyout.mdx +++ b/api_docs/kbn_ml_field_stats_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-field-stats-flyout title: "@kbn/ml-field-stats-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-field-stats-flyout plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-field-stats-flyout'] --- import kbnMlFieldStatsFlyoutObj from './kbn_ml_field_stats_flyout.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index d1cdeefff655b..3d1f6d15f40e6 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-10-27 +date: 2024-10-29 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 ff4e9fae7d13e..d5cb955b646ad 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-10-27 +date: 2024-10-29 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 8f3ead8f09344..af269cc653a43 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-10-27 +date: 2024-10-29 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 9d71f439e09f6..52464f1b5ce14 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-10-27 +date: 2024-10-29 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 942114d6975fe..299038fce2258 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-10-27 +date: 2024-10-29 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 3cf91b7bc50cb..dc497b8065f6e 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-10-27 +date: 2024-10-29 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 711c51c242d40..df34a4eddc2be 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-10-27 +date: 2024-10-29 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_parse_interval.mdx b/api_docs/kbn_ml_parse_interval.mdx index 6f9d72cfbf251..9b61a2cd9c910 100644 --- a/api_docs/kbn_ml_parse_interval.mdx +++ b/api_docs/kbn_ml_parse_interval.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-parse-interval title: "@kbn/ml-parse-interval" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-parse-interval plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-parse-interval'] --- import kbnMlParseIntervalObj from './kbn_ml_parse_interval.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 251f1297f32ec..b98f98ab662fa 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-10-27 +date: 2024-10-29 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 d6933dfadcab1..07e3c136d330a 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-10-27 +date: 2024-10-29 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 d6595fe833ba2..080c87f952a05 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-10-27 +date: 2024-10-29 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 d5d0087f7cc36..19b53e2278bf6 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-10-27 +date: 2024-10-29 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 410c709a09828..9a3354a802f82 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-10-27 +date: 2024-10-29 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 156b05d355bef..26ecb786ee295 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-10-27 +date: 2024-10-29 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 7863bf2460474..7fb38f79881de 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-10-27 +date: 2024-10-29 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 018fa30f34ee6..29df056a7fb92 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-10-27 +date: 2024-10-29 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 df43b9d06aad0..aa84b80c01ab0 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_ml_validators.mdx b/api_docs/kbn_ml_validators.mdx index b349289c0eaf2..d22dc9e026e9a 100644 --- a/api_docs/kbn_ml_validators.mdx +++ b/api_docs/kbn_ml_validators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-validators title: "@kbn/ml-validators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-validators plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-validators'] --- import kbnMlValidatorsObj from './kbn_ml_validators.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 1ac838aa88296..b193c9bee5c47 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-10-27 +date: 2024-10-29 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 4bdd1074dc378..2c59f56d79f26 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-10-27 +date: 2024-10-29 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 7e8e879e6f970..04c83fc5bbdfb 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_object_versioning_utils.mdx b/api_docs/kbn_object_versioning_utils.mdx index 579d7b84f6083..41323be27e90e 100644 --- a/api_docs/kbn_object_versioning_utils.mdx +++ b/api_docs/kbn_object_versioning_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning-utils title: "@kbn/object-versioning-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning-utils plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning-utils'] --- import kbnObjectVersioningUtilsObj from './kbn_object_versioning_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index b76e7a6b5e687..fe0dcd5944146 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-10-27 +date: 2024-10-29 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_rule_utils.mdx b/api_docs/kbn_observability_alerting_rule_utils.mdx index fee87f132ca33..f9696c490322c 100644 --- a/api_docs/kbn_observability_alerting_rule_utils.mdx +++ b/api_docs/kbn_observability_alerting_rule_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-rule-utils title: "@kbn/observability-alerting-rule-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-rule-utils plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-rule-utils'] --- import kbnObservabilityAlertingRuleUtilsObj from './kbn_observability_alerting_rule_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 3f084446d4ecf..40e67ee5af980 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-10-27 +date: 2024-10-29 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 45fb8a24b90b1..4e844a8ccfdaa 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-10-27 +date: 2024-10-29 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_observability_logs_overview.mdx b/api_docs/kbn_observability_logs_overview.mdx index 29057a81147a4..8e23ff06e78b4 100644 --- a/api_docs/kbn_observability_logs_overview.mdx +++ b/api_docs/kbn_observability_logs_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-logs-overview title: "@kbn/observability-logs-overview" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-logs-overview plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-logs-overview'] --- import kbnObservabilityLogsOverviewObj from './kbn_observability_logs_overview.devdocs.json'; diff --git a/api_docs/kbn_observability_synthetics_test_data.mdx b/api_docs/kbn_observability_synthetics_test_data.mdx index 550eab7d447c0..8c23a8d033605 100644 --- a/api_docs/kbn_observability_synthetics_test_data.mdx +++ b/api_docs/kbn_observability_synthetics_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-synthetics-test-data title: "@kbn/observability-synthetics-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-synthetics-test-data plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-synthetics-test-data'] --- import kbnObservabilitySyntheticsTestDataObj from './kbn_observability_synthetics_test_data.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 0a09d82135081..964c1c90898b9 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-10-27 +date: 2024-10-29 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 6fa4210c4e4ae..e177b09760d8b 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-10-27 +date: 2024-10-29 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 48cc35f097695..d461e6e883a3a 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-10-27 +date: 2024-10-29 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 26764f39916e6..b7f9911d142df 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-10-27 +date: 2024-10-29 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 2cd26372f728b..c5d6ea3092998 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-10-27 +date: 2024-10-29 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 b2079cec21a13..799b4e563753d 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-10-27 +date: 2024-10-29 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 f378d9a4f7f46..f44e71260edf7 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-10-27 +date: 2024-10-29 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 4d2608559a8ea..58c279e265a30 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-10-27 +date: 2024-10-29 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 b3a01e63f898a..ff4207acb1e13 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-10-27 +date: 2024-10-29 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 0e9616f4fc7b5..fbcbe71f5e6ef 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-10-27 +date: 2024-10-29 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 711ed185d9444..f873b523ac5a5 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-10-27 +date: 2024-10-29 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 4bc460dafe929..2a8c2dcee0a75 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_product_doc_artifact_builder.mdx b/api_docs/kbn_product_doc_artifact_builder.mdx index ae6c0f66d2029..6d89764bfbeaf 100644 --- a/api_docs/kbn_product_doc_artifact_builder.mdx +++ b/api_docs/kbn_product_doc_artifact_builder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-product-doc-artifact-builder title: "@kbn/product-doc-artifact-builder" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/product-doc-artifact-builder plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/product-doc-artifact-builder'] --- import kbnProductDocArtifactBuilderObj from './kbn_product_doc_artifact_builder.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 7815f8b3c82db..f3efb060e8567 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-10-27 +date: 2024-10-29 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 51f248162ec0b..16d90b33f6b0b 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-10-27 +date: 2024-10-29 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 346309262c12f..7af812ab24161 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index 236de89c826c9..58e5111bf0f94 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 6ec1233422388..7bb961acca4eb 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-10-27 +date: 2024-10-29 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 bfd6aef779fcd..6270aab96b1ff 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-10-27 +date: 2024-10-29 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 f027ec5d68187..b88dd4eb54f0c 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-10-27 +date: 2024-10-29 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 043cca26c038a..78310f89f7951 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-10-27 +date: 2024-10-29 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 81d0136f54147..cfaa730719d4e 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-10-27 +date: 2024-10-29 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 d4d8910e044ed..979dd494acffe 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx index cb551275ede77..a01060c33d61d 100644 --- a/api_docs/kbn_recently_accessed.mdx +++ b/api_docs/kbn_recently_accessed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-recently-accessed title: "@kbn/recently-accessed" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/recently-accessed plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] --- import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 2b0d1427a91a6..8e8600ae16bd2 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-10-27 +date: 2024-10-29 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 5bd45c93a5a6e..d8f90ab3aaa79 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-10-27 +date: 2024-10-29 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 271c6912d9cc2..b3a255ad3e045 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-10-27 +date: 2024-10-29 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 07e447d6bd584..7c9dbb2c4741b 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-10-27 +date: 2024-10-29 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 d377e6dbc6563..be668e07d7a70 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-10-27 +date: 2024-10-29 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 226e01ee00406..5cf72293160bf 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-10-27 +date: 2024-10-29 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 4969dac08b64e..af3604b5570fc 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-10-27 +date: 2024-10-29 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 6217f6bc674c5..5a402a817a24d 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-10-27 +date: 2024-10-29 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 39762efe1ccbd..e9a87020dc8d5 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-10-27 +date: 2024-10-29 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 ee6f50d73c595..36f200ad4b1a0 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-10-27 +date: 2024-10-29 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 19bef68062f30..f79e6204bf6c3 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-10-27 +date: 2024-10-29 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 47f72fe1b4021..c2d78cc9e5165 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-10-27 +date: 2024-10-29 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 73e176bc3fefd..8e76405d29abe 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-10-27 +date: 2024-10-29 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 552055f40c24b..6bd5f5e14e820 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-10-27 +date: 2024-10-29 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 0721baeec518e..44a14fb771ede 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-10-27 +date: 2024-10-29 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 1cdc3adc2167c..5fc7535667618 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_response_ops_feature_flag_service.mdx b/api_docs/kbn_response_ops_feature_flag_service.mdx index 360fdf742d397..98e710a3f3775 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_response_ops_rule_params.mdx b/api_docs/kbn_response_ops_rule_params.mdx index 2b26cc2529dfb..0efeec9337ef0 100644 --- a/api_docs/kbn_response_ops_rule_params.mdx +++ b/api_docs/kbn_response_ops_rule_params.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-rule-params title: "@kbn/response-ops-rule-params" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-rule-params plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-rule-params'] --- import kbnResponseOpsRuleParamsObj from './kbn_response_ops_rule_params.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 14210ee22155d..30d78a88f4d20 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index ebc34e8148696..1e5f5527865c6 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rollup'] --- import kbnRollupObj from './kbn_rollup.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index 39ee3e791d96a..aac78d2f4ea77 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-10-27 +date: 2024-10-29 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 c2495df29a4da..7b9f0bf9a8122 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-10-27 +date: 2024-10-29 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 96dcc1e02c95e..e4687938403f1 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-10-27 +date: 2024-10-29 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 bcda1a42e488a..d4cc44103a83a 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-10-27 +date: 2024-10-29 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 21f70877d8ca7..ef655270d104f 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_screenshotting_server.mdx b/api_docs/kbn_screenshotting_server.mdx index 60f27f058f3ab..ea61b9b3077e1 100644 --- a/api_docs/kbn_screenshotting_server.mdx +++ b/api_docs/kbn_screenshotting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-screenshotting-server title: "@kbn/screenshotting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/screenshotting-server plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/screenshotting-server'] --- import kbnScreenshottingServerObj from './kbn_screenshotting_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_components.mdx b/api_docs/kbn_search_api_keys_components.mdx index 9f501d9e2f51d..540d30ea3862c 100644 --- a/api_docs/kbn_search_api_keys_components.mdx +++ b/api_docs/kbn_search_api_keys_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-components title: "@kbn/search-api-keys-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-components plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-components'] --- import kbnSearchApiKeysComponentsObj from './kbn_search_api_keys_components.devdocs.json'; diff --git a/api_docs/kbn_search_api_keys_server.mdx b/api_docs/kbn_search_api_keys_server.mdx index 3e09efc45233f..0c1997ae3da90 100644 --- a/api_docs/kbn_search_api_keys_server.mdx +++ b/api_docs/kbn_search_api_keys_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-keys-server title: "@kbn/search-api-keys-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-keys-server plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-keys-server'] --- import kbnSearchApiKeysServerObj from './kbn_search_api_keys_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index c1a0296dd31f2..ba7769c70acdb 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-10-27 +date: 2024-10-29 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 472dc4048cb33..b879e94b3167d 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-10-27 +date: 2024-10-29 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 58ebe1745f1a1..c073a094c3233 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-10-27 +date: 2024-10-29 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 5c541c6ef0a95..ec316bdbecb63 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-10-27 +date: 2024-10-29 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 23377e375b630..de23440acbe1b 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_shared_ui.mdx b/api_docs/kbn_search_shared_ui.mdx index 2114610871ad9..e29708569c1ca 100644 --- a/api_docs/kbn_search_shared_ui.mdx +++ b/api_docs/kbn_search_shared_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-shared-ui title: "@kbn/search-shared-ui" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-shared-ui plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-shared-ui'] --- import kbnSearchSharedUiObj from './kbn_search_shared_ui.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index 50877fec4a190..08a57a0760293 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx index 8ce4299354c83..39d1bf07a5773 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-api-key-management title: "@kbn/security-api-key-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-api-key-management plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] --- import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core.mdx b/api_docs/kbn_security_authorization_core.mdx index 4aeef79856333..f7b92f00e421f 100644 --- a/api_docs/kbn_security_authorization_core.mdx +++ b/api_docs/kbn_security_authorization_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core title: "@kbn/security-authorization-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core'] --- import kbnSecurityAuthorizationCoreObj from './kbn_security_authorization_core.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core_common.mdx b/api_docs/kbn_security_authorization_core_common.mdx index 8620271ed5a3b..086b5b14f4a77 100644 --- a/api_docs/kbn_security_authorization_core_common.mdx +++ b/api_docs/kbn_security_authorization_core_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core-common title: "@kbn/security-authorization-core-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core-common plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core-common'] --- import kbnSecurityAuthorizationCoreCommonObj from './kbn_security_authorization_core_common.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index 091a234031919..ae2bb657b9388 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-form-components title: "@kbn/security-form-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-form-components plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] --- import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index fc722c3f7628b..ef6f143878b9a 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-10-27 +date: 2024-10-29 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 a2cfe471c75e6..1665751a0cf7d 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-10-27 +date: 2024-10-29 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 1a29b2120bc54..b46c18505af15 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-10-27 +date: 2024-10-29 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 d5042ae5de3fc..b1d0c138304e8 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-10-27 +date: 2024-10-29 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_role_management_model.mdx b/api_docs/kbn_security_role_management_model.mdx index 4edca359a63f3..96c1fdb1479e4 100644 --- a/api_docs/kbn_security_role_management_model.mdx +++ b/api_docs/kbn_security_role_management_model.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-role-management-model title: "@kbn/security-role-management-model" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-role-management-model plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-role-management-model'] --- import kbnSecurityRoleManagementModelObj from './kbn_security_role_management_model.devdocs.json'; diff --git a/api_docs/kbn_security_solution_common.mdx b/api_docs/kbn_security_solution_common.mdx index cfe7a3ecea7b6..77ac3403bb5b1 100644 --- a/api_docs/kbn_security_solution_common.mdx +++ b/api_docs/kbn_security_solution_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-common title: "@kbn/security-solution-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-common plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-common'] --- import kbnSecuritySolutionCommonObj from './kbn_security_solution_common.devdocs.json'; diff --git a/api_docs/kbn_security_solution_distribution_bar.mdx b/api_docs/kbn_security_solution_distribution_bar.mdx index f63a4fcf98fc3..84bbad961458b 100644 --- a/api_docs/kbn_security_solution_distribution_bar.mdx +++ b/api_docs/kbn_security_solution_distribution_bar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-distribution-bar title: "@kbn/security-solution-distribution-bar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-distribution-bar plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-distribution-bar'] --- import kbnSecuritySolutionDistributionBarObj from './kbn_security_solution_distribution_bar.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 2dc68a0a45668..f8717a8ab4505 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-10-27 +date: 2024-10-29 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 fb93fa0ce8328..1acbc11797c00 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-10-27 +date: 2024-10-29 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 95e033aa2e159..7755043d6ad7e 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-10-27 +date: 2024-10-29 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 64b44332fbdd2..d7014e68f587d 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-10-27 +date: 2024-10-29 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_security_ui_components.mdx b/api_docs/kbn_security_ui_components.mdx index 7e63cb6ebd03c..0f9167b7ee9f4 100644 --- a/api_docs/kbn_security_ui_components.mdx +++ b/api_docs/kbn_security_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-ui-components title: "@kbn/security-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-ui-components plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-ui-components'] --- import kbnSecurityUiComponentsObj from './kbn_security_ui_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 921740ebf4797..64c22fd6a2041 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-10-27 +date: 2024-10-29 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 6f5faa575d5d3..cbc39b3ca16c8 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-10-27 +date: 2024-10-29 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 ec867a95b99ed..7c9e0d14eda8a 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-10-27 +date: 2024-10-29 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 01b2fe6d63f97..748ad7c77374c 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-10-27 +date: 2024-10-29 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 bf93f9a8284b4..4f4c0428d4b97 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-10-27 +date: 2024-10-29 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_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 03159840deb06..79ed5e3018b61 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-10-27 +date: 2024-10-29 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 61cb517969ea4..e611916c3686e 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-10-27 +date: 2024-10-29 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 0e15477470937..e15e1b441dad0 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-10-27 +date: 2024-10-29 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 8a0d1fcab1f21..fda0727968327 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-10-27 +date: 2024-10-29 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 9eca190f7fbda..662762d9e2f8f 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-10-27 +date: 2024-10-29 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 f327d24b2cd90..2ed39cbc256cd 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-10-27 +date: 2024-10-29 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 757fcb277d5fb..52d48974b97bd 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-10-27 +date: 2024-10-29 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 26c49b9ac76ef..f87d1a4ff879f 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-10-27 +date: 2024-10-29 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 8dc56e6a9763e..90a42d400611c 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-10-27 +date: 2024-10-29 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 d6b0d16594daf..ec6de35f47f9f 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-10-27 +date: 2024-10-29 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 1b4d9fbd78866..46998b2be3afe 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-10-27 +date: 2024-10-29 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 511acb83e6dee..69075506cb0fc 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-10-27 +date: 2024-10-29 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 9f2e93b647e68..1944dfb444104 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-10-27 +date: 2024-10-29 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 101b4f7551e2b..dc6f7ca818d5f 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_client.mdx b/api_docs/kbn_server_route_repository_client.mdx index 98d42388a9301..d0c7f5a07756c 100644 --- a/api_docs/kbn_server_route_repository_client.mdx +++ b/api_docs/kbn_server_route_repository_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-client title: "@kbn/server-route-repository-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-client plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-client'] --- import kbnServerRouteRepositoryClientObj from './kbn_server_route_repository_client.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_utils.mdx b/api_docs/kbn_server_route_repository_utils.mdx index e1d27de6477e6..f505a2fb43fff 100644 --- a/api_docs/kbn_server_route_repository_utils.mdx +++ b/api_docs/kbn_server_route_repository_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-utils title: "@kbn/server-route-repository-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-utils plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-utils'] --- import kbnServerRouteRepositoryUtilsObj from './kbn_server_route_repository_utils.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index d308d1560020d..883c43482fabc 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-10-27 +date: 2024-10-29 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 32a02192268cc..015186f3db80d 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-10-27 +date: 2024-10-29 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 013fbb2018b4f..f1fd121d09fcf 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-10-27 +date: 2024-10-29 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 f5b6f1c073dd9..fa080c27c7e43 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-10-27 +date: 2024-10-29 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 32c30cc423ded..2c622a25b6c2e 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-10-27 +date: 2024-10-29 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 c3e9ab8b254b5..7c81c6b809ce9 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-10-27 +date: 2024-10-29 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 da350b292d2ac..f5bf024eabc24 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-10-27 +date: 2024-10-29 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 2bb79085c3763..188a24c84f6ec 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-10-27 +date: 2024-10-29 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 158ee878ec0ce..e789d66d4bf24 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-10-27 +date: 2024-10-29 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 a3bc602f459b5..df02ab9f915e9 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-10-27 +date: 2024-10-29 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 15c043f74b6bc..a53686d74d989 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-10-27 +date: 2024-10-29 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 0fbbdea618589..4cb55ec52ebef 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-10-27 +date: 2024-10-29 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 c7ca512238429..0816afb400258 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-10-27 +date: 2024-10-29 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 350c298c15089..5a3e15902d5dc 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-10-27 +date: 2024-10-29 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 9833e61908302..366c523e8d3f7 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-10-27 +date: 2024-10-29 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 25305fe7606cd..358dc6b152286 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-10-27 +date: 2024-10-29 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 b680a8216d054..7934c4b2d202e 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-10-27 +date: 2024-10-29 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 3dafe7817685d..01887d49b64ec 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-10-27 +date: 2024-10-29 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 1aa228ec5ac50..b584c639d4c1a 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-10-27 +date: 2024-10-29 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 4e61fa18e7837..7c9454dba6091 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-10-27 +date: 2024-10-29 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 930eb0f9056f5..7ba1d25553035 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-10-27 +date: 2024-10-29 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 1cb1035f333b8..4174657a7fb5f 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-10-27 +date: 2024-10-29 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 858d68e7c5ed9..15d2c099b15f5 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-10-27 +date: 2024-10-29 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 4512dffce97db..984517f26d2fa 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-10-27 +date: 2024-10-29 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 9ca9dc39d4930..d77ab3f81f38a 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-10-27 +date: 2024-10-29 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 65d4a0042c2df..3039730643c8e 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-10-27 +date: 2024-10-29 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 be8377c9dfea7..e7d4c421e3717 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-10-27 +date: 2024-10-29 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 89a97a0c7126e..7f4250882668d 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-10-27 +date: 2024-10-29 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 dc6f7fdaa96c1..d7dd5d2ba4407 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-10-27 +date: 2024-10-29 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 bbce8fac91fcb..027cc691f2609 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-10-27 +date: 2024-10-29 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 4a8ab15fe7373..7a1c869fc1e2d 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-10-27 +date: 2024-10-29 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 6227613502ed1..6ddab7c636663 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-10-27 +date: 2024-10-29 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 352966d6b44d3..ba069b143152b 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-10-27 +date: 2024-10-29 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 29cc1a95c93e1..3d3deb93bc283 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-10-27 +date: 2024-10-29 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 0a2d6db51036b..6d8fbc998404c 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-10-27 +date: 2024-10-29 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 8e06087e8040d..3cec33f873835 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-10-27 +date: 2024-10-29 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 22f6406a288bd..f1712e2145dec 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-10-27 +date: 2024-10-29 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 c4a1916f5c513..bea6a52e49997 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-10-27 +date: 2024-10-29 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 e6a85b01a91a3..9a1bdaad4c166 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-10-27 +date: 2024-10-29 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 19d2d50bca51a..d4ae57c34e6ed 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-10-27 +date: 2024-10-29 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 f9096e050b2e0..3b4cc1e98bc97 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-10-27 +date: 2024-10-29 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 b426498ab2c39..8e45c9eaa9c7f 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-10-27 +date: 2024-10-29 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 20df2b7b9a7db..8af223ca2c8e9 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-10-27 +date: 2024-10-29 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 2a80e83c88cee..95c1456629de5 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-10-27 +date: 2024-10-29 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 6e919b34fa752..e6c1736c5bca8 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-10-27 +date: 2024-10-29 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_table_persist.mdx b/api_docs/kbn_shared_ux_table_persist.mdx index 3ce693e46ff4c..bc62c615819bc 100644 --- a/api_docs/kbn_shared_ux_table_persist.mdx +++ b/api_docs/kbn_shared_ux_table_persist.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-table-persist title: "@kbn/shared-ux-table-persist" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-table-persist plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-table-persist'] --- import kbnSharedUxTablePersistObj from './kbn_shared_ux_table_persist.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 9790d6bd2c2af..a5f5cd2083292 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-10-27 +date: 2024-10-29 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 db2defa4abd19..da73f4818c9b3 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 3165ab57985b6..3f6091d85d25d 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-10-27 +date: 2024-10-29 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 193424cb8f2cc..64f95bc4686ee 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_sse_utils.mdx b/api_docs/kbn_sse_utils.mdx index 1e314023fedba..24629ee7e105f 100644 --- a/api_docs/kbn_sse_utils.mdx +++ b/api_docs/kbn_sse_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils title: "@kbn/sse-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils'] --- import kbnSseUtilsObj from './kbn_sse_utils.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_client.mdx b/api_docs/kbn_sse_utils_client.mdx index d89fc40c3c391..edb75018e6d9a 100644 --- a/api_docs/kbn_sse_utils_client.mdx +++ b/api_docs/kbn_sse_utils_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-client title: "@kbn/sse-utils-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-client plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-client'] --- import kbnSseUtilsClientObj from './kbn_sse_utils_client.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_server.mdx b/api_docs/kbn_sse_utils_server.mdx index cd054acab1cc4..dd128b9304c98 100644 --- a/api_docs/kbn_sse_utils_server.mdx +++ b/api_docs/kbn_sse_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-server title: "@kbn/sse-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-server plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-server'] --- import kbnSseUtilsServerObj from './kbn_sse_utils_server.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 97589351d2a6a..6db1e4a125398 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-10-27 +date: 2024-10-29 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 45cf70edeadf0..07c58b5a73168 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-10-27 +date: 2024-10-29 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 fb690dff7f5ce..6e836b362c4d9 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_synthetics_e2e.mdx b/api_docs/kbn_synthetics_e2e.mdx index 4c1e5f206bea2..3b045981a3e89 100644 --- a/api_docs/kbn_synthetics_e2e.mdx +++ b/api_docs/kbn_synthetics_e2e.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-e2e title: "@kbn/synthetics-e2e" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-e2e plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-e2e'] --- import kbnSyntheticsE2eObj from './kbn_synthetics_e2e.devdocs.json'; diff --git a/api_docs/kbn_synthetics_private_location.mdx b/api_docs/kbn_synthetics_private_location.mdx index d9b869a6b632d..75caefb12969b 100644 --- a/api_docs/kbn_synthetics_private_location.mdx +++ b/api_docs/kbn_synthetics_private_location.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-private-location title: "@kbn/synthetics-private-location" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-private-location plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-private-location'] --- import kbnSyntheticsPrivateLocationObj from './kbn_synthetics_private_location.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 3ddd87fc5cf21..2187a9c8a47dc 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-10-27 +date: 2024-10-29 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 79a83b98ec40d..d7d86a4df5901 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-10-27 +date: 2024-10-29 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 816646fef8953..21f26e2cd72bc 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-10-27 +date: 2024-10-29 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 8039de4026492..f6fd9c9e003bb 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-10-27 +date: 2024-10-29 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 15dd37e46dac3..4dc65163535b1 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index f27c18987c977..a635fad0174b5 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-10-27 +date: 2024-10-29 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 122f5e5e558fa..eceadabba223a 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_transpose_utils.mdx b/api_docs/kbn_transpose_utils.mdx index 537b4b2d977a7..f651f54c856c8 100644 --- a/api_docs/kbn_transpose_utils.mdx +++ b/api_docs/kbn_transpose_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-transpose-utils title: "@kbn/transpose-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/transpose-utils plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/transpose-utils'] --- import kbnTransposeUtilsObj from './kbn_transpose_utils.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index b838ded1ee99f..2736fb8d9baef 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-10-27 +date: 2024-10-29 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_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index 61d2d9aa98a9c..0a37a086b7fdf 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 9f792e4913a1b..e7b8645e03e80 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-10-27 +date: 2024-10-29 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 155e4604b67fd..413418e47f95b 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-10-27 +date: 2024-10-29 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 d17cf0be1a635..195c18f0ff2e6 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-10-27 +date: 2024-10-29 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 d6836492e6f1b..3963aa1bc0167 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-10-27 +date: 2024-10-29 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 d79d29085b115..68308496b1762 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-10-27 +date: 2024-10-29 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 b66d425ac7820..053a8c6ed9e0c 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-10-27 +date: 2024-10-29 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 686fe0b085753..f4aff957a78d5 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-10-27 +date: 2024-10-29 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 169d25414c62a..4c30382cef8ce 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-10-27 +date: 2024-10-29 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 f900c622d1066..4fa8519ac696a 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index b12c33f70b5ea..608d1678b7d51 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] --- import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 50e81626dad79..970ae0b4b5997 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-10-27 +date: 2024-10-29 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 eacc472bdad86..6cc8511f86f01 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-10-27 +date: 2024-10-29 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 6ce5b5bb1e3da..fa8446ade477b 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-10-27 +date: 2024-10-29 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 145f518501d87..3485a0594d65d 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-10-27 +date: 2024-10-29 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 297390b23c88e..fc954adb62df8 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-10-27 +date: 2024-10-29 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 d116550505dbf..97486a4e0f2ee 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-10-27 +date: 2024-10-29 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 1e9eb13a01513..648d7a7975ffc 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-10-27 +date: 2024-10-29 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 632ef783b8aa2..209f4d7966d88 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-10-27 +date: 2024-10-29 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 0cbb0bc6a9675..70f77e4f61ee1 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-10-27 +date: 2024-10-29 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.mdx b/api_docs/kbn_zod.mdx index 95c3748135fde..bd69f8e1e2ebf 100644 --- a/api_docs/kbn_zod.mdx +++ b/api_docs/kbn_zod.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod title: "@kbn/zod" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod'] --- import kbnZodObj from './kbn_zod.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index a9bcfe80b9f95..9edb0995d158c 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-10-27 +date: 2024-10-29 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 7ef09dd89e61a..7fc7de83e5b4f 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-10-27 +date: 2024-10-29 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 8fc874e9f7b96..a9a94d47bb29b 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-10-27 +date: 2024-10-29 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 aabedd032b36e..5e666d30f4e39 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-10-27 +date: 2024-10-29 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 ced61c9881d0a..92ec567429653 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-10-27 +date: 2024-10-29 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 a36071cda95cd..af161c830af13 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-10-27 +date: 2024-10-29 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 22d2fc78a57ad..de0d742a6747d 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-10-27 +date: 2024-10-29 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 e49c3963b8eed..62ae45842b17f 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-10-27 +date: 2024-10-29 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 ccd464668d052..21572811dbc03 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-10-27 +date: 2024-10-29 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 92680f5ed66f3..3a1feebc2b790 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-10-27 +date: 2024-10-29 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 71c8dd5819e1a..f3c02c51f8c29 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index a9e1df0840058..c010844a6a562 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index ab51a90676fd3..01773c8ec99c6 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-10-27 +date: 2024-10-29 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 e89f97c159fa7..7a8c032479cdd 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-10-27 +date: 2024-10-29 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 7f99a05af1860..fb30ef399c3b1 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-10-27 +date: 2024-10-29 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 766e1fdf22124..abafcb455e509 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-10-27 +date: 2024-10-29 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 b93ad0fc45837..dfdb7e586edf4 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-10-27 +date: 2024-10-29 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 2789bf68dd480..a2bc3db44a3bc 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-10-27 +date: 2024-10-29 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 2970cdd86ac3a..f4401a9d19085 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-10-27 +date: 2024-10-29 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 583e0bd5a96d6..aa9bf48e602fb 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-10-27 +date: 2024-10-29 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 92566fcbb484a..780e5c774f531 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-10-27 +date: 2024-10-29 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 3a56ad7865de1..47c4b92dad987 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-10-27 +date: 2024-10-29 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 493edf216126c..3ac147e7dc750 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-10-27 +date: 2024-10-29 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 c8dc309b5b549..c701b19f9d838 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-10-27 +date: 2024-10-29 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 4a3f6fecf176a..66faaeda7fac7 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-10-27 +date: 2024-10-29 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 d57ab31eb93b3..1ab532f6e8654 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-10-27 +date: 2024-10-29 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 339d237ab38c3..048ddb25efaa5 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 710 | 2 | 702 | 23 | +| 694 | 2 | 686 | 23 | ## Client diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index a83c5ea1b5a87..48f8c9ad8e516 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-10-27 +date: 2024-10-29 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 f76e79e7f413d..1d46f31b696ca 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-10-27 +date: 2024-10-29 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 b595620789c91..3bde743ca1288 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-10-27 +date: 2024-10-29 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 a3bd4c1024435..32cc2ced144a6 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-10-27 +date: 2024-10-29 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 23560841a20c4..be5762cab1112 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-10-27 +date: 2024-10-29 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 aaa6bebc3c572..da2e22d6107d7 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-10-27 +date: 2024-10-29 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 afd9dbd1ef85c..4473b2dab7d9d 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-10-27 +date: 2024-10-29 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 b57539e5ff29a..7295ee3d3fb6e 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-10-27 +date: 2024-10-29 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 ead64f3f00570..7f90789c54ae4 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 54090 | 242 | 40663 | 2019 | +| 54073 | 242 | 40646 | 2019 | ## Plugin Directory @@ -152,7 +152,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@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) | - | 710 | 2 | 702 | 23 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 694 | 2 | 686 | 23 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 296 | 1 | 294 | 27 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 4 | 0 | 4 | 0 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | @@ -277,7 +277,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 62 | 0 | 17 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 2 | 0 | -| | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 88 | 1 | 88 | 0 | +| | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 89 | 1 | 89 | 0 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 109 | 0 | 107 | 1 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 18 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 41 | 0 | 17 | 0 | @@ -574,7 +574,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 23 | 0 | 7 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 8 | 0 | 2 | 3 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 45 | 0 | 0 | 0 | -| | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 143 | 0 | 142 | 0 | +| | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 141 | 0 | 140 | 0 | | | [@elastic/appex-sharedux @elastic/kibana-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 20 | 0 | 11 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 88 | 0 | 10 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 56 | 0 | 6 | 0 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index c0ce357cee562..0e656daefd615 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-10-27 +date: 2024-10-29 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 90fcae3f2fa53..afd2c788123f7 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-10-27 +date: 2024-10-29 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 2a4c650ac8605..a754c27b9a3af 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-10-27 +date: 2024-10-29 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 bd91c309bf7e5..336420a32f05c 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-10-27 +date: 2024-10-29 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 60fc8442debe6..b6dbfddf6aa61 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-10-27 +date: 2024-10-29 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 a8ae1e1a2c50e..8e584ade12ea6 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-10-27 +date: 2024-10-29 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 e986e2ea5a122..c29f86f4fd24a 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-10-27 +date: 2024-10-29 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 7f41a70d5f3ee..aece216c509cb 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-10-27 +date: 2024-10-29 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 835e03193ae9a..b4fa409a1ed21 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-10-27 +date: 2024-10-29 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 c2340e9de47d9..85676b5a338d4 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-10-27 +date: 2024-10-29 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 92eb82f15762f..0a7ec178cb9a5 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-10-27 +date: 2024-10-29 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 cb429154f62f2..f842a2d62f379 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-10-27 +date: 2024-10-29 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 21f273ba7e76b..4af414f0fd643 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-10-27 +date: 2024-10-29 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 5d8b3deb17fa7..80f7dd5d1f873 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-10-27 +date: 2024-10-29 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 f9d362318a1a7..7dba909b3fe86 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-10-27 +date: 2024-10-29 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 be96cfa480480..abeaf1c896a02 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-10-27 +date: 2024-10-29 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 d0da6b1e456d4..a17e568637578 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_assistant.mdx b/api_docs/search_assistant.mdx index 161cc5d7f721a..94d55df693e8f 100644 --- a/api_docs/search_assistant.mdx +++ b/api_docs/search_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchAssistant title: "searchAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the searchAssistant plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchAssistant'] --- import searchAssistantObj from './search_assistant.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 2cbc5eccbff16..50fb8cab753c9 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index 0b6bb0cc4cca9..a9954afe4df0b 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_indices.mdx b/api_docs/search_indices.mdx index 7eba82aa8d0d8..f9e6296b62441 100644 --- a/api_docs/search_indices.mdx +++ b/api_docs/search_indices.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchIndices title: "searchIndices" image: https://source.unsplash.com/400x175/?github description: API docs for the searchIndices plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchIndices'] --- import searchIndicesObj from './search_indices.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index f6b5b635b493d..638476d27ad13 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 7f97b31933c58..8073d0f6cd8ba 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-10-27 +date: 2024-10-29 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 5248edf08fff6..9de8e31c53e03 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-10-27 +date: 2024-10-29 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 b01922ad9ab92..7247c07ae0a73 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 786a468e240b0..07363049df384 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-10-27 +date: 2024-10-29 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 3200fd64958e2..214913c6ee972 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-10-27 +date: 2024-10-29 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 336b85229691c..56660f9e739b6 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-10-27 +date: 2024-10-29 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 bbe3a99c0e613..440495f90bccb 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-10-27 +date: 2024-10-29 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 52d021c6f4343..46fd76d3c7a46 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-10-27 +date: 2024-10-29 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 756c5b8b0c5cc..2be504bf78571 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-10-27 +date: 2024-10-29 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 aaa44ef9201a3..b6ef4bb0426bc 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-10-27 +date: 2024-10-29 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 98a06f0d34654..105bb47b0e6aa 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-10-27 +date: 2024-10-29 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 ad14c468048db..35fda9d029861 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-10-27 +date: 2024-10-29 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 d1dfaccfb10c1..29cd041453c9f 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-10-27 +date: 2024-10-29 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 efeb66af07505..38f16f9689e23 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-10-27 +date: 2024-10-29 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 91636172a6851..de98035b56586 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-10-27 +date: 2024-10-29 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 f1ae68cc3bd4e..d158ef80add1d 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-10-27 +date: 2024-10-29 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 6d4b70d1e856d..8ac5f33af1066 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-10-27 +date: 2024-10-29 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 86a749fdc07b2..cc69d570e86ef 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-10-27 +date: 2024-10-29 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 ffd53bd61abaa..389a9b5546e1f 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-10-27 +date: 2024-10-29 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 525fbb74ac9e3..1f738be296108 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-10-27 +date: 2024-10-29 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 bb4b9f0bf18f2..7f140b3f89533 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 6b562ff29555e..a7fac2c78449e 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-10-27 +date: 2024-10-29 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 2f53d06d5037d..9c3be393bfb02 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-10-27 +date: 2024-10-29 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 d7fb4a184ad08..cf2886680f4c2 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-10-27 +date: 2024-10-29 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 d3fa8ec54739b..cd9ab1db37678 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-10-27 +date: 2024-10-29 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 03fcb22399e4b..f3f746140b3e4 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-10-27 +date: 2024-10-29 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 4e8b8b1301e94..cc6a40541f673 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-10-27 +date: 2024-10-29 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 0be838c5e4933..607f30a503af0 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-10-27 +date: 2024-10-29 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 fd26be77f8800..9444fb3fc24f5 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-10-27 +date: 2024-10-29 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 0e123243a9f62..dd3c05f389fc3 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-10-27 +date: 2024-10-29 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 8dcce2b1ab86e..0464a486eefe1 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-10-27 +date: 2024-10-29 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 55af80ab23aaa..25e8b52249f51 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-10-27 +date: 2024-10-29 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 d9c9ff108aa0a..a231f10fe5fd9 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-10-27 +date: 2024-10-29 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 a57f3e33baa86..70a62e3163e51 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-10-27 +date: 2024-10-29 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 f4d71ab01f85c..e051c92d227a7 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-10-27 +date: 2024-10-29 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 558adeae30271..d48a74c2a5db8 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-10-27 +date: 2024-10-29 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 8747ba2842373..cd1acb2a34f1f 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-10-27 +date: 2024-10-29 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 97f5c9fb1fa18..fc5ccee769b45 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-10-27 +date: 2024-10-29 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 3b2593c03f0a2..ad5b20ace0a5e 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-10-27 +date: 2024-10-29 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 dcebfd87749aa..23c2b8139e2e3 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-10-27 +date: 2024-10-29 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 555cafee7bc25..561487fc985bb 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-10-27 +date: 2024-10-29 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 16f64245c2303..44e78cec00a59 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-10-27 +date: 2024-10-29 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 3cc2ba78c3a18..61814f4fe1e79 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-10-27 +date: 2024-10-29 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 118052e4ba715..4ac611c78c136 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-10-27 +date: 2024-10-29 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 ebf14c56847a1..7aa02deae55c1 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-10-27 +date: 2024-10-29 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 ea8a18adaf9d2..111d20c3ec900 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-10-27 +date: 2024-10-29 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 9622f62153f597ea91b34f7e2c877fe70b30f231 Mon Sep 17 00:00:00 2001 From: Maxim Palenov Date: Tue, 29 Oct 2024 10:36:33 +0300 Subject: [PATCH 116/135] [Security Solution][Hotfix] Avoid blocking prebuilt rule upgrade upon conflicts with disabled feature flag (#198106) ## Summary It turned out some of the update rule buttons are disabled. This is a side effect of the functionality not fully hidden under a feature flag. This PR hides prebuilt rule customisation functionality disabling update rule buttons under `prebuiltRulesCustomizationEnabled` feature flag. ## Before ![image](https://github.com/user-attachments/assets/b7ca5ff8-be37-47a7-ad7e-b85386909f38) ## After image image --- .../use_prebuilt_rules_upgrade_state.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_prebuilt_rules_upgrade_state.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_prebuilt_rules_upgrade_state.ts index d44f9738b1fd6..29c5b2b201fe6 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_prebuilt_rules_upgrade_state.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/use_prebuilt_rules_upgrade_state.ts @@ -6,6 +6,7 @@ */ import { useCallback, useMemo, useState } from 'react'; +import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use_experimental_features'; import type { RulesUpgradeState, FieldsUpgradeState, @@ -32,6 +33,9 @@ interface UseRulesUpgradeStateResult { export function usePrebuiltRulesUpgradeState( ruleUpgradeInfos: RuleUpgradeInfoForReview[] ): UseRulesUpgradeStateResult { + const isPrebuiltRulesCustomizationEnabled = useIsExperimentalFeatureEnabled( + 'prebuiltRulesCustomizationEnabled' + ); const [rulesResolvedConflicts, setRulesResolvedConflicts] = useState({}); const setRuleFieldResolvedValue = useCallback( @@ -61,16 +65,17 @@ export function usePrebuiltRulesUpgradeState( ruleUpgradeInfo.diff.fields, rulesResolvedConflicts[ruleUpgradeInfo.rule_id] ?? {} ), - hasUnresolvedConflicts: - getUnacceptedConflictsCount( - ruleUpgradeInfo.diff.fields, - rulesResolvedConflicts[ruleUpgradeInfo.rule_id] ?? {} - ) > 0, + hasUnresolvedConflicts: isPrebuiltRulesCustomizationEnabled + ? getUnacceptedConflictsCount( + ruleUpgradeInfo.diff.fields, + rulesResolvedConflicts[ruleUpgradeInfo.rule_id] ?? {} + ) > 0 + : false, }; } return state; - }, [ruleUpgradeInfos, rulesResolvedConflicts]); + }, [ruleUpgradeInfos, rulesResolvedConflicts, isPrebuiltRulesCustomizationEnabled]); return { rulesUpgradeState, From 3131dd9bfa1ee28fa12f90bb6ae8060da9e44665 Mon Sep 17 00:00:00 2001 From: jennypavlova Date: Tue, 29 Oct 2024 09:42:43 +0100 Subject: [PATCH 117/135] [Infra] Fix anomalies flyout navigation failing test (#197999) Closes #192882 The issue was that the url was checked too early which resulted in checking the locator url instead of the page url after navigating so I added a check for loading before the URL check and this solved the issue. https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/7284 --- x-pack/test/functional/apps/infra/metrics_anomalies.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/infra/metrics_anomalies.ts b/x-pack/test/functional/apps/infra/metrics_anomalies.ts index 0d1b57d22c412..f5d0f0345d4b3 100644 --- a/x-pack/test/functional/apps/infra/metrics_anomalies.ts +++ b/x-pack/test/functional/apps/infra/metrics_anomalies.ts @@ -12,7 +12,13 @@ import { HOSTS_VIEW_PATH, ML_JOB_IDS } from './constants'; export default ({ getPageObjects, getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); - const pageObjects = getPageObjects(['assetDetails', 'common', 'infraHome', 'infraHostsView']); + const pageObjects = getPageObjects([ + 'assetDetails', + 'common', + 'infraHome', + 'infraHostsView', + 'header', + ]); const infraSourceConfigurationForm = getService('infraSourceConfigurationForm'); const testSubjects = getService('testSubjects'); const browser = getService('browser'); @@ -144,6 +150,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.infraHome.setAnomaliesDate('Apr 21, 2021 @ 00:00:00.000'); const hostName = await pageObjects.infraHome.getAnomalyHostName(); await pageObjects.infraHome.clickShowAffectedHostsButton(); + await pageObjects.header.waitUntilLoadingHasFinished(); const currentUrl = await browser.getCurrentUrl(); expect(currentUrl).to.contain( encodeURIComponent(`query:(terms:(host.name:!(${hostName})))`) From 735b2de08a5ab8d4b65e101cca6a044372726627 Mon Sep 17 00:00:00 2001 From: jennypavlova Date: Tue, 29 Oct 2024 09:43:20 +0100 Subject: [PATCH 118/135] [ObsUx][Infra] Unskip and try to fix hosts view test (#197861) Closes #191806 The parts of the unskipped test were fixed here - the only case I couldn't find the reason for failing after unskipping it is `should have an option to open the chart in lens` - for some reason, the whole menu is gone when checking the CI and I couldn't reproduce that so this will be the only skipped part so we can at least have all the other `Hosts view` tests --- x-pack/test/functional/apps/infra/hosts_view.ts | 12 +++++------- .../test/functional/page_objects/infra_hosts_view.ts | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/x-pack/test/functional/apps/infra/hosts_view.ts b/x-pack/test/functional/apps/infra/hosts_view.ts index 720315d421349..dd6a420d27fbe 100644 --- a/x-pack/test/functional/apps/infra/hosts_view.ts +++ b/x-pack/test/functional/apps/infra/hosts_view.ts @@ -298,8 +298,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { (await pageObjects.infraHostsView.isKPIChartsLoaded()) ); - // Failing: See https://github.com/elastic/kibana/issues/191806 - describe.skip('Hosts View', function () { + describe('Hosts View', function () { let synthEsInfraClient: InfraSynthtraceEsClient; let syntEsLogsClient: LogsSynthtraceEsClient; let synthtraceApmClient: ApmSynthtraceEsClient; @@ -420,10 +419,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { ].forEach(({ metric, value }) => { it(`${metric} tile should show ${value}`, async () => { await retry.tryForTime(5000, async () => { - const tileValue = await pageObjects.assetDetails.getAssetDetailsKPITileValue( - metric + expect(await pageObjects.assetDetails.getAssetDetailsKPITileValue(metric)).to.eql( + value ); - expect(tileValue).to.eql(value); }); }); }); @@ -676,7 +674,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('Metrics Tab', () => { before(async () => { - await browser.scrollTop(); await pageObjects.infraHostsView.visitMetricsTab(); }); @@ -689,7 +686,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(metricCharts.length).to.equal(11); }); - it('should have an option to open the chart in lens', async () => { + // flaky, the option is not visible + it.skip('should have an option to open the chart in lens', async () => { await retry.tryForTime(5000, async () => { await pageObjects.infraHostsView.clickAndValidateMetricChartActionOptions(); await browser.pressKeys(browser.keys.ESCAPE); diff --git a/x-pack/test/functional/page_objects/infra_hosts_view.ts b/x-pack/test/functional/page_objects/infra_hosts_view.ts index 2f23af9ddf500..21afc63c81cd1 100644 --- a/x-pack/test/functional/page_objects/infra_hosts_view.ts +++ b/x-pack/test/functional/page_objects/infra_hosts_view.ts @@ -135,7 +135,7 @@ export function InfraHostsViewProvider({ getService }: FtrProviderContext) { await element.moveMouseTo(); const button = await element.findByTestSubject('embeddablePanelToggleMenuIcon'); await button.click(); - await testSubjects.existOrFail('embeddablePanelAction-openInLens'); + return testSubjects.existOrFail('embeddablePanelAction-openInLens'); }, // KPIs From 3c7268d6ca18efa4bde7c398fe659202fc8b457d Mon Sep 17 00:00:00 2001 From: Ido Cohen <90558359+CohenIdo@users.noreply.github.com> Date: Tue, 29 Oct 2024 11:41:37 +0200 Subject: [PATCH 119/135] [Cloud Security] Fix flaky metering tests --- .../cloud_security_metering.ts | 52 ++++++++----------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/cloud_security_metering.ts b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/cloud_security_metering.ts index 08f6962e3a0dc..b57dace68c4da 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/cloud_security_metering.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/cloud_security_metering.ts @@ -43,8 +43,7 @@ export default function (providerContext: FtrProviderContext) { The task manager is running by default in security serverless project in the background and sending usage API requests to the usage API. This test mocks the usage API server and intercepts the usage API request sent by the metering background task manager. */ - // FLAKY: https://github.com/elastic/kibana/issues/188829 - describe.skip('Intercept the usage API request sent by the metering background task manager', function () { + describe('Intercept the usage API request sent by the metering background task manager', function () { this.tags(['skipMKI']); let mockUsageApiServer: http.Server; @@ -118,16 +117,15 @@ export default function (providerContext: FtrProviderContext) { let interceptedRequestBody: UsageRecord[] = []; await retry.try(async () => { - interceptedRequestBody = getInterceptedRequestPayload(); - expect(interceptedRequestBody.length).to.greaterThan(0); if (interceptedRequestBody.length > 0) { + interceptedRequestBody = getInterceptedRequestPayload(); + expect(interceptedRequestBody.length).to.greaterThan(0); const usageSubTypes = interceptedRequestBody.map((record) => record.usage.sub_type); expect(usageSubTypes).to.contain('cspm'); + expect(interceptedRequestBody[0].usage.type).to.be('cloud_security'); + expect(interceptedRequestBody[0].usage.quantity).to.be(billableFindings.length); } }); - - expect(interceptedRequestBody[0].usage.type).to.be('cloud_security'); - expect(interceptedRequestBody[0].usage.quantity).to.be(billableFindings.length); }); it('Should intercept usage API request for KSPM', async () => { @@ -159,16 +157,15 @@ export default function (providerContext: FtrProviderContext) { let interceptedRequestBody: UsageRecord[] = []; await retry.try(async () => { - interceptedRequestBody = getInterceptedRequestPayload(); - expect(interceptedRequestBody.length).to.greaterThan(0); if (interceptedRequestBody.length > 0) { + interceptedRequestBody = getInterceptedRequestPayload(); + expect(interceptedRequestBody.length).to.greaterThan(0); const usageSubTypes = interceptedRequestBody.map((record) => record.usage.sub_type); expect(usageSubTypes).to.contain('kspm'); + expect(interceptedRequestBody[0].usage.type).to.be('cloud_security'); + expect(interceptedRequestBody[0].usage.quantity).to.be(billableFindings.length); } }); - - expect(interceptedRequestBody[0].usage.type).to.be('cloud_security'); - expect(interceptedRequestBody[0].usage.quantity).to.be(billableFindings.length); }); it('Should intercept usage API request for CNVM', async () => { @@ -199,11 +196,10 @@ export default function (providerContext: FtrProviderContext) { if (interceptedRequestBody.length > 0) { const usageSubTypes = interceptedRequestBody.map((record) => record.usage.sub_type); expect(usageSubTypes).to.contain('cnvm'); + expect(interceptedRequestBody[0].usage.type).to.be('cloud_security'); + expect(interceptedRequestBody[0].usage.quantity).to.be(billableFindings.length); } }); - - expect(interceptedRequestBody[0].usage.type).to.be('cloud_security'); - expect(interceptedRequestBody[0].usage.quantity).to.be(billableFindings.length); }); it('Should intercept usage API request for Defend for Containers', async () => { @@ -237,11 +233,10 @@ export default function (providerContext: FtrProviderContext) { if (interceptedRequestBody.length > 0) { const usageSubTypes = interceptedRequestBody.map((record) => record.usage.sub_type); expect(usageSubTypes).to.contain('cloud_defend'); + expect(interceptedRequestBody.length).to.be(blockActionEnabledHeartbeats.length); + expect(interceptedRequestBody[0].usage.type).to.be('cloud_security'); } }); - - expect(interceptedRequestBody.length).to.be(blockActionEnabledHeartbeats.length); - expect(interceptedRequestBody[0].usage.type).to.be('cloud_security'); }); it('Should intercept usage API request with all integrations usage records', async () => { @@ -329,18 +324,17 @@ export default function (providerContext: FtrProviderContext) { expect(usageSubTypes).to.contain('kspm'); expect(usageSubTypes).to.contain('cnvm'); expect(usageSubTypes).to.contain('cloud_defend'); + const totalUsageQuantity = interceptedRequestBody.reduce( + (acc, record) => acc + record.usage.quantity, + 0 + ); + expect(totalUsageQuantity).to.be( + billableFindingsCSPM.length + + billableFindingsKSPM.length + + billableFindingsCNVM.length + + blockActionEnabledHeartbeats.length + ); }); - - const totalUsageQuantity = interceptedRequestBody.reduce( - (acc, record) => acc + record.usage.quantity, - 0 - ); - expect(totalUsageQuantity).to.be( - billableFindingsCSPM.length + - billableFindingsKSPM.length + - billableFindingsCNVM.length + - blockActionEnabledHeartbeats.length - ); }); }); } From d23dce0080f8c7815188aa244f98c526d84ee45e Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Tue, 29 Oct 2024 11:28:22 +0100 Subject: [PATCH 120/135] [Observability Onboarding] Set tech preview badges correctly (#197831) As discussed, adjust the first onboarding page: * Remove tech preview labels from EA flows * Change wording Screenshot 2024-10-25 at 15 23 47 Screenshot 2024-10-25 at 15 23 59 --- .../use_custom_cards_for_category.tsx | 15 ++++++--------- .../public/application/pages/auto_detect.tsx | 1 - .../public/application/pages/kubernetes.tsx | 1 - 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.tsx index eb359f6158030..d6a72e25a2a9d 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.tsx @@ -51,7 +51,7 @@ export function useCustomCardsForCategory( title: i18n.translate( 'xpack.observability_onboarding.useCustomCardsForCategory.autoDetectTitle', { - defaultMessage: 'Auto-detect Integrations with Elastic Agent', + defaultMessage: 'Elastic Agent: Logs & Metrics', } ), description: i18n.translate( @@ -79,7 +79,6 @@ export function useCustomCardsForCategory( version: '', integration: '', isQuickstart: true, - release: 'preview', }, { id: 'otel-logs', @@ -88,7 +87,7 @@ export function useCustomCardsForCategory( title: i18n.translate( 'xpack.observability_onboarding.useCustomCardsForCategory.logsOtelTitle', { - defaultMessage: 'Host monitoring with EDOT Collector', + defaultMessage: 'OpenTelemetry: Logs & Metrics', } ), description: i18n.translate( @@ -130,14 +129,13 @@ export function useCustomCardsForCategory( title: i18n.translate( 'xpack.observability_onboarding.useCustomCardsForCategory.kubernetesTitle', { - defaultMessage: 'Kubernetes monitoring with Elastic Agent', + defaultMessage: 'Elastic Agent: Logs & Metrics', } ), description: i18n.translate( 'xpack.observability_onboarding.useCustomCardsForCategory.kubernetesDescription', { - defaultMessage: - 'Monitor your Kubernetes cluster with Elastic Agent, collect container logs', + defaultMessage: 'Collect logs and metrics from Kubernetes using Elastic Agent', } ), extraLabelsBadges: [ @@ -156,7 +154,6 @@ export function useCustomCardsForCategory( version: '', integration: '', isQuickstart: true, - release: 'preview', }, { id: 'otel-kubernetes', @@ -165,14 +162,14 @@ export function useCustomCardsForCategory( title: i18n.translate( 'xpack.observability_onboarding.useCustomCardsForCategory.kubernetesOtelTitle', { - defaultMessage: 'Kubernetes monitoring with EDOT Collector', + defaultMessage: 'OpenTelemetry: Full Observability', } ), description: i18n.translate( 'xpack.observability_onboarding.useCustomCardsForCategory.kubernetesOtelDescription', { defaultMessage: - 'Unified Kubernetes observability with Elastic Distro for OTel Collector', + 'Collect logs, traces and metrics with the Elastic Distro for OTel Collector', } ), extraLabelsBadges: [ diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/auto_detect.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/auto_detect.tsx index 7dc3d0acb0a2e..585e1061291a5 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/auto_detect.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/auto_detect.tsx @@ -29,7 +29,6 @@ export const AutoDetectPage = () => ( 'This installation scans your host and auto-detects log and metric files.', } )} - isTechnicalPreview={true} /> } > diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/kubernetes.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/kubernetes.tsx index f92b1d9a83ac6..8e1af954736c1 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/kubernetes.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/pages/kubernetes.tsx @@ -29,7 +29,6 @@ export const KubernetesPage = () => ( 'This installation is tailored for configuring and collecting metrics and logs by deploying a new Elastic Agent within your host.', } )} - isTechnicalPreview={true} /> } > From e5eb58a533ec34e1484340f4e11a0a61083b1572 Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Tue, 29 Oct 2024 11:35:07 +0100 Subject: [PATCH 121/135] [EDR Workflows] Skip Osquery test in MKI (#198117) --- x-pack/plugins/osquery/cypress/e2e/all/ecs_mappings.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/ecs_mappings.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/ecs_mappings.cy.ts index 5330b7869e6f4..4bafc3d173156 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/ecs_mappings.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/ecs_mappings.cy.ts @@ -18,7 +18,7 @@ import { typeInOsqueryFieldInput, } from '../../tasks/live_query'; -describe('EcsMapping', { tags: ['@ess', '@serverless'] }, () => { +describe('EcsMapping', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { beforeEach(() => { initializeDataViews(); }); From db18039dc40bc0e994be666a83a28a0452a0c6e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20=C3=81brah=C3=A1m?= Date: Tue, 29 Oct 2024 11:52:36 +0100 Subject: [PATCH 122/135] [EDR Workflows] Improve on unavailable shard exception flakiness in cypress (#197864) ## Summary The cypress task `cy.task('indexEndpointHosts')` sometimes throws `no_shard_available_action_exception`, when transforms are stopped. This looks like a temporary issue, and in other tests it is simply retried. This PR adds the retry logic for this type of error, and unskips some tests. closes #194135 closes #191914 ### Checklist Delete any items that are not applicable to this PR. - [x] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed --- .../e2e/artifacts/artifacts_mocked_data.cy.ts | 3 +- .../cypress/e2e/artifacts/event_filters.cy.ts | 3 +- .../plugin_handlers/endpoint_data_loader.ts | 44 ++++++++++++------- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts index 6ab7979c46086..b5c41d1e66faf 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/artifacts_mocked_data.cy.ts @@ -35,8 +35,7 @@ const loginWithoutAccess = (url: string) => { loadPage(url); }; -// Failing: See https://github.com/elastic/kibana/issues/191914 -describe.skip('Artifacts pages', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { +describe('Artifacts pages', { tags: ['@ess', '@serverless', '@skipInServerlessMKI'] }, () => { let endpointData: ReturnTypeFromChainable | undefined; before(() => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/event_filters.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/event_filters.cy.ts index 0e3f837c9091c..af7310953e86e 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/event_filters.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/artifacts/event_filters.cy.ts @@ -41,8 +41,7 @@ describe('Event Filters', { tags: ['@ess', '@serverless', '@skipInServerlessMKI' removeAllArtifacts(); }); - // FLAKY: https://github.com/elastic/kibana/issues/194135 - describe.skip('when editing event filter value', () => { + describe('when editing event filter value', () => { let eventFiltersMock: ArtifactsFixtureType; beforeEach(() => { login(); diff --git a/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts b/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts index 76004f91ccb48..4b4e9adef0ec2 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts @@ -10,6 +10,10 @@ import type { KbnClient } from '@kbn/test'; import pRetry from 'p-retry'; import { kibanaPackageJson } from '@kbn/repo-info'; import type { ToolingLog } from '@kbn/tooling-log'; +import { + RETRYABLE_TRANSIENT_ERRORS, + retryOnError, +} from '../../../../../common/endpoint/data_loaders/utils'; import { fetchFleetLatestAvailableAgentVersion } from '../../../../../common/endpoint/utils/fetch_fleet_version'; import { dump } from '../../../../../scripts/endpoint/common/utils'; import { STARTED_TRANSFORM_STATES } from '../../../../../common/constants'; @@ -158,18 +162,17 @@ const stopTransform = async ( ): Promise => { log.debug(`Stopping transform id: ${transformId}`); - await esClient.transform - .stopTransform({ - transform_id: `${transformId}*`, - force: true, - wait_for_completion: true, - allow_no_match: true, - }) - .catch((e) => { - Error.captureStackTrace(e); - log.verbose(dump(e, 8)); - throw e; - }); + await retryOnError( + () => + esClient.transform.stopTransform({ + transform_id: `${transformId}*`, + force: true, + wait_for_completion: true, + allow_no_match: true, + }), + RETRYABLE_TRANSIENT_ERRORS, + log + ); }; const startTransform = async ( @@ -177,9 +180,14 @@ const startTransform = async ( log: ToolingLog, transformId: string ): Promise => { - const transformsResponse = await esClient.transform.getTransformStats({ - transform_id: `${transformId}*`, - }); + const transformsResponse = await retryOnError( + () => + esClient.transform.getTransformStats({ + transform_id: `${transformId}*`, + }), + RETRYABLE_TRANSIENT_ERRORS, + log + ); log.verbose( `Transform status found for [${transformId}*] returned:\n${dump(transformsResponse)}` @@ -193,7 +201,11 @@ const startTransform = async ( log.debug(`Staring transform id: [${transform.id}]`); - return esClient.transform.startTransform({ transform_id: transform.id }); + return retryOnError( + () => esClient.transform.startTransform({ transform_id: transform.id }), + RETRYABLE_TRANSIENT_ERRORS, + log + ); }) ); }; From b4ed7a1945f5ea5b76be36833cdf11e28641cf8f Mon Sep 17 00:00:00 2001 From: Maxim Kholod Date: Tue, 29 Oct 2024 11:53:23 +0100 Subject: [PATCH 123/135] [Cloud Security] add vulnerabilties data set to filter for links from CNVM dashboard (#197648) ## Summary - fixes https://github.com/elastic/security-team/issues/10915 --- .../public/src/hooks/use_navigate_findings.ts | 14 ++++++++++++++ .../vulnerability_statistics.tsx | 4 ++-- .../vulnerability_table_panel_section.tsx | 4 ++-- .../vulnerability_trend_graph.tsx | 4 ++-- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts b/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts index 5028b53b90ec9..00610d6b64b4e 100644 --- a/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts +++ b/x-pack/packages/kbn-cloud-security-posture/public/src/hooks/use_navigate_findings.ts @@ -39,3 +39,17 @@ export const useNavigateFindings = () => { export const useNavigateVulnerabilities = () => useNavigate(findingsNavigation.vulnerabilities.path); + +export const useNavigateNativeVulnerabilities = () => { + const navToVulnerabilities = useNavigateVulnerabilities(); + + return useCallback( + (filterParams: NavFilter = {}, groupBy?: string[]) => { + navToVulnerabilities( + { ...filterParams, 'data_stream.dataset': 'cloud_security_posture.vulnerabilities' }, + groupBy + ); + }, + [navToVulnerabilities] + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_statistics.tsx b/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_statistics.tsx index 114f28ccfc271..de1f7ec3ba37a 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_statistics.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_statistics.tsx @@ -7,7 +7,7 @@ import React, { useMemo } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiHealth } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { useNavigateVulnerabilities } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; +import { useNavigateNativeVulnerabilities } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; import { VULNERABILITIES_SEVERITY } from '@kbn/cloud-security-posture-common'; import { getSeverityStatusColor } from '@kbn/cloud-security-posture'; import { VulnCounterCard, type VulnCounterCardProps } from '../../components/vuln_counter_card'; @@ -15,7 +15,7 @@ import { useVulnerabilityDashboardApi } from '../../common/api/use_vulnerability import { CompactFormattedNumber } from '../../components/compact_formatted_number'; export const VulnerabilityStatistics = () => { - const navToVulnerabilities = useNavigateVulnerabilities(); + const navToVulnerabilities = useNavigateNativeVulnerabilities(); const getVulnerabilityDashboard = useVulnerabilityDashboardApi(); const stats: VulnCounterCardProps[] = useMemo( diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel_section.tsx b/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel_section.tsx index a4e3dd38b28a1..c3a5f21867723 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel_section.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_table_panel_section.tsx @@ -17,7 +17,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import type { NavFilter } from '@kbn/cloud-security-posture/src/utils/query_utils'; -import { useNavigateVulnerabilities } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; +import { useNavigateNativeVulnerabilities } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; import type { VulnSeverity } from '@kbn/cloud-security-posture-common'; import { CVSScoreBadge, SeverityStatusBadge } from '@kbn/cloud-security-posture'; import { @@ -33,7 +33,7 @@ import { VULNERABILITY_GROUPING_OPTIONS, VULNERABILITY_FIELDS } from '../../comm export const VulnerabilityTablePanelSection = () => { const getVulnerabilityDashboard = useVulnerabilityDashboardApi(); const { euiTheme } = useEuiTheme(); - const navToVulnerabilities = useNavigateVulnerabilities(); + const navToVulnerabilities = useNavigateNativeVulnerabilities(); const onCellClick = useCallback( (filters: NavFilter) => { diff --git a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_trend_graph.tsx b/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_trend_graph.tsx index ff610b640cd3f..599928eea88b8 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_trend_graph.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/vulnerability_dashboard/vulnerability_trend_graph.tsx @@ -19,7 +19,7 @@ import { EuiButton, EuiComboBox } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useNavigateVulnerabilities } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; +import { useNavigateNativeVulnerabilities } from '@kbn/cloud-security-posture/src/hooks/use_navigate_findings'; import type { VulnSeverity } from '@kbn/cloud-security-posture-common'; import { VULNERABILITIES_SEVERITY } from '@kbn/cloud-security-posture-common'; import { getSeverityStatusColor } from '@kbn/cloud-security-posture'; @@ -50,7 +50,7 @@ const theme: PartialTheme = { }; const ViewAllButton = () => { - const navToVulnerabilities = useNavigateVulnerabilities(); + const navToVulnerabilities = useNavigateNativeVulnerabilities(); return ( navToVulnerabilities()} size="s"> From 67d96e3585b690662750173898ce579c52a89522 Mon Sep 17 00:00:00 2001 From: Tiago Vila Verde Date: Tue, 29 Oct 2024 12:13:14 +0100 Subject: [PATCH 124/135] [Entity Analytics] [Entity Store] Telemetry (#196880) ## Summary This PR adds telemetry for the Entity Store. Client side tracks UI enablement actions, whilst Kibana side tracks execution time of the store initialisation process and execution time of the enrich policy task. Finally we also track number of entities in the store --- .../public/common/lib/telemetry/constants.ts | 2 + .../events/entity_analytics/index.ts | 33 +++++++++ .../events/entity_analytics/types.ts | 21 +++++- .../lib/telemetry/events/telemetry_events.ts | 4 ++ .../lib/telemetry/telemetry_client.mock.ts | 2 + .../common/lib/telemetry/telemetry_client.ts | 10 +++ .../public/common/lib/telemetry/types.ts | 17 ++--- .../entity_store/hooks/use_entity_store.ts | 25 ++++++- .../entity_store/entity_store_data_client.ts | 18 +++++ .../task/field_retention_enrichment_task.ts | 53 ++++++++++++++- .../lib/telemetry/event_based/events.ts | 67 +++++++++++++++++++ .../security_solution/server/plugin.ts | 1 + .../server/request_context_factory.ts | 1 + 13 files changed, 237 insertions(+), 17 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/constants.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/constants.ts index cb247891d79b3..5d0e9bcfd918a 100644 --- a/x-pack/plugins/security_solution/public/common/lib/telemetry/constants.ts +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/constants.ts @@ -68,6 +68,8 @@ export enum TelemetryEventTypes { EntityDetailsClicked = 'Entity Details Clicked', EntityAlertsClicked = 'Entity Alerts Clicked', EntityRiskFiltered = 'Entity Risk Filtered', + EntityStoreEnablementToggleClicked = 'Entity Store Enablement Toggle Clicked', + EntityStoreDashboardInitButtonClicked = 'Entity Store Initialization Button Clicked', MLJobUpdate = 'ML Job Update', AddRiskInputToTimelineClicked = 'Add Risk Input To Timeline Clicked', ToggleRiskSummaryClicked = 'Toggle Risk Summary Clicked', diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/events/entity_analytics/index.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/events/entity_analytics/index.ts index aedbc7eb01fae..5a45970de6af1 100644 --- a/x-pack/plugins/security_solution/public/common/lib/telemetry/events/entity_analytics/index.ts +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/events/entity_analytics/index.ts @@ -214,3 +214,36 @@ export const assetCriticalityCsvImportedEvent: TelemetryEvent = { }, }, }; + +export const entityStoreInitEvent: TelemetryEvent = { + eventType: TelemetryEventTypes.EntityStoreDashboardInitButtonClicked, + schema: { + timestamp: { + type: 'date', + _meta: { + description: 'Timestamp of the event', + optional: false, + }, + }, + }, +}; + +export const entityStoreEnablementEvent: TelemetryEvent = { + eventType: TelemetryEventTypes.EntityStoreEnablementToggleClicked, + schema: { + timestamp: { + type: 'date', + _meta: { + description: 'Timestamp of the event', + optional: false, + }, + }, + action: { + type: 'keyword', + _meta: { + description: 'Event toggle action', + optional: false, + }, + }, + }, +}; diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/events/entity_analytics/types.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/events/entity_analytics/types.ts index 91a71a7dacca2..3313e99a31184 100644 --- a/x-pack/plugins/security_solution/public/common/lib/telemetry/events/entity_analytics/types.ts +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/events/entity_analytics/types.ts @@ -59,6 +59,15 @@ export interface ReportAssetCriticalityCsvImportedParams { }; } +export interface ReportEntityStoreEnablementParams { + timestamp: string; + action: 'start' | 'stop'; +} + +export interface ReportEntityStoreInitParams { + timestamp: string; +} + export type ReportEntityAnalyticsTelemetryEventParams = | ReportEntityDetailsClickedParams | ReportEntityAlertsClickedParams @@ -68,7 +77,9 @@ export type ReportEntityAnalyticsTelemetryEventParams = | ReportAddRiskInputToTimelineClickedParams | ReportAssetCriticalityCsvPreviewGeneratedParams | ReportAssetCriticalityFileSelectedParams - | ReportAssetCriticalityCsvImportedParams; + | ReportAssetCriticalityCsvImportedParams + | ReportEntityStoreEnablementParams + | ReportEntityStoreInitParams; export type EntityAnalyticsTelemetryEvent = | { @@ -106,4 +117,12 @@ export type EntityAnalyticsTelemetryEvent = | { eventType: TelemetryEventTypes.AssetCriticalityCsvImported; schema: RootSchema; + } + | { + eventType: TelemetryEventTypes.EntityStoreEnablementToggleClicked; + schema: RootSchema; + } + | { + eventType: TelemetryEventTypes.EntityStoreDashboardInitButtonClicked; + schema: RootSchema; }; diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/events/telemetry_events.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/events/telemetry_events.ts index a0328099b9ff7..3e7c9f1138391 100644 --- a/x-pack/plugins/security_solution/public/common/lib/telemetry/events/telemetry_events.ts +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/events/telemetry_events.ts @@ -21,6 +21,8 @@ import { assetCriticalityCsvPreviewGeneratedEvent, assetCriticalityFileSelectedEvent, assetCriticalityCsvImportedEvent, + entityStoreEnablementEvent, + entityStoreInitEvent, } from './entity_analytics'; import { assistantInvokedEvent, @@ -172,6 +174,8 @@ export const telemetryEvents = [ assetCriticalityCsvPreviewGeneratedEvent, assetCriticalityFileSelectedEvent, assetCriticalityCsvImportedEvent, + entityStoreEnablementEvent, + entityStoreInitEvent, toggleRiskSummaryClickedEvent, RiskInputsExpandedFlyoutOpenedEvent, addRiskInputToTimelineClickedEvent, diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.mock.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.mock.ts index 98d6aa64bb9cb..87d4b215543dc 100644 --- a/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.mock.ts +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.mock.ts @@ -43,4 +43,6 @@ export const createTelemetryClientMock = (): jest.Mocked = reportOpenNoteInExpandableFlyoutClicked: jest.fn(), reportAddNoteFromExpandableFlyoutClicked: jest.fn(), reportPreviewRule: jest.fn(), + reportEntityStoreEnablement: jest.fn(), + reportEntityStoreInit: jest.fn(), }); diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts index e09f0a3c2eb66..689209f284dbb 100644 --- a/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/telemetry_client.ts @@ -45,6 +45,8 @@ import type { ReportEventLogShowSourceEventDateRangeParams, ReportEventLogFilterByRunTypeParams, PreviewRuleParams, + ReportEntityStoreEnablementParams, + ReportEntityStoreInitParams, } from './types'; import { TelemetryEventTypes } from './constants'; @@ -216,4 +218,12 @@ export class TelemetryClient implements TelemetryClientStart { public reportPreviewRule = (params: PreviewRuleParams) => { this.analytics.reportEvent(TelemetryEventTypes.PreviewRule, params); }; + + public reportEntityStoreEnablement = (params: ReportEntityStoreEnablementParams) => { + this.analytics.reportEvent(TelemetryEventTypes.EntityStoreEnablementToggleClicked, params); + }; + + public reportEntityStoreInit = (params: ReportEntityStoreInitParams) => { + this.analytics.reportEvent(TelemetryEventTypes.EntityStoreDashboardInitButtonClicked, params); + }; } diff --git a/x-pack/plugins/security_solution/public/common/lib/telemetry/types.ts b/x-pack/plugins/security_solution/public/common/lib/telemetry/types.ts index 55b91837a2585..95896bf74a6a7 100644 --- a/x-pack/plugins/security_solution/public/common/lib/telemetry/types.ts +++ b/x-pack/plugins/security_solution/public/common/lib/telemetry/types.ts @@ -32,6 +32,8 @@ import type { ReportAssetCriticalityCsvPreviewGeneratedParams, ReportAssetCriticalityFileSelectedParams, ReportAssetCriticalityCsvImportedParams, + ReportEntityStoreEnablementParams, + ReportEntityStoreInitParams, } from './events/entity_analytics/types'; import type { AssistantTelemetryEvent, @@ -78,17 +80,7 @@ export * from './events/ai_assistant/types'; export * from './events/alerts_grouping/types'; export * from './events/data_quality/types'; export * from './events/onboarding/types'; -export type { - ReportEntityAlertsClickedParams, - ReportEntityDetailsClickedParams, - ReportEntityRiskFilteredParams, - ReportRiskInputsExpandedFlyoutOpenedParams, - ReportToggleRiskSummaryClickedParams, - ReportAddRiskInputToTimelineClickedParams, - ReportAssetCriticalityCsvPreviewGeneratedParams, - ReportAssetCriticalityFileSelectedParams, - ReportAssetCriticalityCsvImportedParams, -} from './events/entity_analytics/types'; +export * from './events/entity_analytics/types'; export * from './events/document_details/types'; export * from './events/manual_rule_run/types'; export * from './events/event_log/types'; @@ -168,6 +160,9 @@ export interface TelemetryClientStart { ): void; reportAssetCriticalityCsvImported(params: ReportAssetCriticalityCsvImportedParams): void; reportCellActionClicked(params: ReportCellActionClickedParams): void; + // Entity Analytics Entity Store + reportEntityStoreEnablement(params: ReportEntityStoreEnablementParams): void; + reportEntityStoreInit(params: ReportEntityStoreInitParams): void; reportAnomaliesCountClicked(params: ReportAnomaliesCountClickedParams): void; reportDataQualityIndexChecked(params: ReportDataQualityIndexCheckedParams): void; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entity_store.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entity_store.ts index 0ac684555fd0d..2d9fa716faf1c 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entity_store.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_store/hooks/use_entity_store.ts @@ -9,6 +9,7 @@ import type { UseMutationOptions } from '@tanstack/react-query'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useCallback, useState } from 'react'; +import { useKibana } from '../../../../common/lib/kibana/kibana_react'; import type { DeleteEntityEngineResponse, InitEntityEngineResponse, @@ -21,6 +22,7 @@ const ENTITY_STORE_ENABLEMENT_INIT = 'ENTITY_STORE_ENABLEMENT_INIT'; export const useEntityStoreEnablement = () => { const [polling, setPolling] = useState(false); + const { telemetry } = useKibana().services; useEntityEngineStatus({ disabled: !polling, @@ -46,8 +48,11 @@ export const useEntityStoreEnablement = () => { }); const enable = useCallback(() => { + telemetry?.reportEntityStoreInit({ + timestamp: new Date().toISOString(), + }); initialize().then(() => setPolling(true)); - }, [initialize]); + }, [initialize, telemetry]); return { enable }; }; @@ -65,10 +70,17 @@ export const useInvalidateEntityEngineStatusQuery = () => { }; export const useInitEntityEngineMutation = (options?: UseMutationOptions<{}>) => { + const { telemetry } = useKibana().services; const invalidateEntityEngineStatusQuery = useInvalidateEntityEngineStatusQuery(); const { initEntityStore } = useEntityStoreRoutes(); return useMutation( - () => Promise.all([initEntityStore('user'), initEntityStore('host')]), + () => { + telemetry?.reportEntityStoreEnablement({ + timestamp: new Date().toISOString(), + action: 'start', + }); + return Promise.all([initEntityStore('user'), initEntityStore('host')]); + }, { ...options, mutationKey: INIT_ENTITY_ENGINE_STATUS_KEY, @@ -86,10 +98,17 @@ export const useInitEntityEngineMutation = (options?: UseMutationOptions<{}>) => export const STOP_ENTITY_ENGINE_STATUS_KEY = ['POST', 'STOP_ENTITY_ENGINE']; export const useStopEntityEngineMutation = (options?: UseMutationOptions<{}>) => { + const { telemetry } = useKibana().services; const invalidateEntityEngineStatusQuery = useInvalidateEntityEngineStatusQuery(); const { stopEntityStore } = useEntityStoreRoutes(); return useMutation( - () => Promise.all([stopEntityStore('user'), stopEntityStore('host')]), + () => { + telemetry?.reportEntityStoreEnablement({ + timestamp: new Date().toISOString(), + action: 'stop', + }); + return Promise.all([stopEntityStore('user'), stopEntityStore('host')]); + }, { ...options, mutationKey: STOP_ENTITY_ENGINE_STATUS_KEY, diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts index 429d77482841e..6b1d52661fa2c 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/entity_store_data_client.ts @@ -11,12 +11,14 @@ import type { SavedObjectsClientContract, AuditLogger, IScopedClusterClient, + AnalyticsServiceSetup, } from '@kbn/core/server'; import { EntityClient } from '@kbn/entityManager-plugin/server/lib/entity_client'; import type { SortOrder } from '@elastic/elasticsearch/lib/api/types'; import type { TaskManagerStartContract } from '@kbn/task-manager-plugin/server'; import type { DataViewsService } from '@kbn/data-views-plugin/common'; import { isEqual } from 'lodash/fp'; +import moment from 'moment'; import type { AppClient } from '../../..'; import type { Entity, @@ -53,6 +55,10 @@ import { isPromiseFulfilled, isPromiseRejected, } from './utils'; +import { + ENTITY_ENGINE_INITIALIZATION_EVENT, + ENTITY_ENGINE_RESOURCE_INIT_FAILURE_EVENT, +} from '../../telemetry/event_based/events'; import type { EntityRecord } from './types'; import { CRITICALITY_VALUES } from '../asset_criticality/constants'; @@ -66,6 +72,7 @@ interface EntityStoreClientOpts { kibanaVersion: string; dataViewsService: DataViewsService; appClient: AppClient; + telemetry?: AnalyticsServiceSetup; } interface SearchEntitiesParams { @@ -170,6 +177,7 @@ export class EntityStoreDataClient { filter: string, pipelineDebugMode: boolean ) { + const setupStartTime = moment().utc().toISOString(); const { logger, namespace, appClient, dataViewsService } = this.options; const indexPatterns = await buildIndexPatterns(namespace, appClient, dataViewsService); @@ -249,12 +257,22 @@ export class EntityStoreDataClient { }); logger.info(`Entity store initialized for ${entityType}`); + const setupEndTime = moment().utc().toISOString(); + const duration = moment(setupEndTime).diff(moment(setupStartTime), 'seconds'); + this.options.telemetry?.reportEvent(ENTITY_ENGINE_INITIALIZATION_EVENT.eventType, { + duration, + }); + return updated; } catch (err) { this.options.logger.error( `Error initializing entity store for ${entityType}: ${err.message}` ); + this.options.telemetry?.reportEvent(ENTITY_ENGINE_RESOURCE_INIT_FAILURE_EVENT.eventType, { + error: err.message, + }); + await this.engineClient.update(entityType, ENGINE_STATUS.ERROR); await this.delete(entityType, taskManager, { deleteData: true, deleteEngine: false }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/task/field_retention_enrichment_task.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/task/field_retention_enrichment_task.ts index d008c3afe6f17..5227473e0e51b 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/task/field_retention_enrichment_task.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/entity_store/task/field_retention_enrichment_task.ts @@ -6,6 +6,7 @@ */ import moment from 'moment'; +import type { AnalyticsServiceSetup } from '@kbn/core/server'; import { type Logger, SavedObjectsErrorHelpers } from '@kbn/core/server'; import type { ConcreteTaskInstance, @@ -26,6 +27,12 @@ import { } from '../united_entity_definitions'; import { executeFieldRetentionEnrichPolicy } from '../elasticsearch_assets'; +import { getEntitiesIndexName } from '../utils'; +import { + FIELD_RETENTION_ENRICH_POLICY_EXECUTION_EVENT, + ENTITY_STORE_USAGE_EVENT, +} from '../../../telemetry/event_based/events'; + const logFactory = (logger: Logger, taskId: string) => (message: string): void => @@ -44,14 +51,17 @@ type ExecuteEnrichPolicy = ( namespace: string, entityType: EntityType ) => ReturnType; +type GetStoreSize = (index: string | string[]) => Promise; export const registerEntityStoreFieldRetentionEnrichTask = ({ getStartServices, logger, + telemetry, taskManager, }: { getStartServices: EntityAnalyticsRoutesDeps['getStartServices']; logger: Logger; + telemetry: AnalyticsServiceSetup; taskManager: TaskManagerSetupContract | undefined; }): void => { if (!taskManager) { @@ -75,6 +85,14 @@ export const registerEntityStoreFieldRetentionEnrichTask = ({ }); }; + const getStoreSize: GetStoreSize = async (index) => { + const [coreStart] = await getStartServices(); + const esClient = coreStart.elasticsearch.client.asInternalUser; + + const { count } = await esClient.count({ index }); + return count; + }; + taskManager.registerTaskDefinitions({ [getTaskName()]: { title: 'Entity Analytics Entity Store - Execute Enrich Policy Task', @@ -82,6 +100,8 @@ export const registerEntityStoreFieldRetentionEnrichTask = ({ stateSchemaByVersion, createTaskRunner: createTaskRunnerFactory({ logger, + telemetry, + getStoreSize, executeEnrichPolicy, }), }, @@ -140,14 +160,18 @@ export const removeEntityStoreFieldRetentionEnrichTask = async ({ export const runTask = async ({ executeEnrichPolicy, + getStoreSize, isCancelled, logger, taskInstance, + telemetry, }: { logger: Logger; isCancelled: () => boolean; executeEnrichPolicy: ExecuteEnrichPolicy; + getStoreSize: GetStoreSize; taskInstance: ConcreteTaskInstance; + telemetry: AnalyticsServiceSetup; }): Promise<{ state: EntityStoreFieldRetentionTaskState; }> => { @@ -171,13 +195,14 @@ export const runTask = async ({ } const entityTypes = getAvailableEntityTypes(); + for (const entityType of entityTypes) { const start = Date.now(); debugLog(`executing field retention enrich policy for ${entityType}`); try { const { executed } = await executeEnrichPolicy(state.namespace, entityType); if (!executed) { - debugLog(`Field retention encrich policy for ${entityType} does not exist`); + debugLog(`Field retention enrich policy for ${entityType} does not exist`); } else { log( `Executed field retention enrich policy for ${entityType} in ${Date.now() - start}ms` @@ -192,6 +217,18 @@ export const runTask = async ({ const taskDurationInSeconds = moment(taskCompletionTime).diff(moment(taskStartTime), 'seconds'); log(`task run completed in ${taskDurationInSeconds} seconds`); + telemetry.reportEvent(FIELD_RETENTION_ENRICH_POLICY_EXECUTION_EVENT.eventType, { + duration: taskDurationInSeconds, + interval: INTERVAL, + }); + + // Track entity store usage + const indices = entityTypes.map((entityType) => + getEntitiesIndexName(entityType, state.namespace) + ); + const storeSize = await getStoreSize(indices); + telemetry.reportEvent(ENTITY_STORE_USAGE_EVENT.eventType, { storeSize }); + return { state: updatedState, }; @@ -202,7 +239,17 @@ export const runTask = async ({ }; const createTaskRunnerFactory = - ({ logger, executeEnrichPolicy }: { logger: Logger; executeEnrichPolicy: ExecuteEnrichPolicy }) => + ({ + logger, + telemetry, + executeEnrichPolicy, + getStoreSize, + }: { + logger: Logger; + telemetry: AnalyticsServiceSetup; + executeEnrichPolicy: ExecuteEnrichPolicy; + getStoreSize: GetStoreSize; + }) => ({ taskInstance }: { taskInstance: ConcreteTaskInstance }) => { let cancelled = false; const isCancelled = () => cancelled; @@ -210,9 +257,11 @@ const createTaskRunnerFactory = run: async () => runTask({ executeEnrichPolicy, + getStoreSize, isCancelled, logger, taskInstance, + telemetry, }), cancel: async () => { cancelled = true; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/event_based/events.ts b/x-pack/plugins/security_solution/server/lib/telemetry/event_based/events.ts index b8a2df85f10ad..02a39be555110 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/event_based/events.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/event_based/events.ts @@ -128,6 +128,69 @@ export const ASSET_CRITICALITY_SYSTEM_PROCESSED_ASSIGNMENT_FILE_EVENT: EventType }, }; +export const FIELD_RETENTION_ENRICH_POLICY_EXECUTION_EVENT: EventTypeOpts<{ + duration: number; + interval: string; +}> = { + eventType: 'field_retention_enrich_policy_execution', + schema: { + duration: { + type: 'long', + _meta: { + description: 'Duration (in seconds) of the field retention enrich policy execution time', + }, + }, + interval: { + type: 'keyword', + _meta: { + description: 'Configured interval for the field retention enrich policy task', + }, + }, + }, +}; + +export const ENTITY_ENGINE_RESOURCE_INIT_FAILURE_EVENT: EventTypeOpts<{ + error: string; +}> = { + eventType: 'entity_engine_resource_init_failure', + schema: { + error: { + type: 'keyword', + _meta: { + description: 'Error message for a resource initialization failure', + }, + }, + }, +}; + +export const ENTITY_ENGINE_INITIALIZATION_EVENT: EventTypeOpts<{ + duration: number; +}> = { + eventType: 'entity_engine_initialization', + schema: { + duration: { + type: 'long', + _meta: { + description: 'Duration (in seconds) of the entity engine initialization', + }, + }, + }, +}; + +export const ENTITY_STORE_USAGE_EVENT: EventTypeOpts<{ + storeSize: number; +}> = { + eventType: 'entity_store_usage', + schema: { + storeSize: { + type: 'long', + _meta: { + description: 'Number of entities stored in the entity store', + }, + }, + }, +}; + export const ALERT_SUPPRESSION_EVENT: EventTypeOpts<{ suppressionAlertsCreated: number; suppressionAlertsSuppressed: number; @@ -390,4 +453,8 @@ export const events = [ ENDPOINT_RESPONSE_ACTION_SENT_EVENT, ENDPOINT_RESPONSE_ACTION_SENT_ERROR_EVENT, ENDPOINT_RESPONSE_ACTION_STATUS_CHANGE_EVENT, + FIELD_RETENTION_ENRICH_POLICY_EXECUTION_EVENT, + ENTITY_ENGINE_RESOURCE_INIT_FAILURE_EVENT, + ENTITY_ENGINE_INITIALIZATION_EVENT, + ENTITY_STORE_USAGE_EVENT, ]; diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 794c37cd38b40..428db0309346d 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -232,6 +232,7 @@ export class Plugin implements ISecuritySolutionPlugin { registerEntityStoreFieldRetentionEnrichTask({ getStartServices: core.getStartServices, logger: this.logger, + telemetry: core.analytics, taskManager: plugins.taskManager, }); } 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 8e3af9b9bce8a..e57141b3a5ae7 100644 --- a/x-pack/plugins/security_solution/server/request_context_factory.ts +++ b/x-pack/plugins/security_solution/server/request_context_factory.ts @@ -225,6 +225,7 @@ export class RequestContextFactory implements IRequestContextFactory { taskManager: startPlugins.taskManager, auditLogger: getAuditLogger(), kibanaVersion: options.kibanaVersion, + telemetry: core.analytics, }); }), }; From 5983137ace057758fc3433b4297514f63f6db255 Mon Sep 17 00:00:00 2001 From: "elastic-renovate-prod[bot]" <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 06:25:14 -0500 Subject: [PATCH 125/135] Update docker.elastic.co/wolfi/chainguard-base:latest Docker digest to 1815394 (main) (#198099) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Update | Change | |---|---|---| | docker.elastic.co/wolfi/chainguard-base | digest | `de4d5b0` -> `1815394` | --- ### 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 [Renovate Bot](https://togithub.com/renovatebot/renovate). Co-authored-by: elastic-renovate-prod[bot] <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> --- src/dev/build/tasks/os_packages/docker_generator/run.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dev/build/tasks/os_packages/docker_generator/run.ts b/src/dev/build/tasks/os_packages/docker_generator/run.ts index d764978c9db92..a3925b3a04f24 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/run.ts +++ b/src/dev/build/tasks/os_packages/docker_generator/run.ts @@ -51,7 +51,7 @@ export async function runDockerGenerator( */ if (flags.baseImage === 'wolfi') baseImageName = - 'docker.elastic.co/wolfi/chainguard-base:latest@sha256:de4d5b06ee2074eb716f29e72b170346fd4715e5f083fc83a378603ce5bd9ced'; + 'docker.elastic.co/wolfi/chainguard-base:latest@sha256:18153942f0d6e97bc6131cd557c7ed3be6e892846a5df0760896eb8d15b1b236'; let imageFlavor = ''; if (flags.baseImage === 'ubi') imageFlavor += `-ubi`; From 88ebb55fc775d6bb04dc3b21f04a6be1ba1a09dc Mon Sep 17 00:00:00 2001 From: "elastic-renovate-prod[bot]" <174716857+elastic-renovate-prod[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2024 06:36:48 -0500 Subject: [PATCH 126/135] Update dependency @launchdarkly/node-server-sdk to ^9.6.1 (main) (#196897) --- package.json | 2 +- packages/kbn-test/src/jest/resolver.js | 7 +++++++ yarn.lock | 28 +++++++++++++------------- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 09e19ab86b1ca..271a5eea7e9ba 100644 --- a/package.json +++ b/package.json @@ -1017,7 +1017,7 @@ "@langchain/langgraph": "0.0.34", "@langchain/openai": "^0.1.3", "@langtrase/trace-attributes": "^3.0.8", - "@launchdarkly/node-server-sdk": "^9.6.0", + "@launchdarkly/node-server-sdk": "^9.6.1", "@launchdarkly/openfeature-node-server": "^1.0.0", "@loaders.gl/core": "^3.4.7", "@loaders.gl/json": "^3.4.7", diff --git a/packages/kbn-test/src/jest/resolver.js b/packages/kbn-test/src/jest/resolver.js index 8f985e9463962..aab1b0f597284 100644 --- a/packages/kbn-test/src/jest/resolver.js +++ b/packages/kbn-test/src/jest/resolver.js @@ -51,6 +51,13 @@ module.exports = (request, options) => { }); } + if (request === '@launchdarkly/js-sdk-common') { + return resolve.sync('@launchdarkly/js-sdk-common/dist/cjs/index.cjs', { + basedir: options.basedir, + extensions: options.extensions, + }); + } + if (request === `elastic-apm-node`) { return APM_AGENT_MOCK; } diff --git a/yarn.lock b/yarn.lock index ce86d0b1e6d77..098c6a1fa9030 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7412,25 +7412,25 @@ dependencies: ncp "^2.0.0" -"@launchdarkly/js-sdk-common@2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@launchdarkly/js-sdk-common/-/js-sdk-common-2.9.0.tgz#2828eb12e48c28edaa849821ed9b7824e2ce01b9" - integrity sha512-BYYZ4MgYCc2l650gFotqRMW5oqFJna78+ivf/8Jwy6D3XpRW/DHwrsMBFnVv/G3gAjXq6/dW3ZZ6pS85ZK6mvQ== +"@launchdarkly/js-sdk-common@2.11.0": + version "2.11.0" + resolved "https://registry.yarnpkg.com/@launchdarkly/js-sdk-common/-/js-sdk-common-2.11.0.tgz#efc0c94ee4b11d72910c5bcdf9294154a27dbb1c" + integrity sha512-96Jg4QH347w2+rL4Bpykqw28+HHUAW4HapjIkIfM3giELK7BwXUp3BiAVxo2ax78e7A7KqvMzPJUx5r2EGpkMw== -"@launchdarkly/js-server-sdk-common@2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@launchdarkly/js-server-sdk-common/-/js-server-sdk-common-2.7.0.tgz#c53fb284af6875b991b6c3935612068719ba9839" - integrity sha512-EFfCVtp5VVl4E2sY6rUa2n0tvAiqstFAloJNN4ft5Tocec+6Te3XKivNdRpMxIrQBZg9c5gX9ofa6B0j0l33RA== +"@launchdarkly/js-server-sdk-common@2.9.0": + version "2.9.0" + resolved "https://registry.yarnpkg.com/@launchdarkly/js-server-sdk-common/-/js-server-sdk-common-2.9.0.tgz#337d13d4bec596f6244b9723f7ec718ee087bfa5" + integrity sha512-hf/qkn+NvCkyoLl6fl+4Q737p4Jg3T+RnRqdkJDMxO+8aAI+vpXuD9bbhkgYA9XFHyQ9puhufRGzX1BX26b7Rg== dependencies: - "@launchdarkly/js-sdk-common" "2.9.0" + "@launchdarkly/js-sdk-common" "2.11.0" semver "7.5.4" -"@launchdarkly/node-server-sdk@^9.6.0": - version "9.6.0" - resolved "https://registry.yarnpkg.com/@launchdarkly/node-server-sdk/-/node-server-sdk-9.6.0.tgz#eafdf6cb7d7f3239778d89d78ad7e5b6f7f5f08a" - integrity sha512-vYn+ATN7/QIbBfmsNmeFSfV/8XiwQSPAr31wrTEAr26WvWIpy4HUNHKAtbgRdtFg3fo+7bSuI0FLvFsNVmavcg== +"@launchdarkly/node-server-sdk@^9.6.1": + version "9.7.0" + resolved "https://registry.yarnpkg.com/@launchdarkly/node-server-sdk/-/node-server-sdk-9.7.0.tgz#87223c2d3ab5fc7186065a0974960c94f73573ad" + integrity sha512-ABOsjcjH9pFdyG1m5++lhP+ngxfx4GMcIfgTp0iSPncuh0dMxCCWSx831gbhxR9M+f2x4EnsQ9HEdwnmwktb9g== dependencies: - "@launchdarkly/js-server-sdk-common" "2.7.0" + "@launchdarkly/js-server-sdk-common" "2.9.0" https-proxy-agent "^5.0.1" launchdarkly-eventsource "2.0.3" From 669dc381bfc671637d4763930c8b4ede7ad7fbf3 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Tue, 29 Oct 2024 09:41:57 -0600 Subject: [PATCH 127/135] [ML] Data Frame Analytics: removing scss overrides for exploration pages (#197724) ## Summary Related meta issue: https://github.com/elastic/kibana/issues/140695 Regression model evaluation before: image After: image Classification evaluation before: image After switching fully to flex layout as we no longer support IE11 and all the workarounds were no longer needed (Note it's all left aligned now): image ### 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) --------- Co-authored-by: Elastic Machine --- .../data_frame_analytics/_index.scss | 4 +- .../_classification_exploration.scss | 47 --- .../classification_exploration.tsx | 26 +- .../evaluate_panel.tsx | 382 ++++++++++-------- .../evaluate_stat.tsx | 43 +- .../data_view_prompt/data_view_prompt.tsx | 58 +-- .../expandable_section.scss | 13 - .../expandable_section/expandable_section.tsx | 116 +++--- .../expandable_section_results.tsx | 10 +- .../expandable_section_splom.tsx | 10 +- .../regression_exploration/_index.scss | 1 - .../_regression_exploration.scss | 3 - .../regression_exploration/evaluate_stat.tsx | 43 +- .../expanded_row_details_pane.scss | 8 - .../expanded_row_details_pane.tsx | 25 +- .../create_analytics_button/_index.scss | 4 - .../timeseries_chart/timeseries_chart.js | 2 - 17 files changed, 381 insertions(+), 414 deletions(-) delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/_classification_exploration.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/_index.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/_regression_exploration.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.scss delete mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_button/_index.scss diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss index a043a691c9ef6..9b97275417d50 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss @@ -1,5 +1,3 @@ -@import 'pages/analytics_exploration/components/regression_exploration/index'; @import 'pages/job_map/components/index'; @import 'pages/analytics_management/components/analytics_list/index'; -@import 'pages/analytics_management/components/create_analytics_button/index'; -@import 'pages/analytics_creation/components/index'; +@import 'pages/analytics_creation/components/index'; \ No newline at end of file diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/_classification_exploration.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/_classification_exploration.scss deleted file mode 100644 index c429daaf3c8dc..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/_classification_exploration.scss +++ /dev/null @@ -1,47 +0,0 @@ -/* Fixed width so we can align it with the padding of the AUC ROC chart. */ -$labelColumnWidth: 80px; - -/* - Workaround for EuiDataGrid within a Flex Layout, - this tricks browsers treating the width as a px value instead of % -*/ -.mlDataFrameAnalyticsClassification { - width: 100%; -} - -.mlDataFrameAnalyticsClassification__evaluateSectionContent { - padding: 0 5%; -} - -/* - The following two classes are a workaround to avoid having EuiDataGrid in a flex layout - and just uses a legacy approach for a two column layout so we don't break IE11. -*/ -.mlDataFrameAnalyticsClassification__evaluateSectionContent:after { - content: ''; - display: table; - clear: both; -} - -.mlDataFrameAnalyticsClassification__actualLabel { - float: left; - width: $labelColumnWidth; - padding-top: $euiSize * 4; -} - -/* - Gives EuiDataGrid a min-width of 480px, otherwise the columns options will disappear if you hide all columns. -*/ -.mlDataFrameAnalyticsClassification__dataGridMinWidth { - float: left; - min-width: 480px; - width: calc(100% - #{$labelColumnWidth}); - - .euiDataGridRowCell--boolean { - text-transform: none; - } -} - -.mlDataFrameAnalyticsClassification__evaluationMetrics { - width: 60%; -} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/classification_exploration.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/classification_exploration.tsx index 8a198666a9732..fac1c8e76a759 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/classification_exploration.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/classification_exploration.tsx @@ -19,18 +19,16 @@ interface Props { } export const ClassificationExploration: FC = ({ jobId }) => ( -
- -
+ ); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_panel.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_panel.tsx index 0298a70ba4afa..0d30b0371a027 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_panel.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_panel.tsx @@ -5,8 +5,6 @@ * 2.0. */ -import './_classification_exploration.scss'; - import type { FC } from 'react'; import React, { useEffect, useState } from 'react'; @@ -291,190 +289,218 @@ export const EvaluatePanel: FC = ({ jobConfig, jobStatus, se } contentPadding={true} content={ - <> - {!isLoadingConfusionMatrix ? ( - <> - {errorConfusionMatrix !== null && } - {errorConfusionMatrix === null && ( + + + {/* Confusion matrix title and table */} + + {!isLoadingConfusionMatrix ? ( <> - - - {getHelpText(dataSubsetTitle)} - - - - - - {/* BEGIN TABLE ELEMENTS */} - -
-
- - - -
-
- {columns.length > 0 && columnsData.length > 0 && ( - <> -
+ {errorConfusionMatrix !== null && } + {errorConfusionMatrix === null && ( + <> + {/* confusion matrix title */} + + + + + {getHelpText(dataSubsetTitle)} + + + + + + + + {/* confusion matrix table */} + + + -
- - - - )} -
-
- {/* END TABLE ELEMENTS */} - - )} - - ) : null} - {/* Accuracy and Recall */} - - - {evaluationQualityMetricsHelpText} - - - - - - - - - - - - - - - - - - {/* AUC ROC Chart */} - - - - - - - - - - - - {Array.isArray(errorRocCurve) && ( - - {errorRocCurve.map((e) => ( - <> - {e} -
+
+ + + {columns.length > 0 && columnsData.length > 0 ? ( + <> + + + + + + + + + + ) : null} + + +
+ - ))} + )} - } - /> - )} - {!isLoadingRocCurve && errorRocCurve === null && rocCurveData.length > 0 && ( -
- + + + {/* evaluation quality metrics */} + + + {/* evaluation title */} + + {evaluationQualityMetricsHelpText} + + + + {/* evaluation stats */} + + + + + + + + + + + + + + + + + {/* AUC ROC Chart */} + + + + + + + + + + + + + + + {Array.isArray(errorRocCurve) && ( + + {errorRocCurve.map((e) => ( + <> + {e} +
+ + ))} + + } + /> + )} + {!isLoadingRocCurve && errorRocCurve === null && rocCurveData.length > 0 && ( +
+ +
)} - /> -
- )} - {isLoadingRocCurve && } - + {isLoadingRocCurve && } + + + + } /> diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_stat.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_stat.tsx index c4ebd2da2ead9..279744e479b80 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_stat.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/classification_exploration/evaluate_stat.tsx @@ -7,7 +7,7 @@ import type { FC } from 'react'; import React from 'react'; -import { EuiStat, EuiIconTip, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiStat, EuiIconTip, EuiFlexGroup, EuiFlexItem, useEuiTheme } from '@elastic/eui'; import { EMPTY_STAT } from '../../../../common/analytics'; interface Props { @@ -24,22 +24,25 @@ export const EvaluateStat: FC = ({ description, dataTestSubj, tooltipContent, -}) => ( - - - - - - - - -); +}) => { + const { + euiTheme: { size }, + } = useEuiTheme(); + + return ( + + + + + + + + + ); +}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/data_view_prompt/data_view_prompt.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/data_view_prompt/data_view_prompt.tsx index 9f3cfaffc53fb..6de4a59521313 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/data_view_prompt/data_view_prompt.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/data_view_prompt/data_view_prompt.tsx @@ -8,7 +8,7 @@ import type { FC } from 'react'; import React, { useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiLink, EuiText } from '@elastic/eui'; +import { EuiLink, EuiText, useEuiTheme } from '@elastic/eui'; import { useMlKibana } from '../../../../../contexts/kibana'; interface Props { @@ -24,6 +24,10 @@ export const DataViewPrompt: FC = ({ destIndex, color }) => { }, } = useMlKibana(); + const { + euiTheme: { size }, + } = useEuiTheme(); + const canCreateDataView = useMemo( () => capabilities.savedObjectsManagement.edit === true || capabilities.indexPatterns.save === true, @@ -31,36 +35,34 @@ export const DataViewPrompt: FC = ({ destIndex, color }) => { ); return ( - <> - + + + {canCreateDataView === true ? ( + + + ), }} /> - {canCreateDataView === true ? ( - - - - ), - }} - /> - ) : null} - - + ) : null} + ); }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.scss deleted file mode 100644 index 59fd59d69c4a5..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.scss +++ /dev/null @@ -1,13 +0,0 @@ -.mlExpandableSection { - padding: $euiSizeS $euiSize; -} - -.mlExpandableSection-contentPadding { - padding: $euiSizeS; -} - -// Make sure the charts tooltip in popover -// have higher zIndex than Eui popover cells -[id^='echTooltipPortal'] { - z-index: $euiZLevel9 !important; -} \ No newline at end of file diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.tsx index 68de97b30b575..9ba13f16926fe 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section.tsx @@ -5,8 +5,6 @@ * 2.0. */ -import './expandable_section.scss'; - import type { FC, ReactNode } from 'react'; import React, { useCallback, useMemo } from 'react'; @@ -18,6 +16,7 @@ import { EuiSkeletonText, EuiPanel, EuiText, + useEuiTheme, } from '@elastic/eui'; import { getDefaultExplorationPageUrlState, @@ -59,6 +58,10 @@ export const ExpandableSection: FC = ({ docsLink, urlStateKey, }) => { + const { + euiTheme: { size }, + } = useEuiTheme(); + const overrides = useMemo( () => (isExpandedDefault !== undefined ? { [urlStateKey]: isExpandedDefault } : undefined), [urlStateKey, isExpandedDefault] @@ -77,68 +80,65 @@ export const ExpandableSection: FC = ({ return ( -
- - - - - - -

{title}

-
-
-
- {headerItems === HEADER_ITEMS_LOADING && } - {isHeaderItems(headerItems) - ? headerItems.map(({ label, value, id }) => ( - - {label !== undefined && value !== undefined ? ( - - - -

{label}

-
-
- - {value} - -
- ) : null} - {label === undefined ? ( - - - - {value} - - - - ) : null} -
- )) - : null} -
-
- {docsLink !== undefined && {docsLink}} -
-
+ + + + + + +

{title}

+
+
+
+ {headerItems === HEADER_ITEMS_LOADING && } + {isHeaderItems(headerItems) + ? headerItems.map(({ label, value, id }) => ( + + {label !== undefined && value !== undefined ? ( + + + +

{label}

+
+
+ + {value} + +
+ ) : null} + {label === undefined ? ( + + + + {value} + + + + ) : null} +
+ )) + : null} +
+
+ {docsLink !== undefined && {docsLink}} +
{isExpanded && (
{content} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_results.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_results.tsx index cc296a42afbae..d8c20f7f3d6fc 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_results.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_results.tsx @@ -23,6 +23,7 @@ import { EuiSpacer, EuiText, EuiToolTip, + useEuiTheme, } from '@elastic/eui'; import type { DataView } from '@kbn/data-views-plugin/public'; @@ -142,6 +143,9 @@ export const ExpandableSectionResults: FC = ({ notifications: { toasts }, }, } = useMlKibana(); + const { + euiTheme: { size }, + } = useEuiTheme(); const dataViewId = dataView?.id; @@ -371,14 +375,12 @@ export const ExpandableSectionResults: FC = ({ const resultsSectionContent = ( <> {jobConfig !== undefined && needsDestDataView && ( -
- -
+ )} {jobConfig !== undefined && (isRegressionAnalysis(jobConfig.analysis) || isClassificationAnalysis(jobConfig.analysis)) && ( - + {tableItems.length === SEARCH_SIZE ? showingFirstDocs : showingDocs} )} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_splom.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_splom.tsx index 22b31abb17661..8ada4cab23410 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_splom.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/expandable_section/expandable_section_splom.tsx @@ -5,14 +5,12 @@ * 2.0. */ -import './expandable_section.scss'; - import type { FC } from 'react'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiHorizontalRule, EuiSpacer } from '@elastic/eui'; +import { EuiHorizontalRule, EuiSpacer, useEuiTheme } from '@elastic/eui'; import type { ScatterplotMatrixProps } from '../../../../../components/scatterplot_matrix'; import { ScatterplotMatrix } from '../../../../../components/scatterplot_matrix'; @@ -20,11 +18,15 @@ import { ScatterplotMatrix } from '../../../../../components/scatterplot_matrix' import { ExpandableSection } from './expandable_section'; export const ExpandableSectionSplom: FC = (props) => { + const { + euiTheme: { size }, + } = useEuiTheme(); + const splomSectionHeaderItems = undefined; const splomSectionContent = ( <> -
+
diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/_index.scss deleted file mode 100644 index bb948785d3efa..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'regression_exploration'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/_regression_exploration.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/_regression_exploration.scss deleted file mode 100644 index edcc9870ff93b..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/_regression_exploration.scss +++ /dev/null @@ -1,3 +0,0 @@ -.mlDataFrameAnalyticsRegression__evaluateStat { - padding-top: $euiSizeL; -} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_stat.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_stat.tsx index 89582c51b68f0..f56e1b1dc53f7 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_stat.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_stat.tsx @@ -9,7 +9,7 @@ import type { FC } from 'react'; import React from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiStat, EuiIconTip, EuiFlexGroup, EuiFlexItem, EuiLink } from '@elastic/eui'; +import { EuiStat, EuiIconTip, EuiFlexGroup, EuiFlexItem, EuiLink, useEuiTheme } from '@elastic/eui'; import { REGRESSION_STATS } from '../../../../common/analytics'; interface Props { @@ -83,24 +83,25 @@ const tooltipContent = { ), }; -export const EvaluateStat: FC = ({ isLoading, statType, title, dataTestSubj }) => ( - - - - - - {statType !== REGRESSION_STATS.HUBER && ( - = ({ isLoading, statType, title, dataTestSubj }) => { + const { + euiTheme: { size }, + } = useEuiTheme(); + + return ( + + + - )} - - -); + + + {statType !== REGRESSION_STATS.HUBER && } + + + ); +}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.scss deleted file mode 100644 index 5343760b1fe9f..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.scss +++ /dev/null @@ -1,8 +0,0 @@ -.mlExpandedRowDetails { - padding: $euiSizeS $euiSize $euiSize; -} - -/* Hide the basic table's header */ -.mlExpandedRowDetailsSection thead { - display: none; -} \ No newline at end of file diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.tsx index 32394ec3d1dd4..2c9a79fbc1c0d 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row_details_pane.tsx @@ -5,10 +5,9 @@ * 2.0. */ -import './expanded_row_details_pane.scss'; - import type { FC, ReactElement } from 'react'; import React from 'react'; +import { i18n } from '@kbn/i18n'; import { EuiBasicTable, @@ -21,6 +20,7 @@ import { EuiText, EuiTitle, EuiSpacer, + useEuiTheme, } from '@elastic/eui'; export interface SectionItem { @@ -106,11 +106,21 @@ export const Section: FC = ({ section }) => { const columns = [ { field: 'title', - name: '', + name: i18n.translate( + 'xpack.ml.dataframe.analytics.expandedRowDetails.analysisStatsHeaderField', + { + defaultMessage: 'Field', + } + ), }, { field: 'description', - name: '', + name: i18n.translate( + 'xpack.ml.dataframe.analytics.expandedRowDetails.analysisStatsHeaderValue', + { + defaultMessage: 'Value', + } + ), render: (v: SectionItem['description']) => <>{v}, }, ]; @@ -126,7 +136,6 @@ export const Section: FC = ({ section }) => { columns={columns} tableCaption={section.title} tableLayout="auto" - className="mlExpandedRowDetailsSection" data-test-subj={`${section.dataTestSubj}-table`} />
@@ -150,12 +159,16 @@ export const ExpandedRowDetailsPane: FC = ({ progress, dataTestSubj, }) => { + const { + euiTheme: { size }, + } = useEuiTheme(); + return ( <> diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_button/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_button/_index.scss deleted file mode 100644 index 14ff9de7ded4d..0000000000000 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_button/_index.scss +++ /dev/null @@ -1,4 +0,0 @@ -.dataFrameAnalyticsCreateSearchDialog { - width: $euiSizeL * 30; - min-height: $euiSizeL * 25; -} diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js index d78ed1ed6e7fc..f39bab106c643 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js @@ -1370,8 +1370,6 @@ class TimeseriesChartIntl extends Component { .attr('y', -2) .attr('height', contextChartLineTopMargin); - // Draw the brush handles using SVG foreignObject elements. - // Note these are not supported on IE11 and below, so will not appear in IE. const leftHandle = contextGroup .append('foreignObject') .attr('width', 10) From 11ae6a5bd9a06a4402e8af5173b0b0efcf5f52fc Mon Sep 17 00:00:00 2001 From: Drew Tate Date: Tue, 29 Oct 2024 09:50:30 -0600 Subject: [PATCH 128/135] [ES|QL] separate `KEEP`, `DROP`, and `SORT` autocomplete routines (#197744) ## Summary This PR begins the refactor described in https://github.com/elastic/kibana/issues/195418. The autocomplete engine now delegates to command-specific routines attached to the command definitions for `KEEP`, `DROP`, and `SORT`. The naming of `getFieldsFor` has been broadened to `getColumnsFor` because the response from Elasticsearch can contain variables as well as fields, depending on the query that is used to fetch the columns. No user-facing behavior should have changed. ### 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: Elastic Machine --- packages/kbn-esql-editor/src/esql_editor.tsx | 2 +- .../src/__tests__/helpers.ts | 2 +- .../__tests__/autocomplete.suggest.test.ts | 2 +- .../src/autocomplete/__tests__/helpers.ts | 16 +- .../src/autocomplete/autocomplete.test.ts | 60 ++- .../src/autocomplete/autocomplete.ts | 473 +++--------------- .../src/autocomplete/commands/drop/index.ts | 70 +++ .../src/autocomplete/commands/keep/index.ts | 70 +++ .../src/autocomplete/commands/sort/helper.ts | 38 ++ .../src/autocomplete/commands/sort/index.ts | 159 ++++++ .../src/autocomplete/complete_items.ts | 10 +- .../src/autocomplete/factories.ts | 2 +- .../src/autocomplete/helper.ts | 213 +++++++- .../recommended_queries/suggestions.ts | 4 +- .../src/autocomplete/types.ts | 2 +- .../src/code_actions/actions.test.ts | 14 +- .../src/code_actions/actions.ts | 2 +- .../src/definitions/commands.ts | 9 +- .../src/definitions/helpers.ts | 13 +- .../src/definitions/types.ts | 24 +- .../src/shared/helpers.test.ts | 2 +- .../src/shared/helpers.ts | 12 +- .../src/shared/resources_helpers.ts | 2 +- .../src/shared/types.ts | 2 +- .../validation/__tests__/callbacks.test.ts | 4 +- .../src/validation/validation.test.ts | 24 +- .../src/validation/validation.ts | 2 +- 27 files changed, 760 insertions(+), 473 deletions(-) create mode 100644 packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/drop/index.ts create mode 100644 packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/keep/index.ts create mode 100644 packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/index.ts diff --git a/packages/kbn-esql-editor/src/esql_editor.tsx b/packages/kbn-esql-editor/src/esql_editor.tsx index 97340dc20d422..e8ca582ac5229 100644 --- a/packages/kbn-esql-editor/src/esql_editor.tsx +++ b/packages/kbn-esql-editor/src/esql_editor.tsx @@ -336,7 +336,7 @@ export const ESQLEditor = memo(function ESQLEditor({ const sources = await memoizedSources(dataViews, core).result; return sources; }, - getFieldsFor: async ({ query: queryToExecute }: { query?: string } | undefined = {}) => { + getColumnsFor: async ({ query: queryToExecute }: { query?: string } | undefined = {}) => { if (queryToExecute) { // ES|QL with limit 0 returns only the columns and is more performant const esqlQuery = { diff --git a/packages/kbn-esql-validation-autocomplete/src/__tests__/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/__tests__/helpers.ts index abac86ab0e323..2f46356acee37 100644 --- a/packages/kbn-esql-validation-autocomplete/src/__tests__/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/__tests__/helpers.ts @@ -56,7 +56,7 @@ export const policies = [ export function getCallbackMocks() { return { - getFieldsFor: jest.fn(async ({ query }) => { + getColumnsFor: jest.fn(async ({ query }) => { if (/enrich/.test(query)) { return enrichFields; } diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.test.ts index 51302d0d4cde5..c7bf9079f9155 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/autocomplete.suggest.test.ts @@ -42,6 +42,6 @@ describe('autocomplete.suggest', () => { await suggest('sHoW ?'); await suggest('row ? |'); - expect(callbacks.getFieldsFor.mock.calls.length).toBe(0); + expect(callbacks.getColumnsFor.mock.calls.length).toBe(0); }); }); diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/helpers.ts index fa16a3df7026f..3234417c1f1a4 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/__tests__/helpers.ts @@ -244,7 +244,17 @@ export function getDateLiteralsByFieldType(_requestedType: FieldType | FieldType } export function createCustomCallbackMocks( - customFields?: ESQLRealField[], + /** + * Columns that will come from Elasticsearch since the last command + * e.g. the test case may be `FROM index | EVAL foo = 1 | KEEP /` + * + * In this case, the columns available for the KEEP command will be the ones + * that were available after the EVAL command + * + * `FROM index | EVAL foo = 1 | LIMIT 0` will be used to fetch columns. The response + * will include "foo" as a column. + */ + customColumnsSinceLastCommand?: ESQLRealField[], customSources?: Array<{ name: string; hidden: boolean }>, customPolicies?: Array<{ name: string; @@ -253,11 +263,11 @@ export function createCustomCallbackMocks( enrichFields: string[]; }> ) { - const finalFields = customFields || fields; + const finalColumnsSinceLastCommand = customColumnsSinceLastCommand || fields; const finalSources = customSources || indexes; const finalPolicies = customPolicies || policies; return { - getFieldsFor: jest.fn(async () => finalFields), + getColumnsFor: jest.fn(async () => finalColumnsSinceLastCommand), getSources: jest.fn(async () => finalSources), getPolicies: jest.fn(async () => finalPolicies), }; 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 deb4592428089..b89be15d670b1 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts @@ -31,6 +31,8 @@ import { TIME_PICKER_SUGGESTION, setup, attachTriggerCommand, + SuggestOptions, + fields, } from './__tests__/helpers'; import { METADATA_FIELDS } from '../shared/constants'; import { ESQL_COMMON_NUMERIC_TYPES, ESQL_STRING_TYPES } from '../shared/esql_types'; @@ -385,24 +387,56 @@ describe('autocomplete', () => { '```````round(doubleField) + 1```` + 1`` + 1`', '```````````````round(doubleField) + 1```````` + 1```` + 1`` + 1`', '```````````````````````````````round(doubleField) + 1```````````````` + 1```````` + 1```` + 1`` + 1`', + ], + undefined, + [ + [ + ...fields, + // the following non-field columns will come over the wire as part of the response + { + name: 'round(doubleField) + 1', + type: 'double', + }, + { + name: '`round(doubleField) + 1` + 1', + type: 'double', + }, + { + name: '```round(doubleField) + 1`` + 1` + 1', + type: 'double', + }, + { + name: '```````round(doubleField) + 1```` + 1`` + 1` + 1', + type: 'double', + }, + { + name: '```````````````round(doubleField) + 1```````` + 1```` + 1`` + 1` + 1', + type: 'double', + }, + ], ] ); it('should not suggest already-used fields and variables', async () => { const { suggest: suggestTest } = await setup(); - const getSuggestions = async (query: string) => - (await suggestTest(query)).map((value) => value.text); + const getSuggestions = async (query: string, opts?: SuggestOptions) => + (await suggestTest(query, opts)).map((value) => value.text); - expect(await getSuggestions('from a_index | EVAL foo = 1 | KEEP /')).toContain('foo'); - expect(await getSuggestions('from a_index | EVAL foo = 1 | KEEP foo, /')).not.toContain( - 'foo' - ); - expect(await getSuggestions('from a_index | EVAL foo = 1 | KEEP /')).toContain( + expect( + await getSuggestions('from a_index | EVAL foo = 1 | KEEP /', { + callbacks: { getColumnsFor: () => [...fields, { name: 'foo', type: 'integer' }] }, + }) + ).toContain('foo'); + expect( + await getSuggestions('from a_index | EVAL foo = 1 | KEEP foo, /', { + callbacks: { getColumnsFor: () => [...fields, { name: 'foo', type: 'integer' }] }, + }) + ).not.toContain('foo'); + + expect(await getSuggestions('from a_index | KEEP /')).toContain('doubleField'); + expect(await getSuggestions('from a_index | KEEP doubleField, /')).not.toContain( 'doubleField' ); - expect( - await getSuggestions('from a_index | EVAL foo = 1 | KEEP doubleField, /') - ).not.toContain('doubleField'); }); }); } @@ -504,7 +538,7 @@ describe('autocomplete', () => { }); describe('callbacks', () => { - it('should send the fields query without the last command', async () => { + it('should send the columns query without the last command', async () => { const callbackMocks = createCustomCallbackMocks(undefined, undefined, undefined); const statement = 'from a | drop keywordField | eval var0 = abs(doubleField) '; const triggerOffset = statement.lastIndexOf(' '); @@ -516,7 +550,7 @@ describe('autocomplete', () => { async (text) => (text ? getAstAndSyntaxErrors(text) : { ast: [], errors: [] }), callbackMocks ); - expect(callbackMocks.getFieldsFor).toHaveBeenCalledWith({ + expect(callbackMocks.getColumnsFor).toHaveBeenCalledWith({ query: 'from a | drop keywordField', }); }); @@ -532,7 +566,7 @@ describe('autocomplete', () => { async (text) => (text ? getAstAndSyntaxErrors(text) : { ast: [], errors: [] }), callbackMocks ); - expect(callbackMocks.getFieldsFor).toHaveBeenCalledWith({ query: 'from a' }); + expect(callbackMocks.getColumnsFor).toHaveBeenCalledWith({ query: 'from a' }); }); }); diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts index 98a26b0c8dd4b..5bdbd9d995fc9 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts @@ -14,12 +14,11 @@ import type { ESQLCommand, ESQLCommandOption, ESQLFunction, - ESQLLiteral, ESQLSingleAstItem, } from '@kbn/esql-ast'; import { i18n } from '@kbn/i18n'; import { ESQL_NUMBER_TYPES, isNumericType } from '../shared/esql_types'; -import type { EditorContext, ItemKind, SuggestionRawDefinition, GetFieldsByTypeFn } from './types'; +import type { EditorContext, ItemKind, SuggestionRawDefinition, GetColumnsByTypeFn } from './types'; import { getColumnForASTNode, getCommandDefinition, @@ -49,6 +48,7 @@ import { getColumnByName, sourceExists, findFinalWord, + getAllCommands, } from '../shared/helpers'; import { collectVariables, excludeVariablesFromCurrentCommand } from '../shared/variables'; import type { ESQLPolicy, ESQLRealField, ESQLVariable, ReferenceMaps } from '../validation/types'; @@ -56,9 +56,9 @@ import { allStarConstant, colonCompleteItem, commaCompleteItem, - commandAutocompleteDefinitions, getAssignmentDefinitionCompletitionItem, getBuiltinCompatibleFunctionDefinition, + getCommandAutocompleteDefinitions, getNextTokenForNot, listCompleteItem, pipeCompleteItem, @@ -101,15 +101,12 @@ import { isAggFunctionUsedAlready, removeQuoteForSuggestedSources, getValidSignaturesAndTypesToSuggestNext, + handleFragment, + getFieldsOrFunctionsSuggestions, + pushItUpInTheList, + extractTypeFromASTArg, } from './helper'; -import { getSortPos } from './commands/sort/helper'; -import { - FunctionParameter, - FunctionReturnType, - SupportedDataType, - isParameterType, - isReturnType, -} from '../definitions/types'; +import { FunctionParameter, isParameterType, isReturnType } from '../definitions/types'; import { metadataOption } from '../definitions/options'; import { comparisonFunctions } from '../definitions/builtin'; import { countBracketsUnclosed } from '../shared/helpers'; @@ -181,7 +178,7 @@ export async function suggest( if (astContext.type === 'newCommand') { // propose main commands here // filter source commands if already defined - const suggestions = commandAutocompleteDefinitions; + const suggestions = getCommandAutocompleteDefinitions(getAllCommands()); if (!ast.length) { // Display the recommended queries if there are no commands (empty state) const recommendedQueriesSuggestions: SuggestionRawDefinition[] = []; @@ -211,7 +208,7 @@ export async function suggest( if (astContext.type === 'expression') { // suggest next possible argument, or option // otherwise a variable - return getExpressionSuggestionsByType( + return getSuggestionsWithinCommand( innerText, ast, astContext, @@ -275,7 +272,7 @@ export async function suggest( export function getFieldsByTypeRetriever( queryString: string, resourceRetriever?: ESQLCallbacks -): { getFieldsByType: GetFieldsByTypeFn; getFieldsMap: GetFieldsMapFn } { +): { getFieldsByType: GetColumnsByTypeFn; getFieldsMap: GetFieldsMapFn } { const helpers = getFieldsByTypeHelper(queryString, resourceRetriever); return { getFieldsByType: async ( @@ -389,43 +386,6 @@ function areCurrentArgsValid( return true; } -export function extractTypeFromASTArg( - arg: ESQLAstItem, - references: Pick -): - | ESQLLiteral['literalType'] - | SupportedDataType - | FunctionReturnType - | 'timeInterval' - | string // @TODO remove this - | undefined { - if (Array.isArray(arg)) { - return extractTypeFromASTArg(arg[0], references); - } - if (isColumnItem(arg) || isLiteralItem(arg)) { - if (isLiteralItem(arg)) { - return arg.literalType; - } - if (isColumnItem(arg)) { - const hit = getColumnForASTNode(arg, references); - if (hit) { - return hit.type; - } - } - } - if (isTimeIntervalItem(arg)) { - return arg.type; - } - if (isFunctionItem(arg)) { - const fnDef = getFunctionDefinition(arg.name); - if (fnDef) { - // @TODO: improve this to better filter down the correct return type based on existing arguments - // just mind that this can be highly recursive... - return fnDef.signatures[0].returnType; - } - } -} - // @TODO: refactor this to be shared with validation function isFunctionArgComplete( arg: ESQLFunction, @@ -484,6 +444,55 @@ function extractArgMeta( return { argIndex, prevIndex, lastArg, nodeArg }; } +async function getSuggestionsWithinCommand( + innerText: string, + commands: ESQLCommand[], + { + command, + option, + node, + }: { + command: ESQLCommand; + option: ESQLCommandOption | undefined; + node: ESQLSingleAstItem | undefined; + }, + getSources: () => Promise, + getColumnsByType: GetColumnsByTypeFn, + getFieldsMap: GetFieldsMapFn, + getPolicies: GetPoliciesFn, + getPolicyMetadata: GetPolicyMetadataFn +) { + const commandDef = getCommandDefinition(command.name); + + // collect all fields + variables to suggest + const fieldsMap: Map = await getFieldsMap(); + const anyVariables = collectVariables(commands, fieldsMap, innerText); + + const references = { fields: fieldsMap, variables: anyVariables }; + if (commandDef.suggest) { + // The new path. + return commandDef.suggest(innerText, command, getColumnsByType, (col: string) => + Boolean(getColumnByName(col, references)) + ); + } else { + // The deprecated path. + return getExpressionSuggestionsByType( + innerText, + commands, + { command, option, node }, + getSources, + getColumnsByType, + getFieldsMap, + getPolicies, + getPolicyMetadata + ); + } +} + +/** + * @deprecated — this generic logic will be replaced with the command-specific suggest functions + * from each command definition. + */ async function getExpressionSuggestionsByType( innerText: string, commands: ESQLCommand[], @@ -497,7 +506,7 @@ async function getExpressionSuggestionsByType( node: ESQLSingleAstItem | undefined; }, getSources: () => Promise, - getFieldsByType: GetFieldsByTypeFn, + getFieldsByType: GetColumnsByTypeFn, getFieldsMap: GetFieldsMapFn, getPolicies: GetPoliciesFn, getPolicyMetadata: GetPolicyMetadataFn @@ -505,6 +514,15 @@ async function getExpressionSuggestionsByType( const commandDef = getCommandDefinition(command.name); const { argIndex, prevIndex, lastArg, nodeArg } = extractArgMeta(command, node); + // collect all fields + variables to suggest + const fieldsMap: Map = await getFieldsMap(); + const anyVariables = collectVariables(commands, fieldsMap, innerText); + + const references = { fields: fieldsMap, variables: anyVariables }; + if (!commandDef.signature || !commandDef.options) { + return []; + } + // TODO - this is a workaround because it was too difficult to handle this case in a generic way :( if (commandDef.name === 'from' && node && isSourceItem(node) && /\s/.test(node.name)) { // FROM " " @@ -537,7 +555,7 @@ async function getExpressionSuggestionsByType( command.args.filter((arg) => isOptionItem(arg)) as ESQLCommandOption[] ).map(({ name }) => ({ name, - index: commandDef.options.findIndex(({ name: defName }) => defName === name), + index: commandDef.options!.findIndex(({ name: defName }) => defName === name), })); const optionsAvailable = commandDef.options.filter(({ name }, index) => { const optArg = optionsAlreadyDeclared.find(({ name: optionName }) => optionName === name); @@ -577,23 +595,12 @@ async function getExpressionSuggestionsByType( } } - // collect all fields + variables to suggest - const fieldsMap: Map = await (argDef ? getFieldsMap() : new Map()); - const anyVariables = collectVariables(commands, fieldsMap, innerText); - const previousWord = findPreviousWord(innerText); // enrich with assignment has some special rules who are handled somewhere else const canHaveAssignments = ['eval', 'stats', 'row'].includes(command.name) && !comparisonFunctions.map((fn) => fn.name).includes(previousWord); - const references = { fields: fieldsMap, variables: anyVariables }; - if (command.name === 'sort') { - return await suggestForSortCmd(innerText, getFieldsByType, (col) => - Boolean(getColumnByName(col, references)) - ); - } - const suggestions: SuggestionRawDefinition[] = []; // When user types and accepts autocomplete suggestion, and cursor is placed at the end of a valid field @@ -1075,7 +1082,7 @@ async function getBuiltinFunctionNextArgument( nodeArg: ESQLFunction, nodeArgType: string, references: Pick, - getFieldsByType: GetFieldsByTypeFn + getFieldsByType: GetColumnsByTypeFn ) { const suggestions = []; const isFnComplete = isFunctionArgComplete(nodeArg, references); @@ -1171,96 +1178,6 @@ async function getBuiltinFunctionNextArgument( }); } -function pushItUpInTheList(suggestions: SuggestionRawDefinition[], shouldPromote: boolean) { - if (!shouldPromote) { - return suggestions; - } - return suggestions.map(({ sortText, ...rest }) => ({ - ...rest, - sortText: `1${sortText}`, - })); -} - -/** - * TODO — split this into distinct functions, one for fields, one for functions, one for literals - */ -async function getFieldsOrFunctionsSuggestions( - types: string[], - commandName: string, - optionName: string | undefined, - getFieldsByType: GetFieldsByTypeFn, - { - functions, - fields, - variables, - literals = false, - }: { - functions: boolean; - fields: boolean; - variables?: Map; - literals?: boolean; - }, - { - ignoreFn = [], - ignoreColumns = [], - }: { - ignoreFn?: string[]; - ignoreColumns?: string[]; - } = {} -): Promise { - const filteredFieldsByType = pushItUpInTheList( - (await (fields - ? getFieldsByType(types, ignoreColumns, { - advanceCursor: commandName === 'sort', - openSuggestions: commandName === 'sort', - }) - : [])) as SuggestionRawDefinition[], - functions - ); - - const filteredVariablesByType: string[] = []; - if (variables) { - for (const variable of variables.values()) { - if ( - (types.includes('any') || types.includes(variable[0].type)) && - !ignoreColumns.includes(variable[0].name) - ) { - filteredVariablesByType.push(variable[0].name); - } - } - // due to a bug on the ES|QL table side, filter out fields list with underscored variable names (??) - // avg( numberField ) => avg_numberField_ - const ALPHANUMERIC_REGEXP = /[^a-zA-Z\d]/g; - if ( - filteredVariablesByType.length && - filteredVariablesByType.some((v) => ALPHANUMERIC_REGEXP.test(v)) - ) { - for (const variable of filteredVariablesByType) { - const underscoredName = variable.replace(ALPHANUMERIC_REGEXP, '_'); - const index = filteredFieldsByType.findIndex( - ({ label }) => underscoredName === label || `_${underscoredName}_` === label - ); - if (index >= 0) { - filteredFieldsByType.splice(index); - } - } - } - } - // could also be in stats (bucket) but our autocomplete is not great yet - const displayDateSuggestions = types.includes('date') && ['where', 'eval'].includes(commandName); - - const suggestions = filteredFieldsByType.concat( - displayDateSuggestions ? getDateLiterals() : [], - functions ? getCompatibleFunctionDefinition(commandName, optionName, types, ignoreFn) : [], - variables - ? pushItUpInTheList(buildVariablesDefinitions(filteredVariablesByType), functions) - : [], - literals ? getCompatibleLiterals(commandName, types) : [] - ); - - return suggestions; -} - const addCommaIf = (condition: boolean, text: string) => (condition ? `${text},` : text); async function getFunctionArgsSuggestions( @@ -1275,7 +1192,7 @@ async function getFunctionArgsSuggestions( option: ESQLCommandOption | undefined; node: ESQLFunction; }, - getFieldsByType: GetFieldsByTypeFn, + getFieldsByType: GetColumnsByTypeFn, getFieldsMap: GetFieldsMapFn, getPolicyMetadata: GetPolicyMetadataFn, fullText: string, @@ -1504,7 +1421,7 @@ async function getListArgsSuggestions( command: ESQLCommand; node: ESQLSingleAstItem | undefined; }, - getFieldsByType: GetFieldsByTypeFn, + getFieldsByType: GetColumnsByTypeFn, getFieldsMaps: GetFieldsMapFn, getPolicyMetadata: GetPolicyMetadataFn ) { @@ -1559,13 +1476,13 @@ async function getSettingArgsSuggestions( command: ESQLCommand; node: ESQLSingleAstItem | undefined; }, - getFieldsByType: GetFieldsByTypeFn, + getFieldsByType: GetColumnsByTypeFn, getFieldsMaps: GetFieldsMapFn, getPolicyMetadata: GetPolicyMetadataFn ) { const suggestions = []; - const settingDefs = getCommandDefinition(command.name).modes; + const settingDefs = getCommandDefinition(command.name).modes || []; if (settingDefs.length) { const lastChar = getLastCharFromTrimmed(innerText); @@ -1590,7 +1507,7 @@ async function getOptionArgsSuggestions( option: ESQLCommandOption; node: ESQLSingleAstItem | undefined; }, - getFieldsByType: GetFieldsByTypeFn, + getFieldsByType: GetColumnsByTypeFn, getFieldsMaps: GetFieldsMapFn, getPolicyMetadata: GetPolicyMetadataFn, getPreferences?: () => Promise<{ histogramBarTarget: number } | undefined> @@ -1601,6 +1518,9 @@ async function getOptionArgsSuggestions( } const optionDef = getCommandOption(option.name); + if (!optionDef || !optionDef.signature) { + return []; + } const { nodeArg, argIndex, lastArg } = extractArgMeta(option, node); const suggestions = []; const isNewExpression = isRestartingExpression(innerText) || option.args.length === 0; @@ -1899,236 +1819,3 @@ async function getOptionArgsSuggestions( } return suggestions; } - -/** - * This function handles the logic to suggest completions - * for a given fragment of text in a generic way. A good example is - * a field name. - * - * When typing a field name, there are 2 scenarios - * - * 1. field name is incomplete (includes the empty string) - * KEEP / - * KEEP fie/ - * - * 2. field name is complete - * KEEP field/ - * - * This function provides a framework for detecting and handling both scenarios in a clean way. - * - * @param innerText - the query text before the current cursor position - * @param isFragmentComplete — return true if the fragment is complete - * @param getSuggestionsForIncomplete — gets suggestions for an incomplete fragment - * @param getSuggestionsForComplete - gets suggestions for a complete fragment - * @returns - */ -function handleFragment( - innerText: string, - isFragmentComplete: (fragment: string) => boolean, - getSuggestionsForIncomplete: ( - fragment: string, - rangeToReplace?: { start: number; end: number } - ) => SuggestionRawDefinition[] | Promise, - getSuggestionsForComplete: ( - fragment: string, - rangeToReplace: { start: number; end: number } - ) => SuggestionRawDefinition[] | Promise -): SuggestionRawDefinition[] | Promise { - /** - * @TODO — this string manipulation is crude and can't support all cases - * Checking for a partial word and computing the replacement range should - * really be done using the AST node, but we'll have to refactor further upstream - * to make that available. This is a quick fix to support the most common case. - */ - const fragment = findFinalWord(innerText); - if (!fragment) { - return getSuggestionsForIncomplete(''); - } else { - const rangeToReplace = { - start: innerText.length - fragment.length + 1, - end: innerText.length + 1, - }; - if (isFragmentComplete(fragment)) { - return getSuggestionsForComplete(fragment, rangeToReplace); - } else { - return getSuggestionsForIncomplete(fragment, rangeToReplace); - } - } -} - -const sortModifierSuggestions = { - ASC: { - label: 'ASC', - text: 'ASC', - detail: '', - kind: 'Keyword', - sortText: '1-ASC', - command: TRIGGER_SUGGESTION_COMMAND, - } as SuggestionRawDefinition, - DESC: { - label: 'DESC', - text: 'DESC', - detail: '', - kind: 'Keyword', - sortText: '1-DESC', - command: TRIGGER_SUGGESTION_COMMAND, - } as SuggestionRawDefinition, - NULLS_FIRST: { - label: 'NULLS FIRST', - text: 'NULLS FIRST', - detail: '', - kind: 'Keyword', - sortText: '2-NULLS FIRST', - command: TRIGGER_SUGGESTION_COMMAND, - } as SuggestionRawDefinition, - NULLS_LAST: { - label: 'NULLS LAST', - text: 'NULLS LAST', - detail: '', - kind: 'Keyword', - sortText: '2-NULLS LAST', - command: TRIGGER_SUGGESTION_COMMAND, - } as SuggestionRawDefinition, -}; - -export const suggestForSortCmd = async ( - innerText: string, - getFieldsByType: GetFieldsByTypeFn, - columnExists: (column: string) => boolean -): Promise => { - const prependSpace = (s: SuggestionRawDefinition) => ({ ...s, text: ' ' + s.text }); - - const { pos, nulls } = getSortPos(innerText); - - switch (pos) { - case 'space2': { - return [ - sortModifierSuggestions.ASC, - sortModifierSuggestions.DESC, - sortModifierSuggestions.NULLS_FIRST, - sortModifierSuggestions.NULLS_LAST, - pipeCompleteItem, - { ...commaCompleteItem, text: ', ', command: TRIGGER_SUGGESTION_COMMAND }, - ]; - } - case 'order': { - return handleFragment( - innerText, - (fragment) => ['ASC', 'DESC'].some((completeWord) => noCaseCompare(completeWord, fragment)), - (_fragment, rangeToReplace) => { - return Object.values(sortModifierSuggestions).map((suggestion) => ({ - ...suggestion, - rangeToReplace, - })); - }, - (fragment, rangeToReplace) => { - return [ - { ...pipeCompleteItem, text: ' | ' }, - { ...commaCompleteItem, text: ', ' }, - prependSpace(sortModifierSuggestions.NULLS_FIRST), - prependSpace(sortModifierSuggestions.NULLS_LAST), - ].map((suggestion) => ({ - ...suggestion, - filterText: fragment, - text: fragment + suggestion.text, - rangeToReplace, - command: TRIGGER_SUGGESTION_COMMAND, - })); - } - ); - } - case 'space3': { - return [ - sortModifierSuggestions.NULLS_FIRST, - sortModifierSuggestions.NULLS_LAST, - pipeCompleteItem, - { ...commaCompleteItem, text: ', ', command: TRIGGER_SUGGESTION_COMMAND }, - ]; - } - case 'nulls': { - return handleFragment( - innerText, - (fragment) => - ['FIRST', 'LAST'].some((completeWord) => noCaseCompare(completeWord, fragment)), - (_fragment) => { - const end = innerText.length + 1; - const start = end - nulls.length; - return Object.values(sortModifierSuggestions).map((suggestion) => ({ - ...suggestion, - // we can't use the range generated by handleFragment here - // because it doesn't really support multi-word completions - rangeToReplace: { start, end }, - })); - }, - (fragment, rangeToReplace) => { - return [ - { ...pipeCompleteItem, text: ' | ' }, - { ...commaCompleteItem, text: ', ' }, - ].map((suggestion) => ({ - ...suggestion, - filterText: fragment, - text: fragment + suggestion.text, - rangeToReplace, - command: TRIGGER_SUGGESTION_COMMAND, - })); - } - ); - } - case 'space4': { - return [ - pipeCompleteItem, - { ...commaCompleteItem, text: ', ', command: TRIGGER_SUGGESTION_COMMAND }, - ]; - } - } - - const fieldSuggestions = await getFieldsByType('any', [], { - openSuggestions: true, - }); - const functionSuggestions = await getFieldsOrFunctionsSuggestions( - ['any'], - 'sort', - undefined, - getFieldsByType, - { - functions: true, - fields: false, - } - ); - - return await handleFragment( - innerText, - columnExists, - (_fragment: string, rangeToReplace?: { start: number; end: number }) => { - // SORT fie - return [ - ...pushItUpInTheList( - fieldSuggestions.map((suggestion) => ({ - ...suggestion, - command: TRIGGER_SUGGESTION_COMMAND, - rangeToReplace, - })), - true - ), - ...functionSuggestions, - ]; - }, - (fragment: string, rangeToReplace: { start: number; end: number }) => { - // SORT field - return [ - { ...pipeCompleteItem, text: ' | ' }, - { ...commaCompleteItem, text: ', ' }, - prependSpace(sortModifierSuggestions.ASC), - prependSpace(sortModifierSuggestions.DESC), - prependSpace(sortModifierSuggestions.NULLS_FIRST), - prependSpace(sortModifierSuggestions.NULLS_LAST), - ].map((s) => ({ - ...s, - filterText: fragment, - text: fragment + s.text, - command: TRIGGER_SUGGESTION_COMMAND, - rangeToReplace, - })); - } - ); -}; diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/drop/index.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/drop/index.ts new file mode 100644 index 0000000000000..ed5f0ee3d3f6b --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/drop/index.ts @@ -0,0 +1,70 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { ESQLCommand } from '@kbn/esql-ast'; +import { + findPreviousWord, + getLastCharFromTrimmed, + isColumnItem, + noCaseCompare, +} from '../../../shared/helpers'; +import type { GetColumnsByTypeFn, SuggestionRawDefinition } from '../../types'; +import { commaCompleteItem, pipeCompleteItem } from '../../complete_items'; +import { handleFragment } from '../../helper'; +import { TRIGGER_SUGGESTION_COMMAND } from '../../factories'; + +export async function suggest( + innerText: string, + command: ESQLCommand<'drop'>, + getColumnsByType: GetColumnsByTypeFn, + columnExists: (column: string) => boolean +): Promise { + if ( + /\s/.test(innerText[innerText.length - 1]) && + getLastCharFromTrimmed(innerText) !== ',' && + !noCaseCompare(findPreviousWord(innerText), 'drop') + ) { + return [pipeCompleteItem, commaCompleteItem]; + } + + const alreadyDeclaredFields = command.args.filter(isColumnItem).map((arg) => arg.name); + const fieldSuggestions = await getColumnsByType('any', alreadyDeclaredFields); + + return handleFragment( + innerText, + (fragment) => columnExists(fragment), + (_fragment: string, rangeToReplace?: { start: number; end: number }) => { + // KEEP fie + return fieldSuggestions.map((suggestion) => ({ + ...suggestion, + text: suggestion.text, + command: TRIGGER_SUGGESTION_COMMAND, + rangeToReplace, + })); + }, + (fragment: string, rangeToReplace: { start: number; end: number }) => { + // KEEP field + const finalSuggestions = [{ ...pipeCompleteItem, text: ' | ' }]; + if (fieldSuggestions.length > 1) + // when we fix the editor marker, this should probably be checked against 0 instead of 1 + // this is because the last field in the AST is currently getting removed (because it contains + // the editor marker) so it is not included in the ignored list which is used to filter out + // existing fields above. + finalSuggestions.push({ ...commaCompleteItem, text: ', ' }); + + return finalSuggestions.map((s) => ({ + ...s, + filterText: fragment, + text: fragment + s.text, + command: TRIGGER_SUGGESTION_COMMAND, + rangeToReplace, + })); + } + ); +} diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/keep/index.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/keep/index.ts new file mode 100644 index 0000000000000..c2480ffbcde72 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/keep/index.ts @@ -0,0 +1,70 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { ESQLCommand } from '@kbn/esql-ast'; +import { + findPreviousWord, + getLastCharFromTrimmed, + isColumnItem, + noCaseCompare, +} from '../../../shared/helpers'; +import type { GetColumnsByTypeFn, SuggestionRawDefinition } from '../../types'; +import { commaCompleteItem, pipeCompleteItem } from '../../complete_items'; +import { handleFragment } from '../../helper'; +import { TRIGGER_SUGGESTION_COMMAND } from '../../factories'; + +export async function suggest( + innerText: string, + command: ESQLCommand<'keep'>, + getColumnsByType: GetColumnsByTypeFn, + columnExists: (column: string) => boolean +): Promise { + if ( + /\s/.test(innerText[innerText.length - 1]) && + getLastCharFromTrimmed(innerText) !== ',' && + !noCaseCompare(findPreviousWord(innerText), 'keep') + ) { + return [pipeCompleteItem, commaCompleteItem]; + } + + const alreadyDeclaredFields = command.args.filter(isColumnItem).map((arg) => arg.name); + const fieldSuggestions = await getColumnsByType('any', alreadyDeclaredFields); + + return handleFragment( + innerText, + (fragment) => columnExists(fragment), + (_fragment: string, rangeToReplace?: { start: number; end: number }) => { + // KEEP fie + return fieldSuggestions.map((suggestion) => ({ + ...suggestion, + text: suggestion.text, + command: TRIGGER_SUGGESTION_COMMAND, + rangeToReplace, + })); + }, + (fragment: string, rangeToReplace: { start: number; end: number }) => { + // KEEP field + const finalSuggestions = [{ ...pipeCompleteItem, text: ' | ' }]; + if (fieldSuggestions.length > 1) + // when we fix the editor marker, this should probably be checked against 0 instead of 1 + // this is because the last field in the AST is currently getting removed (because it contains + // the editor marker) so it is not included in the ignored list which is used to filter out + // existing fields above. + finalSuggestions.push({ ...commaCompleteItem, text: ', ' }); + + return finalSuggestions.map((s) => ({ + ...s, + filterText: fragment, + text: fragment + s.text, + command: TRIGGER_SUGGESTION_COMMAND, + rangeToReplace, + })); + } + ); +} diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/helper.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/helper.ts index 96546eff7d391..63dea06667cd8 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/helper.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/helper.ts @@ -7,6 +7,9 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ +import { TRIGGER_SUGGESTION_COMMAND } from '../../factories'; +import { SuggestionRawDefinition } from '../../types'; + const regexStart = /.+\|\s*so?r?(?t?)(.+,)?(?\s+)?/i; const regex = /.+\|\s*sort(.+,)?((?\s+)(?[^\s]+)(?\s*)(?(AS?C?)|(DE?S?C?))?(?\s*)(?NU?L?L?S? ?(FI?R?S?T?|LA?S?T?)?)?(?\s*))?/i; @@ -43,6 +46,41 @@ export interface SortCaretPosition { nulls: string; } +export const sortModifierSuggestions = { + ASC: { + label: 'ASC', + text: 'ASC', + detail: '', + kind: 'Keyword', + sortText: '1-ASC', + command: TRIGGER_SUGGESTION_COMMAND, + } as SuggestionRawDefinition, + DESC: { + label: 'DESC', + text: 'DESC', + detail: '', + kind: 'Keyword', + sortText: '1-DESC', + command: TRIGGER_SUGGESTION_COMMAND, + } as SuggestionRawDefinition, + NULLS_FIRST: { + label: 'NULLS FIRST', + text: 'NULLS FIRST', + detail: '', + kind: 'Keyword', + sortText: '2-NULLS FIRST', + command: TRIGGER_SUGGESTION_COMMAND, + } as SuggestionRawDefinition, + NULLS_LAST: { + label: 'NULLS LAST', + text: 'NULLS LAST', + detail: '', + kind: 'Keyword', + sortText: '2-NULLS LAST', + command: TRIGGER_SUGGESTION_COMMAND, + } as SuggestionRawDefinition, +}; + export const getSortPos = (query: string): SortCaretPosition => { const match = query.match(regex); let pos: SortCaretPosition['pos'] = 'none'; diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/index.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/index.ts new file mode 100644 index 0000000000000..61561dea96b72 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/commands/sort/index.ts @@ -0,0 +1,159 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import type { ESQLCommand } from '@kbn/esql-ast'; +import { noCaseCompare } from '../../../shared/helpers'; +import { commaCompleteItem, pipeCompleteItem } from '../../complete_items'; +import { TRIGGER_SUGGESTION_COMMAND } from '../../factories'; +import { getFieldsOrFunctionsSuggestions, handleFragment, pushItUpInTheList } from '../../helper'; +import type { GetColumnsByTypeFn, SuggestionRawDefinition } from '../../types'; +import { getSortPos, sortModifierSuggestions } from './helper'; + +export async function suggest( + innerText: string, + _command: ESQLCommand<'sort'>, + getColumnsByType: GetColumnsByTypeFn, + columnExists: (column: string) => boolean +): Promise { + const prependSpace = (s: SuggestionRawDefinition) => ({ ...s, text: ' ' + s.text }); + + const { pos, nulls } = getSortPos(innerText); + + switch (pos) { + case 'space2': { + return [ + sortModifierSuggestions.ASC, + sortModifierSuggestions.DESC, + sortModifierSuggestions.NULLS_FIRST, + sortModifierSuggestions.NULLS_LAST, + pipeCompleteItem, + { ...commaCompleteItem, text: ', ', command: TRIGGER_SUGGESTION_COMMAND }, + ]; + } + case 'order': { + return handleFragment( + innerText, + (fragment) => ['ASC', 'DESC'].some((completeWord) => noCaseCompare(completeWord, fragment)), + (_fragment, rangeToReplace) => { + return Object.values(sortModifierSuggestions).map((suggestion) => ({ + ...suggestion, + rangeToReplace, + })); + }, + (fragment, rangeToReplace) => { + return [ + { ...pipeCompleteItem, text: ' | ' }, + { ...commaCompleteItem, text: ', ' }, + prependSpace(sortModifierSuggestions.NULLS_FIRST), + prependSpace(sortModifierSuggestions.NULLS_LAST), + ].map((suggestion) => ({ + ...suggestion, + filterText: fragment, + text: fragment + suggestion.text, + rangeToReplace, + command: TRIGGER_SUGGESTION_COMMAND, + })); + } + ); + } + case 'space3': { + return [ + sortModifierSuggestions.NULLS_FIRST, + sortModifierSuggestions.NULLS_LAST, + pipeCompleteItem, + { ...commaCompleteItem, text: ', ', command: TRIGGER_SUGGESTION_COMMAND }, + ]; + } + case 'nulls': { + return handleFragment( + innerText, + (fragment) => + ['FIRST', 'LAST'].some((completeWord) => noCaseCompare(completeWord, fragment)), + (_fragment) => { + const end = innerText.length + 1; + const start = end - nulls.length; + return Object.values(sortModifierSuggestions).map((suggestion) => ({ + ...suggestion, + // we can't use the range generated by handleFragment here + // because it doesn't really support multi-word completions + rangeToReplace: { start, end }, + })); + }, + (fragment, rangeToReplace) => { + return [ + { ...pipeCompleteItem, text: ' | ' }, + { ...commaCompleteItem, text: ', ' }, + ].map((suggestion) => ({ + ...suggestion, + filterText: fragment, + text: fragment + suggestion.text, + rangeToReplace, + command: TRIGGER_SUGGESTION_COMMAND, + })); + } + ); + } + case 'space4': { + return [ + pipeCompleteItem, + { ...commaCompleteItem, text: ', ', command: TRIGGER_SUGGESTION_COMMAND }, + ]; + } + } + + const fieldSuggestions = await getColumnsByType('any', [], { + openSuggestions: true, + }); + const functionSuggestions = await getFieldsOrFunctionsSuggestions( + ['any'], + 'sort', + undefined, + getColumnsByType, + { + functions: true, + fields: false, + } + ); + + return await handleFragment( + innerText, + columnExists, + (_fragment: string, rangeToReplace?: { start: number; end: number }) => { + // SORT fie + return [ + ...pushItUpInTheList( + fieldSuggestions.map((suggestion) => ({ + ...suggestion, + command: TRIGGER_SUGGESTION_COMMAND, + rangeToReplace, + })), + true + ), + ...functionSuggestions, + ]; + }, + (fragment: string, rangeToReplace: { start: number; end: number }) => { + // SORT field + return [ + { ...pipeCompleteItem, text: ' | ' }, + { ...commaCompleteItem, text: ', ' }, + prependSpace(sortModifierSuggestions.ASC), + prependSpace(sortModifierSuggestions.DESC), + prependSpace(sortModifierSuggestions.NULLS_FIRST), + prependSpace(sortModifierSuggestions.NULLS_LAST), + ].map((s) => ({ + ...s, + filterText: fragment, + text: fragment + s.text, + command: TRIGGER_SUGGESTION_COMMAND, + rangeToReplace, + })); + } + ); +} diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/complete_items.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/complete_items.ts index 000c196b49e5e..b115e30c47efe 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/complete_items.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/complete_items.ts @@ -10,14 +10,13 @@ import { i18n } from '@kbn/i18n'; import type { ItemKind, SuggestionRawDefinition } from './types'; import { builtinFunctions } from '../definitions/builtin'; -import { getAllCommands } from '../shared/helpers'; import { getSuggestionBuiltinDefinition, getSuggestionCommandDefinition, TRIGGER_SUGGESTION_COMMAND, buildConstantsDefinitions, } from './factories'; -import { FunctionParameterType, FunctionReturnType } from '../definitions/types'; +import { CommandDefinition, FunctionParameterType, FunctionReturnType } from '../definitions/types'; import { getTestFunctions } from '../shared/test_functions'; export function getAssignmentDefinitionCompletitionItem() { @@ -87,9 +86,10 @@ export const getBuiltinCompatibleFunctionDefinition = ( .map(getSuggestionBuiltinDefinition); }; -export const commandAutocompleteDefinitions: SuggestionRawDefinition[] = getAllCommands() - .filter(({ hidden }) => !hidden) - .map(getSuggestionCommandDefinition); +export const getCommandAutocompleteDefinitions = ( + commands: Array> +): SuggestionRawDefinition[] => + commands.filter(({ hidden }) => !hidden).map(getSuggestionCommandDefinition); function buildCharCompleteItem( label: string, diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts index 85c8d035d33b1..f522e9bc65863 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts @@ -123,7 +123,7 @@ export const getCompatibleFunctionDefinition = ( }; export function getSuggestionCommandDefinition( - command: CommandDefinition + command: CommandDefinition ): SuggestionRawDefinition { const commandDefinition = getCommandDefinition(command.name); const commandSignature = getCommandSignature(commandDefinition); diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts index dd450e28b66a9..6585a04c98c59 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts @@ -7,21 +7,40 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { ESQLAstItem, ESQLCommand, ESQLFunction, ESQLSource } from '@kbn/esql-ast'; +import type { + ESQLAstItem, + ESQLCommand, + ESQLFunction, + ESQLLiteral, + ESQLSource, +} from '@kbn/esql-ast'; import { uniqBy } from 'lodash'; -import type { FunctionDefinition } from '../definitions/types'; +import type { + FunctionDefinition, + FunctionReturnType, + SupportedDataType, +} from '../definitions/types'; import { + findFinalWord, + getColumnForASTNode, getFunctionDefinition, isAssignment, + isColumnItem, isFunctionItem, isLiteralItem, + isTimeIntervalItem, } from '../shared/helpers'; -import type { SuggestionRawDefinition } from './types'; +import type { GetColumnsByTypeFn, SuggestionRawDefinition } from './types'; import { compareTypesWithLiterals } from '../shared/esql_types'; -import { TIME_SYSTEM_PARAMS } from './factories'; +import { + TIME_SYSTEM_PARAMS, + buildVariablesDefinitions, + getCompatibleFunctionDefinition, + getCompatibleLiterals, + getDateLiterals, +} from './factories'; import { EDITOR_MARKER } from '../shared/constants'; -import { extractTypeFromASTArg } from './autocomplete'; -import { ESQLRealField, ESQLVariable } from '../validation/types'; +import { ESQLRealField, ESQLVariable, ReferenceMaps } from '../validation/types'; function extractFunctionArgs(args: ESQLAstItem[]): ESQLFunction[] { return args.flatMap((arg) => (isAssignment(arg) ? arg.args[1] : arg)).filter(isFunctionItem); @@ -272,3 +291,185 @@ export function getValidSignaturesAndTypesToSuggestNext( currentArg, }; } + +/** + * This function handles the logic to suggest completions + * for a given fragment of text in a generic way. A good example is + * a field name. + * + * When typing a field name, there are 2 scenarios + * + * 1. field name is incomplete (includes the empty string) + * KEEP / + * KEEP fie/ + * + * 2. field name is complete + * KEEP field/ + * + * This function provides a framework for detecting and handling both scenarios in a clean way. + * + * @param innerText - the query text before the current cursor position + * @param isFragmentComplete — return true if the fragment is complete + * @param getSuggestionsForIncomplete — gets suggestions for an incomplete fragment + * @param getSuggestionsForComplete - gets suggestions for a complete fragment + * @returns + */ +export function handleFragment( + innerText: string, + isFragmentComplete: (fragment: string) => boolean, + getSuggestionsForIncomplete: ( + fragment: string, + rangeToReplace?: { start: number; end: number } + ) => SuggestionRawDefinition[] | Promise, + getSuggestionsForComplete: ( + fragment: string, + rangeToReplace: { start: number; end: number } + ) => SuggestionRawDefinition[] | Promise +): SuggestionRawDefinition[] | Promise { + /** + * @TODO — this string manipulation is crude and can't support all cases + * Checking for a partial word and computing the replacement range should + * really be done using the AST node, but we'll have to refactor further upstream + * to make that available. This is a quick fix to support the most common case. + */ + const fragment = findFinalWord(innerText); + if (!fragment) { + return getSuggestionsForIncomplete(''); + } else { + const rangeToReplace = { + start: innerText.length - fragment.length + 1, + end: innerText.length + 1, + }; + if (isFragmentComplete(fragment)) { + return getSuggestionsForComplete(fragment, rangeToReplace); + } else { + return getSuggestionsForIncomplete(fragment, rangeToReplace); + } + } +} +/** + * TODO — split this into distinct functions, one for fields, one for functions, one for literals + */ +export async function getFieldsOrFunctionsSuggestions( + types: string[], + commandName: string, + optionName: string | undefined, + getFieldsByType: GetColumnsByTypeFn, + { + functions, + fields, + variables, + literals = false, + }: { + functions: boolean; + fields: boolean; + variables?: Map; + literals?: boolean; + }, + { + ignoreFn = [], + ignoreColumns = [], + }: { + ignoreFn?: string[]; + ignoreColumns?: string[]; + } = {} +): Promise { + const filteredFieldsByType = pushItUpInTheList( + (await (fields + ? getFieldsByType(types, ignoreColumns, { + advanceCursor: commandName === 'sort', + openSuggestions: commandName === 'sort', + }) + : [])) as SuggestionRawDefinition[], + functions + ); + + const filteredVariablesByType: string[] = []; + if (variables) { + for (const variable of variables.values()) { + if ( + (types.includes('any') || types.includes(variable[0].type)) && + !ignoreColumns.includes(variable[0].name) + ) { + filteredVariablesByType.push(variable[0].name); + } + } + // due to a bug on the ES|QL table side, filter out fields list with underscored variable names (??) + // avg( numberField ) => avg_numberField_ + const ALPHANUMERIC_REGEXP = /[^a-zA-Z\d]/g; + if ( + filteredVariablesByType.length && + filteredVariablesByType.some((v) => ALPHANUMERIC_REGEXP.test(v)) + ) { + for (const variable of filteredVariablesByType) { + const underscoredName = variable.replace(ALPHANUMERIC_REGEXP, '_'); + const index = filteredFieldsByType.findIndex( + ({ label }) => underscoredName === label || `_${underscoredName}_` === label + ); + if (index >= 0) { + filteredFieldsByType.splice(index); + } + } + } + } + // could also be in stats (bucket) but our autocomplete is not great yet + const displayDateSuggestions = types.includes('date') && ['where', 'eval'].includes(commandName); + + const suggestions = filteredFieldsByType.concat( + displayDateSuggestions ? getDateLiterals() : [], + functions ? getCompatibleFunctionDefinition(commandName, optionName, types, ignoreFn) : [], + variables + ? pushItUpInTheList(buildVariablesDefinitions(filteredVariablesByType), functions) + : [], + literals ? getCompatibleLiterals(commandName, types) : [] + ); + + return suggestions; +} + +export function pushItUpInTheList(suggestions: SuggestionRawDefinition[], shouldPromote: boolean) { + if (!shouldPromote) { + return suggestions; + } + return suggestions.map(({ sortText, ...rest }) => ({ + ...rest, + sortText: `1${sortText}`, + })); +} + +export function extractTypeFromASTArg( + arg: ESQLAstItem, + references: Pick +): + | ESQLLiteral['literalType'] + | SupportedDataType + | FunctionReturnType + | 'timeInterval' + | string // @TODO remove this + | undefined { + if (Array.isArray(arg)) { + return extractTypeFromASTArg(arg[0], references); + } + if (isColumnItem(arg) || isLiteralItem(arg)) { + if (isLiteralItem(arg)) { + return arg.literalType; + } + if (isColumnItem(arg)) { + const hit = getColumnForASTNode(arg, references); + if (hit) { + return hit.type; + } + } + } + if (isTimeIntervalItem(arg)) { + return arg.type; + } + if (isFunctionItem(arg)) { + const fnDef = getFunctionDefinition(arg.name); + if (fnDef) { + // @TODO: improve this to better filter down the correct return type based on existing arguments + // just mind that this can be highly recursive... + return fnDef.signatures[0].returnType; + } + } +} diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/recommended_queries/suggestions.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/recommended_queries/suggestions.ts index fbcfbabb2b63c..29c598af93501 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/recommended_queries/suggestions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/recommended_queries/suggestions.ts @@ -7,11 +7,11 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import type { SuggestionRawDefinition, GetFieldsByTypeFn } from '../types'; +import type { SuggestionRawDefinition, GetColumnsByTypeFn } from '../types'; import { getRecommendedQueries } from './templates'; export const getRecommendedQueriesSuggestions = async ( - getFieldsByType: GetFieldsByTypeFn, + getFieldsByType: GetColumnsByTypeFn, fromCommand: string = '' ): Promise => { const fieldSuggestions = await getFieldsByType('date', [], { diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/types.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/types.ts index 030bff4da181c..cbd6ead535932 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/types.ts @@ -81,7 +81,7 @@ export interface EditorContext { triggerKind: number; } -export type GetFieldsByTypeFn = ( +export type GetColumnsByTypeFn = ( type: string | string[], ignored?: string[], options?: { advanceCursor?: boolean; openSuggestions?: boolean; addComma?: boolean } diff --git a/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.test.ts b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.test.ts index b608570854950..4563379642767 100644 --- a/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.test.ts @@ -18,7 +18,7 @@ import type { ESQLCallbacks, PartialFieldsMetadataClient } from '../shared/types function getCallbackMocks(): jest.Mocked { return { - getFieldsFor: jest.fn, any>(async ({ query }) => { + getColumnsFor: jest.fn, any>(async ({ query }) => { if (/enrich/.test(query)) { const fields: ESQLRealField[] = [ { name: 'otherField', type: 'keyword' }, @@ -375,11 +375,11 @@ describe('quick fixes logic', () => { const statement = `FROM index | DROP any#Char$Field`; const { errors } = await validateQuery(statement, getAstAndSyntaxErrors, undefined, { ...callbackMocks, - getFieldsFor: undefined, + getColumnsFor: undefined, }); const edits = await getActions(statement, errors, getAstAndSyntaxErrors, undefined, { ...callbackMocks, - getFieldsFor: undefined, + getColumnsFor: undefined, }); expect(edits.length).toBe(0); }); @@ -400,7 +400,7 @@ describe('quick fixes logic', () => { const statement = `FROM index | DROP any#Char$Field`; const { errors } = await validateQuery(statement, getAstAndSyntaxErrors, undefined, { ...callbackMocks, - getFieldsFor: undefined, + getColumnsFor: undefined, getFieldsMetadata: undefined, }); const actions = await getActions( @@ -412,7 +412,7 @@ describe('quick fixes logic', () => { }, { ...callbackMocks, - getFieldsFor: undefined, + getColumnsFor: undefined, getFieldsMetadata: undefined, } ); @@ -435,7 +435,7 @@ describe('quick fixes logic', () => { ); try { await getActions(statement, errors, getAstAndSyntaxErrors, undefined, { - getFieldsFor: undefined, + getColumnsFor: undefined, getSources: undefined, getPolicies: undefined, }); @@ -460,7 +460,7 @@ describe('quick fixes logic', () => { getAstAndSyntaxErrors, { relaxOnMissingCallbacks: true }, { - getFieldsFor: undefined, + getColumnsFor: undefined, getSources: undefined, getPolicies: undefined, getFieldsMetadata: undefined, diff --git a/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts index 02627c5f1abdf..37ab56350ffb2 100644 --- a/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts @@ -403,7 +403,7 @@ export async function getActions( const { getPolicies, getPolicyFields } = getPolicyRetriever(resourceRetriever); const callbacks = { - getFieldsByType: resourceRetriever?.getFieldsFor ? getFieldsByType : undefined, + getFieldsByType: resourceRetriever?.getColumnsFor ? getFieldsByType : undefined, getSources: resourceRetriever?.getSources ? getSources : undefined, getPolicies: resourceRetriever?.getPolicies ? getPolicies : undefined, getPolicyFields: resourceRetriever?.getPolicies ? getPolicyFields : undefined, diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts index 54504ac1a2a18..f4482a5b33c17 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/commands.ts @@ -32,6 +32,9 @@ import { withOption, } from './options'; import type { CommandDefinition } from './types'; +import { suggest as suggestForSort } from '../autocomplete/commands/sort'; +import { suggest as suggestForKeep } from '../autocomplete/commands/keep'; +import { suggest as suggestForDrop } from '../autocomplete/commands/drop'; const statsValidator = (command: ESQLCommand) => { const messages: ESQLMessage[] = []; @@ -148,7 +151,7 @@ const statsValidator = (command: ESQLCommand) => { } return messages; }; -export const commandDefinitions: CommandDefinition[] = [ +export const commandDefinitions: Array> = [ { name: 'row', description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.rowDoc', { @@ -311,6 +314,7 @@ export const commandDefinitions: CommandDefinition[] = [ defaultMessage: 'Rearranges fields in the input table by applying the keep clauses in fields', }), examples: ['… | keep a', '… | keep a,b'], + suggest: suggestForKeep, options: [], modes: [], signature: { @@ -330,6 +334,7 @@ export const commandDefinitions: CommandDefinition[] = [ multipleParams: true, params: [{ name: 'column', type: 'column', wildcards: true }], }, + suggest: suggestForDrop, validate: (command: ESQLCommand) => { const messages: ESQLMessage[] = []; const wildcardItems = command.args.filter((arg) => isColumnItem(arg) && arg.name === '*'); @@ -386,7 +391,9 @@ export const commandDefinitions: CommandDefinition[] = [ multipleParams: true, params: [{ name: 'expression', type: 'any' }], }, + suggest: suggestForSort, }, + { name: 'where', description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.whereDoc', { diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/helpers.ts index 867c68ab4f1df..2b50c9da541ce 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/helpers.ts @@ -56,14 +56,13 @@ function handleAdditionalArgs( } export function getCommandSignature( - { name, signature, options, examples }: CommandDefinition, + { name, signature, options, examples }: CommandDefinition, { withTypes }: { withTypes: boolean } = { withTypes: true } ) { return { - declaration: `${name.toUpperCase()} ${printCommandArguments( - signature, - withTypes - )} ${options.map( + declaration: `${name.toUpperCase()} ${printCommandArguments(signature, withTypes)} ${( + options || [] + ).map( (option) => `${ option.wrapped ? option.wrapped[0] : '' @@ -76,7 +75,7 @@ export function getCommandSignature( } function printCommandArguments( - { multipleParams, params }: CommandDefinition['signature'], + { multipleParams, params }: CommandDefinition['signature'], withTypes: boolean ): string { return `${params.map((arg) => printCommandArgument(arg, withTypes)).join(', `')}${ @@ -87,7 +86,7 @@ function printCommandArguments( } function printCommandArgument( - param: CommandDefinition['signature']['params'][number], + param: CommandDefinition['signature']['params'][number], withTypes: boolean ): string { if (!withTypes) { diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts index dee08766745df..a83908b41617f 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/types.ts @@ -8,6 +8,7 @@ */ import type { ESQLCommand, ESQLCommandOption, ESQLFunction, ESQLMessage } from '@kbn/esql-ast'; +import { GetColumnsByTypeFn, SuggestionRawDefinition } from '../autocomplete/types'; /** * All supported field types in ES|QL. This is all the types @@ -158,14 +159,21 @@ export interface FunctionDefinition { validate?: (fnDef: ESQLFunction) => ESQLMessage[]; } -export interface CommandBaseDefinition { - name: string; +export interface CommandBaseDefinition { + name: CommandName; alias?: string; description: string; /** * Whether to show or hide in autocomplete suggestion list */ hidden?: boolean; + suggest?: ( + innerText: string, + command: ESQLCommand, + getColumnsByType: GetColumnsByTypeFn, + columnExists: (column: string) => boolean + ) => Promise; + /** @deprecated this property will disappear in the future */ signature: { multipleParams: boolean; // innerTypes here is useful to drill down the type in case of "column" @@ -183,7 +191,8 @@ export interface CommandBaseDefinition { }; } -export interface CommandOptionsDefinition extends CommandBaseDefinition { +export interface CommandOptionsDefinition + extends CommandBaseDefinition { wrapped?: string[]; optional: boolean; skipCommonValidation?: boolean; @@ -201,12 +210,15 @@ export interface CommandModeDefinition { prefix?: string; } -export interface CommandDefinition extends CommandBaseDefinition { - options: CommandOptionsDefinition[]; +export interface CommandDefinition + extends CommandBaseDefinition { examples: string[]; validate?: (option: ESQLCommand) => ESQLMessage[]; - modes: CommandModeDefinition[]; hasRecommendedQueries?: boolean; + /** @deprecated this property will disappear in the future */ + modes: CommandModeDefinition[]; + /** @deprecated this property will disappear in the future */ + options: CommandOptionsDefinition[]; } export interface Literals { diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts index e2e6397005e22..b5f14ecfd0227 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts @@ -9,7 +9,7 @@ import { parse } from '@kbn/esql-ast'; import { getExpressionType, shouldBeQuotedSource } from './helpers'; -import { SupportedDataType } from '../definitions/types'; +import type { SupportedDataType } from '../definitions/types'; import { setTestFunctions } from './test_functions'; describe('shouldBeQuotedSource', () => { diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts index 18d6ae6faa246..02dff9720cd9b 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts @@ -132,7 +132,7 @@ export function isSourceCommand({ label }: { label: string }) { } let fnLookups: Map | undefined; -let commandLookups: Map | undefined; +let commandLookups: Map> | undefined; function buildFunctionLookup() { // we always refresh if we have test functions @@ -197,7 +197,7 @@ export function getFunctionDefinition(name: string) { const unwrapStringLiteralQuotes = (value: string) => value.slice(1, -1); -function buildCommandLookup() { +function buildCommandLookup(): Map> { if (!commandLookups) { commandLookups = commandDefinitions.reduce((memo, def) => { memo.set(def.name, def); @@ -205,12 +205,12 @@ function buildCommandLookup() { memo.set(def.alias, def); } return memo; - }, new Map()); + }, new Map>()); } - return commandLookups; + return commandLookups!; } -export function getCommandDefinition(name: string): CommandDefinition { +export function getCommandDefinition(name: string): CommandDefinition { return buildCommandLookup().get(name.toLowerCase())!; } @@ -218,7 +218,7 @@ export function getAllCommands() { return Array.from(buildCommandLookup().values()); } -export function getCommandOption(optionName: CommandOptionsDefinition['name']) { +export function getCommandOption(optionName: CommandOptionsDefinition['name']) { return [byOption, metadataOption, asOption, onOption, withOption, appendSeparatorOption].find( ({ name }) => name === optionName ); diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/resources_helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/resources_helpers.ts index a4da3907a4d6b..5e7d951d8bdbf 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/resources_helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/resources_helpers.ts @@ -36,7 +36,7 @@ export function getFieldsByTypeHelper(queryText: string, resourceRetriever?: ESQ const getFields = async () => { const metadata = await getEcsMetadata(); if (!cacheFields.size && queryText) { - const fieldsOfType = await resourceRetriever?.getFieldsFor?.({ query: queryText }); + const fieldsOfType = await resourceRetriever?.getColumnsFor?.({ query: queryText }); const fieldsWithMetadata = enrichFieldsWithECSInfo(fieldsOfType || [], metadata); for (const field of fieldsWithMetadata || []) { cacheFields.set(field.name, field); diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/types.ts b/packages/kbn-esql-validation-autocomplete/src/shared/types.ts index bc1e1d337e4b3..1caa2c480864e 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/types.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/types.ts @@ -39,7 +39,7 @@ export interface ESQLSourceResult { export interface ESQLCallbacks { getSources?: CallbackFn<{}, ESQLSourceResult>; - getFieldsFor?: CallbackFn<{ query: string }, ESQLRealField>; + getColumnsFor?: CallbackFn<{ query: string }, ESQLRealField>; getPolicies?: CallbackFn< {}, { name: string; sourceIndices: string[]; matchField: string; enrichFields: string[] } diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/callbacks.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/callbacks.test.ts index aaa7a3d88f5ca..61c0455fa1b0d 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/callbacks.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/callbacks.test.ts @@ -19,7 +19,7 @@ describe('FROM', () => { await validate('SHOW'); await validate('ROW \t'); - expect(callbacks.getFieldsFor.mock.calls.length).toBe(0); + expect(callbacks.getColumnsFor.mock.calls.length).toBe(0); }); test('loads fields with FROM source when commands after pipe present', async () => { @@ -27,6 +27,6 @@ describe('FROM', () => { await validate('FROM kibana_ecommerce METADATA _id | eval'); - expect(callbacks.getFieldsFor.mock.calls.length).toBe(1); + expect(callbacks.getColumnsFor.mock.calls.length).toBe(1); }); }); 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 fae4ca16797cc..a9ecac9663609 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -1532,7 +1532,7 @@ describe('validation logic', () => { it(`should not fetch source and fields list when a row command is set`, async () => { const callbackMocks = getCallbackMocks(); await validateQuery(`row a = 1 | eval a`, getAstAndSyntaxErrors, undefined, callbackMocks); - expect(callbackMocks.getFieldsFor).not.toHaveBeenCalled(); + expect(callbackMocks.getColumnsFor).not.toHaveBeenCalled(); expect(callbackMocks.getSources).not.toHaveBeenCalled(); }); @@ -1545,7 +1545,7 @@ describe('validation logic', () => { it(`should not fetch source and fields for empty command`, async () => { const callbackMocks = getCallbackMocks(); await validateQuery(` `, getAstAndSyntaxErrors, undefined, callbackMocks); - expect(callbackMocks.getFieldsFor).not.toHaveBeenCalled(); + expect(callbackMocks.getColumnsFor).not.toHaveBeenCalled(); expect(callbackMocks.getSources).not.toHaveBeenCalled(); }); @@ -1559,8 +1559,8 @@ describe('validation logic', () => { ); expect(callbackMocks.getSources).not.toHaveBeenCalled(); expect(callbackMocks.getPolicies).toHaveBeenCalled(); - expect(callbackMocks.getFieldsFor).toHaveBeenCalledTimes(1); - expect(callbackMocks.getFieldsFor).toHaveBeenLastCalledWith({ + expect(callbackMocks.getColumnsFor).toHaveBeenCalledTimes(1); + expect(callbackMocks.getColumnsFor).toHaveBeenLastCalledWith({ query: `from enrich_index | keep otherField, yetAnotherField`, }); }); @@ -1575,8 +1575,8 @@ describe('validation logic', () => { ); expect(callbackMocks.getSources).not.toHaveBeenCalled(); expect(callbackMocks.getPolicies).not.toHaveBeenCalled(); - expect(callbackMocks.getFieldsFor).toHaveBeenCalledTimes(1); - expect(callbackMocks.getFieldsFor).toHaveBeenLastCalledWith({ + expect(callbackMocks.getColumnsFor).toHaveBeenCalledTimes(1); + expect(callbackMocks.getColumnsFor).toHaveBeenLastCalledWith({ query: 'show info', }); }); @@ -1591,8 +1591,8 @@ describe('validation logic', () => { ); expect(callbackMocks.getSources).toHaveBeenCalled(); expect(callbackMocks.getPolicies).toHaveBeenCalled(); - expect(callbackMocks.getFieldsFor).toHaveBeenCalledTimes(2); - expect(callbackMocks.getFieldsFor).toHaveBeenLastCalledWith({ + expect(callbackMocks.getColumnsFor).toHaveBeenCalledTimes(2); + expect(callbackMocks.getColumnsFor).toHaveBeenLastCalledWith({ query: `from enrich_index | keep otherField, yetAnotherField`, }); }); @@ -1604,7 +1604,7 @@ describe('validation logic', () => { getAstAndSyntaxErrors, undefined, { - getFieldsFor: undefined, + getColumnsFor: undefined, getSources: undefined, getPolicies: undefined, } @@ -1718,7 +1718,7 @@ describe('validation logic', () => { const contentByCallback = { getSources: /Unknown index/, getPolicies: /Unknown policy/, - getFieldsFor: /Unknown column|Argument of|it is unsupported or not indexed/, + getColumnsFor: /Unknown column|Argument of|it is unsupported or not indexed/, getPreferences: /Unknown/, getFieldsMetadata: /Unknown/, }; @@ -1761,7 +1761,7 @@ describe('validation logic', () => { }); // test excluding one callback at the time - it.each(['getSources', 'getFieldsFor', 'getPolicies'] as Array)( + it.each(['getSources', 'getColumnsFor', 'getPolicies'] as Array)( `should not error if %s is missing`, async (excludedCallback) => { const filteredTestCases = fixtures.testCases.filter((t) => @@ -1790,7 +1790,7 @@ describe('validation logic', () => { ); it('should work if no callback passed', async () => { - const excludedCallbacks = ['getSources', 'getPolicies', 'getFieldsFor'] as Array< + const excludedCallbacks = ['getSources', 'getPolicies', 'getColumnsFor'] as Array< keyof typeof ignoreErrorsMap >; for (const testCase of fixtures.testCases.filter((t) => diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts index 9605da8460eed..111fe79b3f5e0 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.ts @@ -1074,7 +1074,7 @@ function validateUnsupportedTypeFields(fields: Map) { } export const ignoreErrorsMap: Record = { - getFieldsFor: ['unknownColumn', 'wrongArgumentType', 'unsupportedFieldType'], + getColumnsFor: ['unknownColumn', 'wrongArgumentType', 'unsupportedFieldType'], getSources: ['unknownIndex'], getPolicies: ['unknownPolicy'], getPreferences: [], From ae86b54a364d87b15a27f7252eea649c1fc6a722 Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Tue, 29 Oct 2024 16:57:01 +0100 Subject: [PATCH 129/135] [CI] Fix project build & deploy job (#196562) ## Summary In #195581 we've added the option to deploy through the clickable triggers. But in it's current state, it's broken in several aspects. (1) It's not starting on click. Triggers was resulting in a 422 on Buildkite's side, and after digging more into it, this was the error: Screenshot 2024-10-16 at 16 53 13 Apparently, building PRs needs to be enabled on jobs that want to be triggered through the PR bot. (2) It is set up to run regardless of the labels (3) There's no feedback on runs ## Changes This PR: - enables buildability in the pipeline's config - exits early if deploy labels are missing - adds a comment on the PR if a deploy job is started or finished - removes the kibana build step, it's not needed, as we have a step to build the docker image TODO: - [x] Add feedback about a started job (either through a non-required check, or a github comment) - [x] Early exit if a label is missing There are several other builds started right now, because the logic that would trigger a build on changing a draft to ready. To be fixed in https://github.com/elastic/buildkite-pr-bot/issues/78 Tested after manually by enabling the option on the UI, and triggering through the checkbox: https://buildkite.com/elastic/kibana-deploy-project-from-pr/builds/23 --- .../kibana-deploy-project.yml | 2 + .buildkite/pipeline-utils/github/github.ts | 20 +++ .../project-build-and-deploy-pr.yml | 121 ++++++++++-------- .buildkite/pull_requests.json | 7 +- .buildkite/scripts/lifecycle/comment_on_pr.ts | 64 +++++++++ 5 files changed, 160 insertions(+), 54 deletions(-) create mode 100644 .buildkite/scripts/lifecycle/comment_on_pr.ts diff --git a/.buildkite/pipeline-resource-definitions/kibana-deploy-project.yml b/.buildkite/pipeline-resource-definitions/kibana-deploy-project.yml index 3c1bdc00ba371..490c9d9afc4e4 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-deploy-project.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-deploy-project.yml @@ -28,9 +28,11 @@ spec: pipeline_file: .buildkite/pipelines/serverless_deployment/project-build-and-deploy-pr.yml skip_intermediate_builds: true provider_settings: + build_pull_requests: true prefix_pull_request_fork_branch_names: false skip_pull_request_builds_for_existing_commits: true trigger_mode: none + cancel_intermediate_builds: true teams: kibana-operations: access_level: MANAGE_BUILD_AND_READ diff --git a/.buildkite/pipeline-utils/github/github.ts b/.buildkite/pipeline-utils/github/github.ts index 0a7970d750598..eb9a240386bbc 100644 --- a/.buildkite/pipeline-utils/github/github.ts +++ b/.buildkite/pipeline-utils/github/github.ts @@ -93,6 +93,26 @@ export const doAnyChangesMatch = async ( return anyFilesMatchRequired; }; +export function addComment( + comment: string, + owner = process.env.GITHUB_PR_BASE_OWNER, + repo = process.env.GITHUB_PR_BASE_REPO, + prNumber: undefined | string | number = process.env.GITHUB_PR_NUMBER +) { + if (!owner || !repo || !prNumber) { + throw Error( + "Couldn't retrieve Github PR info from environment variables in order to add a comment" + ); + } + + return github.issues.createComment({ + owner, + repo, + issue_number: typeof prNumber === 'number' ? prNumber : parseInt(prNumber, 10), + body: comment, + }); +} + export function getGithubClient() { return github; } diff --git a/.buildkite/pipelines/serverless_deployment/project-build-and-deploy-pr.yml b/.buildkite/pipelines/serverless_deployment/project-build-and-deploy-pr.yml index f7fc94ac444e1..04b738ff363e1 100644 --- a/.buildkite/pipelines/serverless_deployment/project-build-and-deploy-pr.yml +++ b/.buildkite/pipelines/serverless_deployment/project-build-and-deploy-pr.yml @@ -1,53 +1,72 @@ -agents: - provider: gcp - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod +env: + ELASTIC_PR_COMMENTS_ENABLED: 'true' + GITHUB_BUILD_COMMIT_STATUS_ENABLED: 'true' + GITHUB_BUILD_COMMIT_STATUS_CONTEXT: kibana-deploy-project-from-pr steps: - - command: .buildkite/scripts/lifecycle/pre_build.sh - label: Pre-Build - timeout_in_minutes: 10 - agents: - machineType: n2-standard-2 - retry: - automatic: - - exit_status: '*' - limit: 1 - - - wait: ~ - - - command: .buildkite/scripts/steps/build_kibana.sh - label: Build Kibana Distribution and Plugins - agents: - machineType: n2-standard-16 - preemptible: true - key: build - if: "build.env('KIBANA_BUILD_ID') == null || build.env('KIBANA_BUILD_ID') == ''" - timeout_in_minutes: 90 - retry: - automatic: - - exit_status: '-1' - limit: 3 - - - wait: ~ - - - command: .buildkite/scripts/steps/artifacts/docker_image.sh - label: 'Build Project Image' - key: build_project_image - agents: - machineType: n2-standard-16 - preemptible: true - timeout_in_minutes: 60 - retry: - automatic: - - exit_status: '-1' - limit: 3 - - - wait: ~ - - - command: .buildkite/scripts/steps/serverless/deploy.sh - label: 'Deploy Project' - agents: - machineType: n2-standard-4 - preemptible: true - timeout_in_minutes: 10 + - group: 'Project Deployment' + if: "build.env('GITHUB_PR_LABELS') =~ /ci:project-deploy-(elasticsearch|observability|security)/" + + steps: + - command: .buildkite/scripts/lifecycle/pre_build.sh + label: Pre-Build + timeout_in_minutes: 10 + agents: + provider: gcp + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + machineType: n2-standard-2 + retry: + automatic: + - exit_status: '*' + limit: 1 + + - command: | + ts-node .buildkite/scripts/lifecycle/comment_on_pr.ts "PR Project deployment started at: $BUILDKITE_BUILD_URL" + label: Comment with job URL + agents: + provider: gcp + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + machineType: n2-standard-2 + timeout_in_minutes: 5 + + - wait: ~ + + - command: .buildkite/scripts/steps/artifacts/docker_image.sh + label: 'Build Project Image' + key: build_project_image + agents: + provider: gcp + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + machineType: n2-standard-16 + preemptible: true + timeout_in_minutes: 60 + retry: + automatic: + - exit_status: '-1' + limit: 3 + + - wait: ~ + - command: .buildkite/scripts/steps/serverless/deploy.sh + label: 'Deploy Project' + agents: + provider: gcp + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + machineType: n2-standard-4 + preemptible: true + timeout_in_minutes: 10 + + - wait: ~ + + - command: | + ts-node .buildkite/scripts/lifecycle/comment_on_pr.ts "Project deployed, see credentials at: $BUILDKITE_BUILD_URL" + label: Comment with job URL + agents: + provider: gcp + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + machineType: n2-standard-2 + timeout_in_minutes: 5 diff --git a/.buildkite/pull_requests.json b/.buildkite/pull_requests.json index 20785e92be1b5..cbc0e9df03dc8 100644 --- a/.buildkite/pull_requests.json +++ b/.buildkite/pull_requests.json @@ -49,14 +49,15 @@ "repoOwner": "elastic", "repoName": "kibana", "pipelineSlug": "kibana-deploy-project-from-pr", - + "skip_ci_labels": [], "enabled": true, "allow_org_users": true, "allowed_repo_permissions": ["admin", "write"], "allowed_list": ["elastic-vault-github-plugin-prod[bot]"], - "set_commit_status": false, + "set_commit_status": true, + "commit_status_context": "kibana-deploy-project-from-pr", "build_on_commit": false, - "build_on_comment": false, + "build_on_comment": true, "build_drafts": false, "trigger_comment_regex": "^(?:(?:buildkite\\W+)?(?:deploy)\\W+(?:project))$", "kibana_versions_check": true, diff --git a/.buildkite/scripts/lifecycle/comment_on_pr.ts b/.buildkite/scripts/lifecycle/comment_on_pr.ts new file mode 100644 index 0000000000000..39ebd511d8410 --- /dev/null +++ b/.buildkite/scripts/lifecycle/comment_on_pr.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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { addComment } from '#pipeline-utils'; + +const ALLOWED_ENV_VARS = [ + 'BUILDKITE_BRANCH', + 'BUILDKITE_BUILD_ID', + 'BUILDKITE_BUILD_NUMBER', + 'BUILDKITE_BUILD_URL', + 'BUILDKITE_COMMIT', + 'BUILDKITE_PIPELINE_NAME', + 'BUILDKITE_PIPELINE_SLUG', + 'GITHUB_PR_BASE_OWNER', + 'GITHUB_PR_BASE_REPO', + 'GITHUB_PR_BRANCH', + 'GITHUB_PR_HEAD_SHA', + 'GITHUB_PR_HEAD_USER', + 'GITHUB_PR_LABELS', + 'GITHUB_PR_NUMBER', + 'GITHUB_PR_OWNER', + 'GITHUB_PR_REPO', + 'GITHUB_PR_TARGET_BRANCH', + 'GITHUB_PR_TRIGGERED_SHA', + 'GITHUB_PR_TRIGGER_USER', + 'GITHUB_PR_USER', +]; +const DEFAULT_MESSAGE_TEMPLATE = + '🚀 Buildkite job started for PR #${GITHUB_PR_NUMBER}: ${BUILDKITE_BUILD_URL}'; + +export function commentOnPR() { + const messageTemplate = + process.argv.slice(2)?.join(' ') || + process.env.JOB_START_COMMENT_TEMPLATE || + DEFAULT_MESSAGE_TEMPLATE; + if (messageTemplate === DEFAULT_MESSAGE_TEMPLATE) { + console.log('No message template provided, using default message'); + } else { + console.log(`Using message template: ${messageTemplate}`); + } + + const message = messageTemplate.replace(/\${([^}]+)}/g, (_, envVar) => { + if (ALLOWED_ENV_VARS.includes(envVar)) { + return process.env[envVar] || ''; + } else { + return '${' + envVar + '}'; + } + }); + + return addComment(message); +} + +if (require.main === module) { + commentOnPR().catch((error) => { + console.error(error); + process.exit(1); + }); +} From 85fd147d0162e19999a1f27aea59d7bfbb0b47b4 Mon Sep 17 00:00:00 2001 From: Raya Fratkina Date: Tue, 29 Oct 2024 12:09:50 -0400 Subject: [PATCH 130/135] Expand README (#197880) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Adds a bit more general background, intro to concepts, and guidelines about what to use FF for and what not to ### 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#_add_your_labels) - [ ] This will appear in the **Release Notes** and follow the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Alejandro Fernández Haro --- packages/core/feature-flags/README.mdx | 79 +++++++++++++------------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/packages/core/feature-flags/README.mdx b/packages/core/feature-flags/README.mdx index bd381269da8af..99e10b72aa68c 100644 --- a/packages/core/feature-flags/README.mdx +++ b/packages/core/feature-flags/README.mdx @@ -20,56 +20,53 @@ One example of invalid use cases are settings used during the `setup` lifecycle if an HTTP route is registered or not. Instead, you should always register the route, and return `404 - Not found` in the route handler if the feature flag returns a _disabled_ state. +In summary, Feature flagging is best suited for + - Phased rollout of the features (either to a specific customer, a subset of customers, or a % of overall users) + - Feature experimentation + +Feature flagging is NOT suitable for + - Applying feature availability for licensing and/or tiers + - Restricting or applying customer entitlement to specific GA features + For a code example, refer to the [Feature Flags Example plugin](https://github.com/elastic/kibana/blob/main/examples/feature_flags_example/README.md) -## Registering a feature flag +## Key concepts -> [!IMPORTANT] -> At the moment, we follow a manual process to manage our feature flags. Refer to [this repo](https://github.com/elastic/kibana-feature-flags) to learn more about our current internal process. -> Our goal is to achieve the _gitops_ approach detailed below. But, at the moment, it's not available, and you can skip it if you want. +### Feature Flag -Kibana follows a _gitops_ approach when managing feature flags. To declare a feature flag, add your flags definitions in -your plugin's `server/index.ts` file: +A config key that defines a set of [variations](#variations) that will be resolved at runtime when the app calls [the evaluation APIs](https://docs.elastic.dev/kibana-dev-docs/tutorials/feature-flags-service#evaluating-feature-flags). The variation is decided at runtime based on static binary state (ON -> `variationA` vs. OFF -> `variationB`), or via [evaluation/segmentation rules](#evaluationsegmentation-rules). -```typescript -// /server/index.ts -import type { FeatureFlagDefinitions } from '@kbn/core-feature-flags-server'; -import type { PluginInitializerContext } from '@kbn/core-plugins-server'; - -export const featureFlags: FeatureFlagDefinitions = [ - { - key: 'myPlugin.myCoolFeature', - name: 'My cool feature', - description: 'Enables the cool feature to auto-hide the navigation bar', - tags: ['my-plugin', 'my-service', 'ui'], - variationType: 'boolean', - variations: [ - { - name: 'On', - description: 'Auto-hides the bar', - value: true, - }, - { - name: 'Off', - description: 'Static always-on', - value: false, - }, - ], - }, - {...}, -]; - -export async function plugin(initializerContext: PluginInitializerContext) { - const { FeatureFlagsExamplePlugin } = await import('./plugin'); - return new FeatureFlagsExamplePlugin(initializerContext); -} -``` +### Variations + +All the potential values that a feature flag can return based on the [evaluation rules](#evaluationsegmentation-rules). A feature flag should define at least 2 variations: the ON and the OFF states. The typical use case sets the OFF state to match the `fallback` value provided to [the evaluation APIs](https://docs.elastic.dev/kibana-dev-docs/tutorials/feature-flags-service#evaluating-feature-flags), although it's not a hard requirement and Kibana contributors might require special configurations. + +### Evaluation/Segmentation rules + +Set of rules used to evaluate the variation to resolve, based on the [evaluation context](#evaluation-context) provided by the app. + +The rules can vary from a percentage rollout per evaluation context, or more complex IF...THEN filters and clauses. + +Refer to the [Evaluation Context guide's examples](https://github.com/elastic/kibana-feature-flags/blob/main/docs/evaluation-context.md#examples) for some typical scenarios. + +### Evaluation Context + +Kibana reports a set of properties specific to each ECH deployment/Serverless project to help define the [segmentation rules](#evaluationsegmentation-rules). A list of the currently reported context properties can be found in the [Evaluation Context guide](https://github.com/elastic/kibana-feature-flags/blob/main/docs/evaluation-context.md). + +### Feature Flag Code References + +In the Kibana repo we run a [GH Action](https://github.com/elastic/kibana/actions/workflows/launchdarkly-code-references.yml) that links existing Feature Flags to their code references. This helps us figure out which flags have been removed from the code and, which ones are still being used. + +> :information_source: New flags might take a few moments to be updated with their code references. +> The job runs on every commit to the `main` branch of the [Kibana repository](https://github.com/elastic/kibana), so the wait can take from a few minutes to a few hours, depending on the Kibana repo's activity. + +## Registering a feature flag -After merging your PR, the CI will create/update the flags in our third-party feature flags provider. +At the moment, we follow a manual process to manage our feature flags. Refer to [this repo](https://github.com/elastic/kibana-feature-flags) to learn more about our current internal process. +Our goal is to achieve a _gitops_ approach eventually. But, at the moment, it's not available. ### Deprecation/removal strategy -When your code doesn't use the feature flag anymore, it is recommended to clean up the feature flags when possible. +When your code doesn't use the feature flag anymore, it is recommended to clean up the feature flags. There are a few considerations to take into account when performing this clean-up: 1. Always deprecate first, remove after From c7b8ca00de0cec5cd99db6e4a218ad40dde27369 Mon Sep 17 00:00:00 2001 From: Mohamed Nabeel <137497525+nabeelmohamed@users.noreply.github.com> Date: Tue, 29 Oct 2024 22:10:37 +0530 Subject: [PATCH 131/135] Fix Typo: Change 'dashaboard' to 'dashboard' on APM-service Dashboards page #195773 (#196969) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Title:** Fix Typo: Change 'dashaboard' to 'dashboard' on APM-service Dashboards page **Description:** This PR fixes a typo on the "Dashboards" page for APM-service. The typo "dashaboard" has been corrected to "dashboard" to ensure proper functionality and readability. closes #195773 **Changes Made:** - Corrected the typo in the text "To get started, add your dashaboard" to "To get started, add your dashboard." **Testing:** - Verified the change on the Dashboards page for APM-service. - Ensured no other instances of the typo exist in the codebase. **Release note:** Fixes a typo on the "Dashboards" page for APM-service, changing 'dashaboard' to 'dashboard'. **Additional Notes:** No additional notes. ## Summary Summarize your PR. If it involves visual changes include a screenshot or gif. ### 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) - [ ] [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 - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] 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) - [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) ### 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#_add_your_labels) - [ ] This will appear in the **Release Notes** and follow the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Cauê Marcondes <55978943+cauemarcondes@users.noreply.github.com> Co-authored-by: Nathan L Smith Co-authored-by: jennypavlova --- .../components/app/service_dashboards/empty_dashboards.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/service_dashboards/empty_dashboards.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/service_dashboards/empty_dashboards.tsx index 9ce282d267f11..9b7ace008206b 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/service_dashboards/empty_dashboards.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/service_dashboards/empty_dashboards.tsx @@ -59,7 +59,7 @@ export function EmptyDashboards({ actions }: Props) {

{i18n.translate('xpack.apm.serviceDashboards.emptyBody.getStarted', { - defaultMessage: 'To get started, add your dashaboard', + defaultMessage: 'To get started, add your dashboard', })}

From 769f07a3348b24a88a201727c536618e80eb69c4 Mon Sep 17 00:00:00 2001 From: Timothy Sullivan Date: Fri, 25 Oct 2024 15:48:09 -0700 Subject: [PATCH 132/135] Remove features visible column --- .../spaces_grid/spaces_grid_page.test.tsx | 38 ------------- .../spaces_grid/spaces_grid_page.tsx | 56 +------------------ 2 files changed, 2 insertions(+), 92 deletions(-) diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx index 169f12c3487c4..0dac62f0207b0 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.test.tsx @@ -413,44 +413,6 @@ describe('SpacesGridPage', () => { }); }); - it(`renders the 'Features visible' column when not serverless`, async () => { - const httpStart = httpServiceMock.createStartContract(); - httpStart.get.mockResolvedValue([]); - - const error = new Error('something awful happened'); - - const notifications = notificationServiceMock.createStartContract(); - - const wrapper = shallowWithIntl( - Promise.reject(error)} - notifications={notifications} - getUrlForApp={getUrlForApp} - history={history} - capabilities={{ - navLinks: {}, - management: {}, - catalogue: {}, - spaces: { manage: true }, - }} - allowSolutionVisibility - {...spacesGridCommonProps} - /> - ); - - // allow spacesManager to load spaces and lazy-load SpaceAvatar - await act(async () => {}); - wrapper.update(); - - expect(wrapper.find('EuiInMemoryTable').prop('columns')).toContainEqual( - expect.objectContaining({ - field: 'disabledFeatures', - name: 'Features visible', - }) - ); - }); - it(`does not render the 'Features visible' column when serverless`, async () => { const httpStart = httpServiceMock.createStartContract(); httpStart.get.mockResolvedValue([]); diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx index 586992c1b6b48..5394aedc3128c 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx @@ -18,7 +18,6 @@ import { EuiPageHeader, EuiPageSection, EuiSpacer, - EuiText, useIsWithinBreakpoints, } from '@elastic/eui'; import React, { Component, lazy, Suspense } from 'react'; @@ -36,17 +35,12 @@ import { reactRouterNavigate } from '@kbn/kibana-react-plugin/public'; import { addSpaceIdToPath, type Space } from '../../../common'; import { isReservedSpace } from '../../../common'; -import { - DEFAULT_SPACE_ID, - ENTER_SPACE_PATH, - SOLUTION_VIEW_CLASSIC, -} from '../../../common/constants'; +import { DEFAULT_SPACE_ID, ENTER_SPACE_PATH } from '../../../common/constants'; import { getSpacesFeatureDescription } from '../../constants'; import { getSpaceAvatarComponent } from '../../space_avatar'; import { SpaceSolutionBadge } from '../../space_solution_badge'; import type { SpacesManager } from '../../spaces_manager'; import { ConfirmDeleteModal, UnauthorizedPrompt } from '../components'; -import { getEnabledFeatures } from '../lib/feature_utils'; // No need to wrap LazySpaceAvatar in an error boundary, because it is one of the first chunks loaded when opening Kibana. const LazySpaceAvatar = lazy(() => @@ -255,8 +249,7 @@ export class SpacesGridPage extends Component { }; public getColumnConfig() { - const { activeSpace, features } = this.state; - const { solution: activeSolution } = activeSpace ?? {}; + const { activeSpace } = this.state; const config: Array> = [ { @@ -336,51 +329,6 @@ export class SpacesGridPage extends Component { }, ]; - const shouldShowFeaturesColumn = - !this.props.isServerless && (!activeSolution || activeSolution === SOLUTION_VIEW_CLASSIC); - if (shouldShowFeaturesColumn) { - config.push({ - field: 'disabledFeatures', - name: i18n.translate('xpack.spaces.management.spacesGridPage.featuresColumnName', { - defaultMessage: 'Features visible', - }), - sortable: (space: Space) => { - return getEnabledFeatures(features, space).length; - }, - render: (_disabledFeatures: string[], rowRecord: Space) => { - const enabledFeatureCount = getEnabledFeatures(features, rowRecord).length; - if (enabledFeatureCount === features.length) { - return ( - - ); - } - if (enabledFeatureCount === 0) { - return ( - - - - ); - } - return ( - - ); - }, - }); - } - config.push({ field: 'id', name: i18n.translate('xpack.spaces.management.spacesGridPage.identifierColumnName', { From e890e574d297057b54bd31655cb8a15b580676ff Mon Sep 17 00:00:00 2001 From: Timothy Sullivan Date: Fri, 25 Oct 2024 15:48:38 -0700 Subject: [PATCH 133/135] Remove identifier column --- .../management/spaces_grid/spaces_grid_page.tsx | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx index 5394aedc3128c..af71eb7feaa25 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx @@ -35,7 +35,7 @@ import { reactRouterNavigate } from '@kbn/kibana-react-plugin/public'; import { addSpaceIdToPath, type Space } from '../../../common'; import { isReservedSpace } from '../../../common'; -import { DEFAULT_SPACE_ID, ENTER_SPACE_PATH } from '../../../common/constants'; +import { ENTER_SPACE_PATH } from '../../../common/constants'; import { getSpacesFeatureDescription } from '../../constants'; import { getSpaceAvatarComponent } from '../../space_avatar'; import { SpaceSolutionBadge } from '../../space_solution_badge'; @@ -329,20 +329,6 @@ export class SpacesGridPage extends Component { }, ]; - config.push({ - field: 'id', - name: i18n.translate('xpack.spaces.management.spacesGridPage.identifierColumnName', { - defaultMessage: 'Identifier', - }), - sortable: true, - render(id: string) { - if (id === DEFAULT_SPACE_ID) { - return ''; - } - return id; - }, - }); - if (this.props.allowSolutionVisibility) { config.push({ field: 'solution', From e477ac251b869dcbaed6a3b5e0bc0377439e3051 Mon Sep 17 00:00:00 2001 From: Timothy Sullivan Date: Fri, 25 Oct 2024 16:17:24 -0700 Subject: [PATCH 134/135] fix vertical alignment of non-current space name in table --- .../public/management/spaces_grid/spaces_grid_page.tsx | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx index af71eb7feaa25..d69ba2b04a312 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx @@ -18,7 +18,6 @@ import { EuiPageHeader, EuiPageSection, EuiSpacer, - useIsWithinBreakpoints, } from '@elastic/eui'; import React, { Component, lazy, Suspense } from 'react'; @@ -277,15 +276,8 @@ export class SpacesGridPage extends Component { render: (value: string, rowRecord: Space) => { const SpaceName = () => { const isCurrent = this.state.activeSpace?.id === rowRecord.id; - const isWide = useIsWithinBreakpoints(['xl']); - const gridColumns = isCurrent && isWide ? 2 : 1; return ( - + Date: Fri, 25 Oct 2024 16:17:27 -0700 Subject: [PATCH 135/135] --wip-- [skip ci] --- .../public/management/spaces_grid/spaces_grid_page.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx index d69ba2b04a312..8bce2d6fe2a9d 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx @@ -308,7 +308,7 @@ export class SpacesGridPage extends Component { return ; }, 'data-test-subj': 'spacesListTableRowNameCell', - width: '15%', + width: '20%', }, { field: 'description', @@ -317,7 +317,7 @@ export class SpacesGridPage extends Component { }), sortable: true, truncateText: true, - width: '45%', + width: '40%', }, ]; @@ -331,6 +331,7 @@ export class SpacesGridPage extends Component { render: (solution: Space['solution'], record: Space) => ( ), + width: '10%', }); }